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部分根本没有考虑过.知道出了什么问题吗?
您的一个参数与列名称相同:AGENCYNO.由于范围界定的工作方式,评估为1=1.这就是为什么提供参数唯一名称的好习惯,例如通过预先添加它们p_.
你应该找到
AND c.PERIODE = p_period AND c.AGENCYNO = p_agencyNo
Run Code Online (Sandbox Code Playgroud)
返回所需的一行.严格来说,你不需要更改的名称period来p_period因为它已经从区分periode.但一致性是软件工程的一个优点.
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |