0

私のパッケージ仕様では、次のように記述しました。

type table_info is record (table_name varchar2(20), col_info c_info);

私の体の宣言ゾーンには、次のものがあります。

t_info table_info := table_info();

コンパイルすると、次のようになります。

エラー: PLS-00222: 'TABLE_INFO' という名前の関数がこのスコープに存在しません

間違いは何ですか?

4

1 に答える 1

1

レコード型の変数を初期化する必要はありません:

SQL> DECLARE
  2     TYPE typ_rec IS RECORD (a NUMBER, b NUMBER);
  3     rec typ_rec;
  4  BEGIN
  5     rec.a := 1;
  6     rec.b := 2;
  7     dbms_output.put_line(rec.a + rec.b);
  8  END;
  9  /

3

PL/SQL procedure successfully completed

ただし、ネストされたレコードのテーブルを使用している場合は、コレクションを初期化する必要があります。

SQL> DECLARE
  2     TYPE typ_rec IS RECORD (a NUMBER, b NUMBER);
  3     TYPE typ_tab IS TABLE OF typ_rec;
  4     tab typ_tab := typ_tab(); -- initialization
  5  BEGIN
  6     tab.extend;
  7     tab(1).a := 1;
  8     tab(1).b := 2;
  9     dbms_output.put_line(tab(1).a + tab(1).b);
 10  END;
 11  /

3

PL/SQL procedure successfully completed

レコード型とコレクション型を混在させることができます (varray を初期化する必要はありません)。

SQL> DECLARE
  2     TYPE column_info IS RECORD(
  3        col_name  VARCHAR2(20),
  4        col_value VARCHAR2(1000)
  5     );
  6     TYPE c_info IS VARRAY(10) OF column_info;
  7     TYPE table_info IS RECORD(
  8        table_name VARCHAR2(20),
  9        col_info   c_info
 10     );
 11     l_table  table_info;
 12  BEGIN
 13     l_table.table_name := 'TABLE_NAME';
 14     l_table.col_info.extend;
 15     l_table.col_info(1).col_name := 'COL_NAME';
 16     l_table.col_info(1).col_value := 'COL_VALUE';
 17  END;
 18  /

PL/SQL procedure successfully completed

詳細については、PL/SQL コレクションのドキュメントを参照してください。

于 2013-03-06T13:07:42.457 に答える