Цикл PL / SQL через переменные

#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;