Oracle 10g とCOLLECT
関数の使用に問題があります。私は今朝その存在を知ったばかりですが、member of
状態に関連してそれを使用することで解決できる問題があります.
最初に、以下に示すコードを作成しましたが、「ORA_00932: データ型が矛盾しています: UDT が予期されました -」というエラーが返されました。
with my_tab as (
select 1 as cola, 1 as colb from dual union all
select 1 as cola, 2 as colb from dual union all
select 2 as cola, 3 as colb from dual union all
select 2 as cola, 4 as colb from dual union all
select 3 as cola, 3 as colb from dual union all
select 3 as cola, 4 as colb from dual union all
select 4 as cola, 1 as colb from dual union all
select 4 as cola, 2 as colb from dual
)
select
cola,
colb_vals
from (
select
cola,
collect(colb) as colb_vals
from my_tab
group by cola
)
where 2 member of colb_vals
Oracle 10.2.4.0では、データベースが一時的なシステム生成のユーザー定義型を作成し、それを使用するように見えるので、これは少し奇妙だと思いました。条件 ( ) を削除するwhere 2 member of colb_vals
と、コードが実行され、一時的な UDT (SYSTPblahblahblah== という名前) を含む取得されたデータが表示されます。
もう少し検索した後CREATE TYPE
、関数を使用してCAST
、ネストされたテーブルの型を変更することでこれを解決できることに気付きました。これはうまくいきました。
これは使用CREATE TYPE number_ntt as TABLE OF NUMBER;
して置き換えcollect(colb)
ていましたcast(collect(colb) as number_ntt)
次に、パッケージで作成されたネストされたテーブル型を使用しようとしました。これは、この型が単一パッケージ内の 1 つのプロシージャ内の 1 つの特定のクエリで使用できるようにするだけでよいためです。そして、私はそれを機能させることができませんでした。
create or replace package mike_temp_pkg as
type number_ntt is table of number;
end mike_temp_pkg;
そして今回交換collect(colb)
するのはcast(collect(colb) as mike_temp_pkg.number_ntt)
これにより、ORA-00932: 無効なデータ型が発生しました。
だから私が持っている質問は、実際には2つの部分に分かれています:
システム生成のユーザー定義型
select
が では機能するのに では機能しないのはなぜmember of
ですか?パッケージ内で型がPL/SQL型ではなく、SQL型である必要があるのはなぜですか? 私はあまりタイプを定義していないので、その質問に対する簡単な答えがあるかもしれません。