2010-12-03 65 views
1

下面是该过程,甲骨文光标不按预期工作

CREATE OR REPLACE PROCEDURE provsnXmlCmprsn (
      encyNo SAS_PRO_CTL.AGENCYNO%TYPE, period SAS_PRO_CTL.PERIODE%TYPE) IS 

xmlContent SAS_PRO_XML.XMLCONTENT%TYPE; 
sasProvisionId SAS_PRO_CTL.SASPROVISIONID%TYPE; 

CURSOR crsrXml IS 
SELECT XMLCONTENT, c.SASPROVISIONID FROM SAS_PRO_XML x, SAS_PRO_CTL c 
    WHERE x.SASPROVISIONID = c.SASPROVISIONID AND c.PERIODE = period 
            AND c.AGENCYNO = agencyNo ORDER BY XMLLINENO; 

BEGIN 
DBMS_OUTPUT.put_line('Params: ' || agencyNo || ', ' || period); 

OPEN crsrXml; 
LOOP 
    FETCH crsrXml INTO xmlContent, sasProvisionId; 
    EXIT WHEN crsrXml%NOTFOUND; 
    DBMS_OUTPUT.put_line('XML Content Length: ' || LENGTH(xmlContent)); 
END LOOP; 
CLOSE crsrXml; 

END provsnXmlCmprsn; 

查询在cursor被检索5行,而1列的预期,根据条件和参数值。单独运行时,相同的查询会生成1行。令人惊讶的是,无论条件c.PERIODE = period AND c.AGENCYNO = agencyNo是否通过,cursor中的查询总是返回5行。这显然意味着,该查询,

SELECT XMLCONTENT, c.SASPROVISIONID FROM SAS_PRO_XML x, SAS_PRO_CTL c 
    WHERE x.SASPROVISIONID = c.SASPROVISIONID AND c.PERIODE = period 
            AND c.AGENCYNO = agencyNo ORDER BY XMLLINENO; 

与此查询,

SELECT XMLCONTENT, c.SASPROVISIONID FROM SAS_PRO_XML x, SAS_PRO_CTL c 
    WHERE x.SASPROVISIONID = c.SASPROVISIONID ORDER BY XMLLINENO; 

都表现的cursor内相同。这个,AND c.PERIODE = period AND c.AGENCYNO = agencyNo,部分根本没有考虑。 任何想法发生了什么问题?

回答

5

其中一个参数与列名称相同:AGENCYNO。由于范围界定的工作方式,评估结果为1=1。这就是为什么给参数指定唯一的名称是一种很好的做法,例如将它们预先设置为p_

您应该发现

AND c.PERIODE = p_period AND c.AGENCYNO = p_agencyNo 

返回所需的一行。严格地说,您不需要将period的名称更改为p_period,因为它已与periode区分开来。但一致性在软件工程中是一种优点。

+0

APC打败了我。他现在显然比我更加含咖啡因。 – 2010-12-03 08:02:17