Oracle游标未按预期工作

Ade*_*ari 1 oracle plsql stored-procedures cursor oracle10g

这是程序,

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;
Run Code Online (Sandbox Code Playgroud)

cursor根据条件和参数值,查询中的查询是5行,而预期是1行.当独立运行时,相同的查询会产生1行.令人惊讶的是,cursor无论条件是否c.PERIODE = period AND c.AGENCYNO = agencyNo通过,查询总是返回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;
Run Code Online (Sandbox Code Playgroud)

而这个查询,

SELECT XMLCONTENT, c.SASPROVISIONID FROM SAS_PRO_XML x, SAS_PRO_CTL c
  WHERE x.SASPROVISIONID = c.SASPROVISIONID ORDER BY XMLLINENO;
Run Code Online (Sandbox Code Playgroud)

内部表现相同cursor.这个AND c.PERIODE = period AND c.AGENCYNO = agencyNo部分根本没有考虑过.知道出了什么问题吗?

APC*_*APC 5

您的一个参数与列名称相同:AGENCYNO.由于范围界定的工作方式,评估为1=1.这就是为什么提供参数唯一名称的好习惯,例如通过预先添加它们p_.

你应该找到

AND c.PERIODE = p_period AND c.AGENCYNO = p_agencyNo
Run Code Online (Sandbox Code Playgroud)

返回所需的一行.严格来说,你不需要更改的名称periodp_period因为它已经从区分periode.但一致性是软件工程的一个优点.

  • @JustinCave - 实际上当天的第一杯茶是在桌子上冷却下来的;) (2认同)