【问题标题】:Alternative way of storing multiple cursors using the same variable使用相同变量存储多个游标的替代方法
【发布时间】:2023-02-23 04:14:42
【问题描述】:

我只想在我的 pl/sql 代码中使用一次“For Loop”。假设我有 2 个(或更多)游标。例如,如何使用 IF 语句使其动态化,以选择要在该“For 循环”中运行的游标?

尝试使用相同的变量存储两个游标结果,但显然这行不通,因为你不能把它命名为同一个变量.但我的意图是像这样使用它:

 If color_input = 'GREEN' Then toy_rec := cursr_greens
 If color_input = 'BLUE' Then toy_rec := cursr_blues
 Else NULL
 end if;

 For cursr in toy_rec LOOP

我知道可以用另一种方式实现这一点,但我的目的是在现有代码中添加尽可能少的代码(我不想重复这个过程,等等)

想法?

【问题讨论】:

  • 什么样的游标 - 它们是如何定义的?它们是否具有相同的列和数据类型?你能用一个参数化游标代替吗?
  • 是的,它们具有完全相同的列和数据类型——我将其定义为集合类型(表类型)。我们可能需要添加不同的人群,所以我认为单参数游标可能会变得过于复杂。我会尝试 Paul 建议的 ref cursor。谢谢!
  • 您不能像这样交换静态游标。您可以使用 UNION ALL 创建一个游标并在运行时使用参数选择其中的一层吗?

标签: sql oracle for-loop plsql


【解决方案1】:

您可以使用 REF CURSOR 执行此操作:

DECLARE
  mycur sys_refcursor;
  color_input varchar2(10) := 'GREEN';
  var_dummy varchar2(10);
BEGIN
  IF color_input = 'GREEN'
  THEN
    OPEN mycur FOR SELECT 'foo' FROM dual;
  ELSE
    OPEN mycur FOR SELECT 'bar' FROM dual;
  END IF;
  
  FETCH mycur INTO var_dummy;
  
  WHILE mycur%FOUND
  LOOP
    dbms_output.put_line(var_dummy);
    FETCH mycur INTO var_dummy;
  END LOOP;
  
  CLOSE mycur;
END;

【讨论】:

  • 这看起来很有希望,谢谢!我会试试这个!
  • 不幸的是,如果我的游标返回一个集合,这将不起作用。如果是这种情况,有什么解决方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多