从变量传递游标名称

时间:2013-09-30 16:07:48

标签: oracle

我有一个包含一个过程(带一个输入参数;游标名称)和两个游标的包。 该过程是使用输入参数

指定的游标
  PROCEDURE insertdetails(typ IN VARCHAR2) IS  
  BEGIN
    OPEN typ;
    LOOP
      FETCH typ INTO colA;
      EXIT WHEN typ%notfound;
      --MISSING CODE
    END LOOP;
  END;

如果我运行程序并传递cusrsor的名称作为输入参数我得到错误PLS-00456:item'TYP'不是游标 他们是出路吗?

2 个答案:

答案 0 :(得分:2)

您需要使用REF CURSORS来执行此操作。 Here's a pretty good explanation

您的程序定义如下:

PROCEDURE insertdetails(typ IN sys_refcursor) IS  

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

答案 1 :(得分:0)

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

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;

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