私のパッケージ仕様では、次のように記述しました。
type table_info is record (table_name varchar2(20), col_info c_info);
私の体の宣言ゾーンには、次のものがあります。
t_info table_info := table_info();
コンパイルすると、次のようになります。
エラー: PLS-00222: 'TABLE_INFO' という名前の関数がこのスコープに存在しません
間違いは何ですか?
レコード型の変数を初期化する必要はありません:
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 コレクションのドキュメントを参照してください。