【问题标题】:Oracle: Cursor in a ProcedureOracle:过程中的光标
【发布时间】:2016-01-27 02:43:58
【问题描述】:

请帮助我解决我的 Oracle 程序问题。在我的包中,我有一个过程,我想声明一个使用动态查询的游标。

type DocList IS REF CURSOR;
curDocList DocList;
.
.
.
OPEN curDocList FOR v_sql;   --v_sql has dynamic sql
...
FOR recDocStatusList IN curDocList 
      LOOP

当我尝试使用 - FOR recDocStatusList IN curDocList 时,它给了我错误:[错误] PLS-00221 (2262: 34): PLS-00221: 'CURDOCLIST' 不是过程或未定义。

请帮我纠正问题。

【问题讨论】:

    标签: oracle stored-procedures cursor package


    【解决方案1】:

    如果你愿意迭代游标,你可以在不使用 FOR 循环的情况下执行它。

    选项 1:

      LOOP
        FETCH curDocList INTO recDocStatusList;
        EXIT WHEN curDocList%NOTFOUND;
        ...
      END LOOP;
    

    选项 2:

    FETCH curDocList INTO recDocStatusList;
    WHILE (curDocList%FOUND)
    LOOP
        ...
        FETCH curDocList INTO recDocStatusList;
    END LOOP;
    

    一些注释:

    • 记得先声明recDocStatusList。
    • 这两个选项都在 OPEN ... FOR 行之后。
    • 别忘了在最后关闭光标。

    【讨论】:

    • 谢谢 Neria。首先,编译错误是说“CURDOCLIST”不是一个过程。那么上述循环样式的改变会有帮助吗?
    • 是的,异常描述没有正确反映原因。正如 Tom Kyte 在this article 中所说,“您只能隐式循环未打开的游标”,并且由于应该打开 REF CURSOR,因此它不起作用。 “引用游标始终是显式游标”。
    • 是的,因此您还应该显式地获取和关闭游标。因此,在我的示例中,我获取了它。不要忘记在循环后关闭它。
    • 好的,我会尝试...一个快速的问题。我还没有声明recDocStatusList。这是正确的:声明中的“recDocStatusList DocList”
    • 你没有贴,应该是v_sql ROWTYPE的记录。编辑:不,这是不正确的。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多