1

REFCURSOR を受け取り、何らかのデータ操作を実行する関数を実行しようとしています。

私の機能をテストするために、私はこのSQL/PLUSコードを持っています:

var some_cursor REFCURSOR;

exec :some_cursor := SCHEMA.test_getcursor;

print some_cursor;

variable res varchar2;

exec :res := SCHEMA.second_function(:some_cursor, 'Other_parameter');

print res;  

ここで、最初のtest_getcursor関数は、カーソルを開き、選択クエリを実行してカーソルを返す単純な関数です。それはうまく機能し、印刷some_cursorもうまくいきます。

second_functionを呼び出してrefcursorを渡すと、問題が発生します。

関数には次のコードがあります。

type cursor_row
IS RECORD
(field_1 some_field1%type,
 field_2 some_field2%type,
 field_3 some_field3%type);

 new_row cursor_row;

BEGIN
LOOP
fetch PASSED_IN_REFCURSOR INTO new_row --this is where the function fails
...data manipulation...
EXIT WHEN PASSED_IN_REFCURSOR%NOTFOUND;
END LOOP;
CLOSE PASSED_IN_REFCURSOR;
END;

私が得ているエラーはですInvalid Cursor

作成した型には、参照カーソルと同じ行数と同じデータ型があると確信しています。

この場合、何が間違っていますか?Oracle 10g、PL/SQL 10.2 を使用しています

4

1 に答える 1

3

これはあなたの問題です:

print some_cursor;

それを除く。カーソルを印刷することで、すべてのレコードを取得して閉じました。そのため、2 番目の関数はそれを読み取ることができなくなります。

例えば;

SQL> create procedure two(p_rc sys_refcursor)
  2  is
  3    v_col varchar2(1);
  4  begin
  5    loop
  6      fetch p_rc into v_col;
  7      exit when p_rc%notfound;
  8      dbms_output.put_line(v_col);
  9    end loop;
 10  end;
 11  /

Procedure created.

SQL> set serverout on
SQL> var rc refcursor;
SQL> exec :rc := one;

PL/SQL procedure successfully completed.

SQL> exec two(:rc);
X

PL/SQL procedure successfully completed.

SQL> var rc refcursor;
SQL> exec :rc := one;

PL/SQL procedure successfully completed.

SQL> print rc

D
-
X

SQL> exec two(:rc);
BEGIN two(:rc); END;

*
ERROR at line 1:
ORA-01001: invalid cursor
ORA-06512: at "TEST.TWO", line 6
ORA-06512: at line 1

カーソルが開いていないため、フェッチ時に爆発します。%isopenより有用なエラーを返したい場合は、最初にチェックして定義済みのエラーを発生させる必要があります。

于 2013-02-27T16:41:08.740 に答える