PL SQL - 用于循环游标

时间:2017-06-09 16:08:29

标签: oracle for-loop plsql cursor

我在光标循环中遇到问题

我有多个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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

此代码使光标打开两次:

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

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

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

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

  2. 中本地使用它
  3. 从外部上下文传递变量ln_page应该由严格cursor parameter passing修复。

  4. rownum(AND rownum >= ln_page)的下边框将无法正常工作。在Oracle 12c上使用LIMIT ROWS子句,否则需要带行号的内联视图。两种情况都特别描述here