我在光标循环中遇到问题
我有多个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
但是,当它运行查询时我得到一般异常,我不知道为什么。任何帮助将不胜感激!
答案 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语句,只需在循环中使用游标,它将自动打开和关闭。
有必要警惕我在代码中注意到的一些问题制定者:
不需要声明循环变量。从声明部分删除它 - 只需在FOR-LOOP
。
从外部上下文传递变量ln_page
应该由严格cursor parameter passing修复。
rownum(AND rownum >= ln_page
)的下边框将无法正常工作。在Oracle 12c上使用LIMIT ROWS
子句,否则需要带行号的内联视图。两种情况都特别描述here。