2

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つの部分に分かれています:

  1. システム生成のユーザー定義型select が では機能するのに では機能しないのはなぜmember ofですか?

  2. パッケージ内で型がPL/SQL型ではなく、SQL型である必要があるのはなぜですか? 私はあまりタイプを定義していないので、その質問に対する簡単な答えがあるかもしれません。

4

1 に答える 1

2

(1)

COLLECT 関数のドキュメントには、「この関数の結果を取得するには、CAST 関数内で使用する必要があります」と記載されています。定義された型にキャストしない限り、その内容の単純なダンプを除いて、単に使用をサポートするように設計されていないと思います。

(2)

SQL パーサーは、PL/SQL ブロックで定義された型を認識したり、型にアクセスしたりしません。PL/SQLコード内でSQL文を実行する場合でも、文は基本的に独立したパーサーに渡されます(PL/SQL変数名はバインド変数のプレースホルダに置き換えられます)。

于 2010-11-24T16:03:32.923 に答える