【问题标题】:PL SQL - for loop through cursorPL SQL - for 循环游标
【发布时间】:2017-06-09 16:08:28
【问题描述】:

我在循环光标时遇到问题

我有多个 location_name 条目,我尝试一次显示 5 个,并将其设置为 look_item_cursor。

CURSOR look_item_cursor IS

  SELECT *
    FROM (SELECT DISTINCT location_name
            FROM inventory_info_v i
           WHERE i.item_code = lr_item.item_code) a
   WHERE rownum <= (ln_page + 4)
     AND rownum >= ln_page;

原始查询返回数据就好了。 调用光标时,ln_page 和 lr_item.item_code 都已填充。

我尝试检索 5 个返回的 location_name 中的每一个,一次一个,使用

OPEN look_item_cursor;
      BEGIN
        FOR lv_location_name IN look_item_cursor LOOP
          pv_message_return := pv_message_return ||
                               lv_location_name.location_name;
        END LOOP;
      END;
CLOSE look_item_cursor;   

将 lv_location_name 分配为

look_item_cursor%ROWTYPE

但是,当它通过查询运行时,我遇到了一般异常,我不知道为什么。任何帮助将不胜感激!

【问题讨论】:

  • 发布完整的堆栈跟踪。
  • 如果您使用 cursor FOR 循环(就像您在示例中尝试做的那样),那么 1. 不要显式打开游标(cursor FOR 循环会为您执行此操作); 2.不要像你所说的那样显式声明游标循环变量lv_location_name变量(游标FOR循环为你做)。因此,您要么显式使用游标(显式打开、获取和关闭),要么使用游标FOR 循环,它为您完成大部分工作(打开游标、声明游标变量、获取和关闭游标)。
  • 非常有帮助,谢谢。对于这种类型的循环,我是否需要包含“退出时间”?我问是因为它在分配第 5 个和最后一个条目时出错 编辑:没关系,那是愚蠢的。非常感谢

标签: oracle for-loop plsql cursor


【解决方案1】:

来自oradoc

光标 FOR LOOP 语句
游标 FOR LOOP 语句将其循环索引隐式声明为指定游标返回的行类型的记录变量,然后打开游标。每次迭代时,游标 FOR LOOP 语句从结果集中取出一行到记录中。当没有更多行要获取时,游标 FOR LOOP 语句将关闭游标。如果循环内的语句将控制转移到循环外或引发异常,游标也会关闭。

尝试这样的事情(用in (...) loop)中的查询替换测试数据:

begin
    for row_ in (
        select 1 id, 'item 1' name from dual union all      
        select 2 id, 'item 2' name from dual union all      
        select 3 id, 'item 3' name from dual 
        ) loop
        dbms_output.put_line('id:'||row_.id||' name:'||row_.name);
    end loop;
end; 

-- dbms output
id:1 name:item 1
id:2 name:item 2
id:3 name:item 3

【讨论】:

    【解决方案2】:

    此代码使光标打开两次:

    • 明确在OPEN look_item_cursor
    • 隐式初始化FOR-LOOP

    我想你得到ORA-06511: PL/SQL Cursor already open 异常。 为了避免它 - 删除 OPEN 和 CLOSE 语句,只需在循环中使用游标,它将自动打开和关闭。


    有必要警惕我在代码中注意到的一些问题制造者:

    1. 不需要声明循环变量。从声明部分删除它 - 只需在 FOR-LOOP 本地使用它。

    2. 从外部上下文传递变量ln_page 应由严格的cursor parameter passing 修复。

    3. rownum (AND rownum &gt;= ln_page) 的下边框无法按预期工作。在 Oracle 12c 上使用 LIMIT ROWS 子句,否则需要带有行号的内联视图。这两种情况都特别描述here

    【讨论】:

    • 这是根据@Nicholas Krasnov 的评论解决的。很有帮助,谢谢
    猜你喜欢
    • 2012-03-27
    • 2012-04-28
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多