Создание динамической таблицы Oracle во время выполнения

Я делаю, чтобы попробовать поисковую систему. Сценарий, как это; У меня есть таблица, которая содержит текстовый контекст, и я выбираю некоторые записи, которые подходят в соответствии с моим запросом, а затем я хочу перенести этот основанный текст идентификатора в таблицу, которая динамически создается во время выполнения. Мой код 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;

1 ответ

Решение

DBMS_SQL.NUMBER_TABLE это ассоциативный массив:

В отличие от таблицы базы данных, ассоциативный массив:

  • Не требует места на диске или сетевых операций
  • Нельзя манипулировать с помощью операторов DML

Вы можете select into ассоциативный массив, но вы не можете использовать его в качестве таблицы в select,

Вы могли бы select into с вложенной таблицей, но вы все еще не могли использовать это в select если тип объявлен в вашем блоке, потому что это будет тип PL/SQL, который недопустим в операторе SQL.

Для этого вам понадобится вложенный тип таблицы, определенный в 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 ты показал не полностью, так что я придумал. Ваш первый не нуждается во вложенном select, что может быть упрощено до:

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

Надеюсь, вы что-то делаете с коллекцией до вашего второго selectиначе это немного бессмысленно; ты можешь просто присоединиться a в b во-вторых select чтобы получить тот же результат:

  select a.<columns> ...
  from a
  join b on b.a_id = a.a_id
  where length(b.b_date) > 4;
Другие вопросы по тегам