数値テーブルとして定義されたカスタム型を使用する PL/SQL パッケージで関数を作成しました。次のような SELECT COLUMN_VALUE 命令を使用して、SQL クエリでこのタイプのオブジェクトを使用します。
パッケージ内の型定義:
type T_IDS is table of my_table.col_id%type;
パッケージ本体のプロシージャ内のクエリ:
l_ids_list T_IDS ;
begin
select col_ids bulk collect into T_IDS from my_table;
select sum(t.rec_value) into total_value
from my_table t where t.col_id in (
select column_value from Table(l_ids_list) );
すべて正常に動作し、このコードをコンパイルすると、schema_name/type セクションの下に新しい型が生成されていることがわかります。
これをテスト環境にインストールすると、エラーでコンパイルに失敗します:
エラー: PLS-00642: ローカル コレクション タイプは SQL ステートメントでは許可されていません
エラー: PL/SQL: ORA-22905: ネストされていないテーブル アイテムの行にアクセスできません
データベースのバージョン (ローカルとテスト) はまったく同じ 11g です。DBMS でそのような世代を有効にする方法はありますか?
再現する例:
create table my_table (
col_id number,
rec_value number
);
insert into my_table (col_id, rec_value) values (1,100);
insert into my_table (col_id, rec_value) values (2,200);
insert into my_table (col_id, rec_value) values (3,300);
insert into my_table (col_id, rec_value) values (4,400);
commit;
パッケージの作成:
create or replace package test_pck as
type T_IDS is table of my_table.col_id%type;
procedure test_list;
end test_pck;
/
create or replace
package body test_pck as
procedure test_list is
l_ids_list T_IDS ;
total_value number;
begin
select col_id bulk collect into l_ids_list from my_table;
select sum(t.rec_value) into total_value
from my_table t where t.col_id in (
select column_value from Table(l_ids_list) );
end test_list;
end test_pck;
/