#oracle #plsql
#Oracle #plsql
Вопрос:
У меня есть инструмент, вывод которого представляет собой результаты sql-запроса. В зависимости от выбора пользователя запрос использует подзапросы. Чтобы получить все подзапросы к моему окончательному запросу, я использую строки и на заключительном этапе объединяю их в один большой запрос — vSQL
.
Подзапросы сохраняются в виде строки типа vSQL1
.. vSQL14
Поскольку используется не каждый подзапрос — выбор пользователя — некоторые из них опущены.
Теперь это выглядит так:
if LENGTH(vSQL1) > 1 then
set_vSQL(vSQL, vSQL1, t);
end if;
..
if LENGTH(vSQL14) > 1 then
set_vSQL(vSQL, vSQL14, t);
end if;
Возможно ли поместить это в цикл, чтобы изменялась только переменная?
Я пробовал что-то подобное, но это не работает.
for x in 1 .. 14
loop
if LENGTH(vSQL || x) > 1 then
set_vSQL(vSQL, vSQL || x, t);
end if;
end loop
Комментарии:
1. Вы должны сказать нам, что
set_vSQL
собираетесь делать? Вы говорите «Подзапросы сохраняются в строке, подобной vSQL1 .. vSQL14» — Почему его нельзя объединить при сохранении?
Ответ №1:
Тем временем я нашел решение.
Я добавил новый тип и переменную:
TYPE vSQLs_table IS TABLE OF VARCHAR2(32000);
vSQLs vSQLs_table;
С помощью этого я мог бы ввести все мои переменные в один:
vSQLs := vSQLS_table(vSQL1, vSQL2, vSQL3, vSQL4, vSQL5, vSQL6, vSQL7, vSQL8, vSQL9, vSQL10, vSQL11, vSQL12);
С помощью этого я мог бы перебирать их все:
for x in 1 .. 12
loop
if LENGTH(vSQLs(x)) > 1 then
set_vSQL(vSQL, vSQLs(x), t);
end if;
end loop;
Ответ №2:
вы можете использовать динамический SQL. что-то вроде этого (код не тестировался)
declare
l number;
begin
for x in 1 .. 14
loop
execute immediate 'select LENGTH(vSQL'||to_char(x)||') from dual' into l;
if l > 1 then
execute immediate 'set_vSQL(vSQL, vSQL'||to_char(x)||', t)' ;
end if;
end loop
end;