2

パッケージの仕様に次のタイプが定義されています

type column_info is record (col_name varchar2(20), col_value varchar2(1000));
type c_info is varray(10) of column_info;
type table_info is record (table_name varchar2(20), col_info c_info);

宣言部分のパッケージ本体に私が持っている

t_info table_info;

私が持っているパッケージ本体のプロシージャの内部

t_info:=null;
t_info.table_name:='gl_temp_report1';
t_info.col_info(1).col_name:='table_idx';
t_info.col_info.extend;
t_info.col_info(2).col_name:='table_row';
t_info.col_info.extend;
t_info.col_info(3).col_name:='table_row_detail';

パッケージのコンパイルが成功しても、実行時に例外 ORA-06531: Reference to uninitialized collection が発生します。
col_info コレクションを初期化するにはどうすればよいですか? t_info.col_info() を初期化しようとしましたが、このように「関数がありません」と表示されます。ティア、オーレル

4

3 に答える 3

3

初期化を実行するには、次のように、パッケージ本体に初期化ブロックを追加する必要があります。

CREATE OR REPLACE PACKAGE BODY your_package IS
  t_info  table_info;

  -- Whatever other procedure definitions, etc, are needed

BEGIN  -- package initialization
  t_info.table_name:='gl_temp_report1';
  t_info.col_info := c_info();
  t_info.col_info.extend;
  t_info.col_info(1).col_name:='table_idx';
  t_info.col_info.extend;
  t_info.col_info(2).col_name:='table_row';
  t_info.col_info.extend;
  t_info.col_info(3).col_name:='table_row_detail';
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception!');  -- Add whatever error handling is needed
END your_package;

共有してお楽しみください。

于 2013-03-06T16:36:04.190 に答える
3

それらにアクセスする前に、すべてのコレクション(ネストされたものを含む)を適切に初期化する必要があります。
これらは、初期化前はアトミックにnullです。

t_info := table_info('gl_temp_report1', c_info());

extendまた、各varray要素に値を割り当てる前に呼び出す必要があります(またはで1回拡張しextend(3)ます)。
または、すべてを1つのステートメントで実行します。

t_info := table_info('gl_temp_report1', c_info('table_idx','table_row','table_row_detail'));
于 2013-03-06T15:26:24.740 に答える