Oracle PL 等效于 foreach 循环

Posted

技术标签:

【中文标题】Oracle PL 等效于 foreach 循环【英文标题】:Oracle PL equivalent of foreach-loop 【发布时间】:2021-05-04 01:10:44 【问题描述】:

我需要循环大约 10 个字符串,这些都是我事先知道的——我不需要从任何地方SELECT 它们。

我尝试过:

BEGIN
    FOR tab IN ('one', 'two', 'three')
    LOOP
        EXECUTE IMMEDIATE 'DROP TABLE ' || tab;
    END LOOP;
END;

但这不起作用(LOOP 出乎意料)...

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:
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

或者您可以使用自己的快捷功能: http://orasql.org/2017/10/02/plsql-functions-iterate-and-keys-for-associative-arrays/

顺便说一句,Oracle 21 为 FOR-LOOP 提供了一些新功能:

1.1.1 PL/SQL Extended Iterators FOR LOOP Iteration Enhancements in Oracle Database 21c

所以可以改写为:

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

【讨论】:

【参考方案2】:

“几乎是真实的”foreach 循环:

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.

【讨论】:

&lt;&lt;angle&gt;&gt; 括号? @MikhailT。 <<label>>【参考方案3】:
begin
for tab_rec in (  select 'abc' val from dual
            union 
            select '123' val from dual )
loop
 EXECUTE IMMEDIATE 'DROP TABLE ' || tab_rec.val;
end loop;
end;

【讨论】:

叹息,dual 是多么可怕的骇客之源啊,不是吗?

以上是关于Oracle PL 等效于 foreach 循环的主要内容,如果未能解决你的问题,请参考以下文章

什么 PL/pgSQL 异常与 PostgreSQL 中 Oracle 的 VALUE_ERROR 等效?

每个将表名传递给过程的 ORACLE PL/SQL

在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线

Oracle中使用PL/SQL怎样用循环插入多条数据?

Python 中的 C# Parallel.Foreach 等效项

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器