web-dev-qa-db-ja.com

Oracle:OPEN-FOR-USINGステートメントを使用するときにカーソルの行数を取得する

Oracleプロシージャ内で、selectステートメントのカーソルを開いた後、フェッチされた行数をカウントする平均を見つけることができません。

OPEN mycursor FOR
SELECT * FROM TABLE;

-- mycursor%ROWCOUNT is always set to 0, even if the cursor has rows.
IF mycursor%ROWCOUNT = 0
THEN
  <error processing code here>
END IF;

OracleのドキュメントWebサイト に記載されているように、これは予期された動作です。

OPEN-FOR-USINGステートメントは、カーソル変数をクエリに関連付け、クエリを実行し、結果セットを識別し、結果セットの最初の行の前にカーソルを配置し、その後、行をゼロにします- %ROWCOUNTによって保持される処理済みカウント。

それで、2番目の冗長な「テーブルからselect count(*)」を実行することを除いて、カーソル内の行数を調べる他の方法はありますか?

EDIT#1:カーソルのロード後にループしていません。呼び出し元のプロシージャにそのまま返されます。ただし、行がない場合は例外を発生させる必要があります。これらは仕様です。

1
Hans Deragon

セットをループした後、ROWCOUNTチェックを実行します。カーソルにデータがなかった場合、ROWCOUNTは0のままです。次のようなFOR LOOP構文を使用できます。

OPEN ....

FOR ... IN mycursor
LOOP
    /* Process data here */
END LOOP:

IF mycursor%ROWCOUNT = 0 ...

CLOSE mycursor;
1
BillThor