3

これを解決するためにここで多くの解決策を見てきましたが、それらはかなり進んでいますが、今では乗り越えられないように見えるいくつかのエラーについて雑草の中にいます。

私はOracle 11gを使用しています。レコード セット (テーブル) を返す関数が必要です。私が使用しているコードは次のとおりです。

CREATE TYPE T_TABLE IS OBJECT
(
    Field1 int
    , Field2 int
);

CREATE TYPE T_TABLE_COLL IS TABLE OF T_TABLE;

CREATE OR REPLACE FUNCTION FN_MyFunction
RETURN T_TABLE_COLL 
IS
BEGIN
  FOR I IN (SELECT Field1, Field2 FROM Table1) LOOP
    IF I.Field1 = 1 THEN
        BEGIN           
            INSERT INTO T_TABLE     
            SELECT Field1, Field2
            FROM Table2
            WHERE Field2 = I.Field2;
        END;
    ELSIF I.Field1 = 2 THEN
        BEGIN           
            INSERT INTO T_TABLE     
            SELECT Field1, Field2
            FROM Table2
            WHERE Field2 = I.Field2;
        END;  
  END IF;
  END LOOP;
  RETURN T_SMRYACCT_TABLE_COLL;
END;

これから受け取るエラーは次のとおりです。

  1. FUNCTION FN_MyFunction 行と PL/SQL でステートメントが無視されます: ORA-04044: プロシージャ、関数、パッケージ、またはタイプはここでは各行 INSERT INTO T_TABLE_COLL 行で許可されていません

  2. PLS-00330: RETURN行でのタイプ名またはサブタイプ名の使用が無効です

テーブルの種類で何が間違っていますか?

4

1 に答える 1

5

T_TABLE_COLLコレクションです。コレクションに対して挿入を使用することはできません。

CREATE OR REPLACE FUNCTION FN_MyFunction
RETURN T_TABLE_COLL
IS
  l_res_coll T_TABLE_COLL;
  l_index number;
BEGIN
  l_res_coll := T_TABLE_COLL();
  FOR I IN (SELECT col1, col2 FROM Table1)
  LOOP
    IF I.col1 = 1 THEN
      l_res_coll.extend;
      l_index := l_res_coll.count;  
      l_res_coll(l_index):= T_TABLE(i.col1, i.col2);
    END IF;
  END LOOP;
  return l_res_coll;
END;

動作中の機能

select *
  from table(FN_MyFunction())

コレクションとは何か、およびそれらの使用方法について詳しくは、これをお読みください。

于 2012-09-09T12:10:04.943 に答える