Oracle 从变量传递游标名称

Oracle 从变量传递游标名称,oracle,Oracle,我有一个包,其中包含一个过程(接受一个输入参数;游标名称)和两个游标。 该过程使用输入参数指定的光标 PROCEDURE insertdetails(typ IN VARCHAR2) IS BEGIN OPEN typ; LOOP FETCH typ INTO colA; EXIT WHEN typ%notfound; --MISSING CODE END LOOP; END; 如果我运行程序并将cursor的名称作为

我有一个包,其中包含一个过程(接受一个输入参数;游标名称)和两个游标。 该过程使用输入参数指定的光标

  PROCEDURE insertdetails(typ IN VARCHAR2) IS  
  BEGIN
    OPEN typ;
    LOOP
      FETCH typ INTO colA;
      EXIT WHEN typ%notfound;
      --MISSING CODE
    END LOOP;
  END;
如果我运行程序并将cursor的名称作为输入参数传递,我会得到错误PLS-00456:项目“TYP”不是光标
它们是否是解决此问题的方法

您需要使用REF游标来完成此操作

您的过程定义如下所示:

PROCEDURE insertdetails(typ IN sys_refcursor) IS  

在此过程中,您可能不会打开游标,通常在定义游标的代码中的其他位置打开它。

假设游标在包中的其他位置声明,您可以使用参数决定使用哪个实际游标,例如:

PROCEDURE insertdetails(typ IN VARCHAR2) IS  
BEGIN
  IF typ = 'CURSOR_A' THEN
    OPEN cursor_a;
    LOOP
      FETCH cursor_a INTO colA;
      EXIT WHEN cursor_a%notfound;
      --MISSING CODE
    END LOOP;
  ELSE
    OPEN cursor_b;
    LOOP
      FETCH cursor_b INTO colA;
      EXIT WHEN cursor_b%notfound;
      --MISSING CODE
    END LOOP;
  END IF;
END;
或者,如果丢失的代码很常见,很可能:

PROCEDURE insertdetails(typ IN VARCHAR2) IS  
BEGIN
  IF typ = 'CURSOR_A' THEN
    OPEN cursor_a;
  ELSE
    OPEN cursor_b;
  END IF;

  LOOP
    IF typ = 'CURSOR_A' THEN
      FETCH cursor_a INTO colA;
      EXIT WHEN cursor_a%notfound;
   ELSE
      FETCH cursor_b INTO colA;
      EXIT WHEN cursor_b%notfound;
   END IF;
    --MISSING CODE
  END LOOP;
END;

无论哪种方式,您可能更喜欢
案例
而不是
if
;特别是如果
typ
可以表示的可能游标的数量增加。

我认为您无法做到这一点。您可以传入一个sql语句,如果有帮助的话,您可以执行它?你能提供你正在传递的游标的详细信息吗?两个游标从相同的表中选取相同数量的记录,但每个游标的条件不同。然后,程序将插入这些记录。