Есть ли в PL/SQL эквивалент цикла foreach-loop?
Нужно перебрать в цикле около десяти строк. Все строки известны заранее, их не нужно получать запросом откуда-либо.
Пробую:
BEGIN
FOR tab IN ('one', 'two', 'three')
LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || tab;
END LOOP;
END;
Но так не работает, получаю ошибку:
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:
Есть ли способ сделать это?
Свободный перевод вопроса Oracle PL equivalent of foreach-loop от участника @Mikhail T.
Ответы (2 шт):
declare
type t_strings is table of varchar2(100);
strings t_strings:=t_strings('one','two','three');
begin
for i in 1..strings.count loop
dbms_output.put_line(strings(i));
end loop;
end;
/
Результат:
one
two
three
Или можно использовать свои собственные "почти одострочные" функции.
Стоит заметить, в 21c имеются некоторые новые возможности для FOR-LOOP:
Пример выше можно будет переписать так:
declare
type t_strings is table of varchar2(100);
begin
for str in values of t_strings('one','two','three') loop
dbms_output.put_line(str);
end loop;
end;
/
Свободный перевод ответа от участника @Sayan Malakshinov
Известный со старых версий, классический и "почти настоящий" foreach-loop:
declare
type tabList is table of varchar2(32);
tabs tabList := tabList ('one', 'two', 'three');
curr varchar2(32) := tabs.first;
begin
<<foreach>> loop exit foreach when curr is null;
execute immediate 'create table '||tabs(curr)||' (col char(1))';
execute immediate 'drop table ' ||tabs(curr)||' purge';
curr := tabs.next (curr);
end loop;
end;
/
PL/SQL procedure successfully completed.