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的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助理解 Cursor for loop

CURSOR FOR LOOP 返回的查询数据

带有游标参数 (LOOP FETCH) 和 For 循环子查询的 PL/SQL 查询出错

PL/SQL loop循环详解

Oracle PL/SQL之LOOP循环控制语句

如何在 PL/SQL 中使用 FOR LOOP 从具有相同标签的 xml clob 中提取值