0

検索エンジンを試してみます。テキストコンテキストを含むテーブルがあり、クエリに応じて適切なレコードをいくつかフェッチしています。実行時に動的に作成されたテーブルに、この作成された id のテキストを転送したいと考えています。私のSQLコードは次のとおりですが、このエラー

"expression is of wrong type"

SQL

declare
  v_table dbms_sql.number_table;
begin
  select a_id bulk collect into v_table from (select a_id from b where length(b_data) > 4);

  select * from a where a_id in v_table;
end;
4

1 に答える 1

1

DBMS_SQL.NUMBER_TABLE連想配列です:

データベース テーブルとは異なり、連想配列:

  • ディスク容量やネットワーク操作は不要
  • DML ステートメントで操作できない

select into連想配列は使用できますが、select.

ネストselect intoした表を使用することはできますが、ブロック内で型が宣言されている場合は、SQL文内では無効なPL/SQL型になるため、それを使用することはできません。select

これを実現するには、SQL (つまり、PL/SQL ではない) で定義されたネストしたテーブル型が必要です。簡単にするための組み込み型がありますが、独自の型を定義できます。

declare
  v_table sys.odcinumberlist;
  v_table2 sys.odcinumberlist;
begin
  select a_id bulk collect into v_table
  from (select a_id from b where length(b_data) > 4);

  select a.a_id bulk collect into v_table2
  from table(v_table) vt
  join a on a.a_id = vt.column_value;
end;
/

anonymous block completed

selectあなたが示した 2 番目は不完全なので、1 つ作成しました。最初はネストされた を必要としません。これは次のselectように簡略化できます。

  select a_id bulk collect into v_table
  from b
  where length(b_data) > 4;

うまくいけば、2 番目の の前にコレクションで何かを実行しているはずです。selectそうしないと、少し意味がありません。同じ結果を得るには、2 番目に参加aするだけです。bselect

  select a.<columns> ...
  from a
  join b on b.a_id = a.a_id
  where length(b.b_date) > 4;
于 2014-01-24T10:34:57.110 に答える