这是程序,
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行。令人惊讶的是,cursor中的查询总是返回5行,不管条件c.PERIODE = period AND c.AGENCYNO = agencyNo是否通过。这显然意味着这个查询,
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,完全没有考虑。知道怎么回事吗?
发布于 2010-12-03 07:59:45
您的一个参数与列的名称相同: AGENCYNO。由于作用域的工作方式,此计算结果为1=1。这就是为什么给参数提供唯一的名称是很好的做法,例如,在参数前面加上p_。
你应该找到
AND c.PERIODE = p_period AND c.AGENCYNO = p_agencyNo返回所需的一行。严格地说,您不需要将period的名称更改为p_period,因为它已经与periode区别开来。但是一致性在软件工程中是一种美德。
https://stackoverflow.com/questions/4343487
复制相似问题