Есть ли в 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 шт):

Автор решения: 0xdb
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

→ Ссылка
Автор решения: 0xdb

Известный со старых версий, классический и "почти настоящий" 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.

Свободный перевод ответа от участника @0xdb

→ Ссылка