pl sql cursor for loop in
Posted
技术标签:
【中文标题】pl sql cursor for loop in【英文标题】: 【发布时间】:2017-04-12 14:21:10 【问题描述】:我有两个游标,for循环应该根据状态使用游标。
CURSOR order_hist1 IS
SELECT id, ordernum, address FROM order_hist;
CURSOR order_hist2 IS
SELECT id, ordernum, address FROM order_hist_complete;
所以for循环应该使用游标order_hist2是变量status = 'COMPLETE' 否则使用 order_hist1
FOR aDistinctLine in -- LOOP
-- 300 lines code in this loop
END LOOP;
我不想使用 REF 光标
【问题讨论】:
好像已经回答了link Conditionally define a Cursor in Oracle的可能重复 【参考方案1】:你可以使用隐式for循环:
对于您的情况,使用UNION
(如果您需要处理重复项或性能原因,请使用UNION ALL
)将两个光标更改为一个看起来比较合适,如下所示:
FOR aDistinctLine in (
-- first cursor: status <> COMPLETE
SELECT id, ordernum, address FROM order_hist
WHERE status <> 'COMPLETE'
UNION
SELECT id, ordernum, address FROM order_hist_complete
WHERE status = 'COMPLETE'
) LOOP
-- do things with
-- aDistinctLine.id,
-- aDistinctLine.ordernum,
-- aDistinctLine.address
END LOOP;
那么最好让status
看起来像一个局部变量,例如叫它l_status
;我不得不说服自己在隐式 for 循环中使用 plsql 变量是可行的……我想我今天学到了一些东西!
declare
l_status varchar2(8) := 'COMPLETE';
begin
for x in (select 'realy?' val from dual where l_status = 'COMPLETE')
loop
dbms_output.put_line(x.val);
end loop;
l_status := 'graby';
for x in (select 'here: not complete' val from dual where l_status <> 'COMPLETE')
loop
dbms_output.put_line(x.val);
end loop;
end;
/
【讨论】:
另外,我认为,OP 可能有一个表说order
,它将存储变量status = complete
。
@SudiptaMondal - 问题说 status
是一个变量(尽管这确实假设表中的光标也没有具有该名称的列;您只能继续操作 OP 告诉的内容你虽然)。什么2000行?如果您愿意,您仍然可以通过这种方式使用单个显式游标 - 您甚至可以将状态变量作为形式参数传递...
@J.Chomel - 我很困惑;为什么程序的第二个选项是必要的? OP 的原始 300 行可以在您的第一个选项中进入单个循环,当然,...status 作为变量而不是列名没有任何区别,不是吗? (明确它是一个变量的命名约定会很好,但如果没有范围冲突,那就是一种装饰。)
@AlexPoole,编辑;我想我是最困惑的......我不知道它可以这样工作。所以我错了两次是对的。吓人的。
@user565992, status
不需要成为表格的一部分!查看我编辑的答案和一个片段,以测试它是否适用于局部变量。以上是关于pl sql cursor for loop in的主要内容,如果未能解决你的问题,请参考以下文章