2

プロシージャ (入力パラメーターを受け取る; カーソル名) と 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 Is they a way out from this

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;

caseいずれにせよ、if;よりも ; を好むかもしれません。特に、表現できるカーソルの数が増える場合typ

于 2013-09-30T16:26:28.877 に答える