3

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列とそのタイプの正確なコピーとして定義された一時テーブル。何が例外を引き起こしているのかわからない。

4

1 に答える 1

9

からテーブルに挿入することはできませんrefcursor。カーソルからフェッチしてテーブルに挿入するプロシージャを作成できます。schema.package.sprocの参照カーソルを返す場合は、次のtemp_table%rowtypeように実行できます。

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;
END;
于 2012-11-20T22:34:55.240 に答える