首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle游标未按预期工作

Oracle游标未按预期工作
EN

Stack Overflow用户
提问于 2010-12-03 07:52:36
回答 1查看 2K关注 0票数 1

这是程序,

代码语言:javascript
复制
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是否通过。这显然意味着这个查询,

代码语言:javascript
复制
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;

这个问题,

代码语言:javascript
复制
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,完全没有考虑。知道怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-03 07:59:45

您的一个参数与列的名称相同: AGENCYNO。由于作用域的工作方式,此计算结果为1=1。这就是为什么给参数提供唯一的名称是很好的做法,例如,在参数前面加上p_

你应该找到

代码语言:javascript
复制
AND c.PERIODE = p_period AND c.AGENCYNO = p_agencyNo

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4343487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档