2

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

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

如果我运行该过程并将光标的名称作为输入参数传递,我会收到错误 PLS-00456: item 'TYP' is not a cursor 这是他们的出路吗

4

2 回答 2

2

您将需要使用 REF CURSORS 来执行此操作。 这是一个很好的解释

您的过程定义如下所示:

PROCEDURE insertdetails(typ IN sys_refcursor) IS  

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

于 2013-09-30T16:24:29.600 回答
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;

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

于 2013-09-30T16:26:28.877 回答