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.
【讨论】:
<<angle>>
括号?
@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 等效?
在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线