Создание динамической таблицы 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;