PL / SQL цикл через переменные - PullRequest
1 голос
/ 25 марта 2019


У меня есть инструмент, который выводит результаты запроса 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

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Тем временем я нашел решение.

Я добавил новый тип и переменную:

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;
0 голосов
/ 25 марта 2019

вы можете использовать динамический 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...