循环预定义的值

JGS*_*JGS 22 oracle plsql stored-procedures for-loop

有没有办法在oracle中执行"for each",如下所示:

begin
  for VAR in {1,2,5}
  loop
    dbms_output.put_line('The value: '||VAR);
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

我知道你可以这样做:

begin
  for VAR in 1..5
  loop
    if VAR in(1,3,5) then
      dbms_output.put_line('The value: '||VAR);
    end if;
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法以更好的方式做到这一点?定义一组值并迭代它们?

谢谢.

Ton*_*ews 38

你可以这样做,虽然可能不像你想的那样光滑:

declare
  type nt_type is table of number;
  nt nt_type := nt_type (1, 3, 5);
begin
  for i in 1..nt.count loop
    dbms_output.put_line(nt(i));
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

如果在数据库中创建类型:

create type number_table is table of number;
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

begin
  for r in (select column_value as var from table (number_table (1, 3, 5))) loop
    dbms_output.put_line(r.var);
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

  • 实际上你不需要在DB中创建一个类型,你可以`for r in(从表中选择column_value(sys.dbms_debug_vc2coll(1,3,5)))循环` (9认同)

Art*_*are 11

这来自 ABCade 对当前接受的答案的评论,但我发现它更清晰,值得更多关注:

BEGIN
  FOR i IN (SELECT column_value FROM table(sys.dbms_debug_vc2coll(1, 3, 5))) LOOP
    dbms_output.put_line(i.column_value);
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。对于任何需要字符串值解决方案的人:它也可以传递字符串作为参数 `sys.dbms_debug_vc2coll('a', 'b', 'c')` (3认同)