RefCursorを返すストアドプロシージャを実行し、そのRefCursorを使用してデータを一時テーブルに挿入しようとする単純な関数があります。そうしようとすると、次のエラーが発生します。
SQL Error: ORA-00947: not enough values
refcursorは、一時テーブルとまったく同じ数の値、正しい列名、それらの順序、およびそれらのタイプを返すことを知っています。実行print RefCursor
すると、すべてのデータが表示されます。コードは次のとおりです。
var r refcursor;
EXEC SCHEMA.PACKAGE.SPROC(:r);
insert into SCHEMA.TEMP_TABLE
values
(r);
正しい型を返すように、ストアドプロシージャにOUTパラメータとして定義されたrefcursorがあることを追加する必要があります。を使用print r;
すると、正しいデータが印刷されます。
私は何が間違っているのですか?
編集:提案に基づいて、行タイプ変数へのフェッチを使用しようとしましたが、行をフェッチしようとすると無効な数値例外が発生します:
DECLARE
cur SYS_refcursor;
rec SCHEMA.TEMP_TABLE%rowtype;
begin
SCHEMA.PACKAGE.SPROC( cur );
LOOP
FETCH cur INTO rec;
EXIT WHEN cur%NOTFOUND;
INSERT INTO SCHEMA.TEMP_TABLE
VALUES rec;
END LOOP;
EXCEPTION
WHEN INVALID_NUMBER THEN
DBMS_output.put_line(rec.move_id);
end;
例外ブロックを追加して、どの行が失敗しているかを確認しました。言うまでもなく、それが最初の行です。私が実行するストアドプロシージャは、複数のテーブルからのselectクエリのrefcursorを返します。refcursor列とそのタイプの正確なコピーとして定義された一時テーブル。何が例外を引き起こしているのかわからない。