oracle 如何在PL/SQL中创建从SELECT语句取值的数组?

z5btuh9x  于 2023-01-20  发布在  Oracle
关注(0)|答案(1)|浏览(261)

我试图创建一个脚本,它可以选择一个值列表,将它们放入数组,然后迭代数组,以便删除所选的值。我想我最终只是把自己弄糊涂了,但我最大的问题似乎是弄清楚如何将值选择到数组中。在我看到的其他示例中,人们静态定义数组,而不是使用select语句。
我试着创建了一个FOR循环,如下所示:

DECLARE 
  type PERMIDS IS VARRAY(10) OF VARCHAR2(10);
  ID PERMIDS;
  total integer;
  
BEGIN
  ID := PERMIDS('1','2','3','4','5');
  total := ID.count;
  
  FOR i in 1 .. total LOOP
      SYS.DBMS_OUTPUT.PUT_LINE('ID: ' || ID(i));
  END LOOP;
END;

这将运行,但不允许动态定义数组。
我想做的是这样的事情,选择语句可能产生任意数量的结果:

DECLARE 
  type PERMIDS IS VARRAY(10) OF VARCHAR2(10);
  ID PERMIDS;
  total integer;
  
BEGIN
  SELECT rg.ID INTO ID
  FROM table1 rg
  LEFT JOIN table2 a
  ON rg.ID = a.ID
  WHERE a.ID = '1234';
  total := ID.count;
  
  FOR i in 1 .. total LOOP
      SYS.DBMS_OUTPUT.PUT_LINE('ID: ' || ID(i));
  END LOOP;
END;

重要的是,这个循环可以处理来自select语句的任意数量的结果,包括0,因为用户可以有任意数量的记录。

krcsximq

krcsximq1#

一种选择是使用内置的sys.odcivarchar2list类型并将bulk collect添加到其中。
样表(部门名称将放入集合):

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

PL/SQL过程:

SQL> set serveroutput on
SQL>
SQL> declare
  2    l_id sys.odcivarchar2list;
  3  begin
  4    select dname
  5      bulk collect into l_id
  6      from dept;
  7
  8    for i in 1 .. l_id.count loop
  9      dbms_output.put_line('ID = ' || l_id(i));
 10    end loop;
 11  end;
 12  /
ID = ACCOUNTING
ID = RESEARCH
ID = SALES
ID = OPERATIONS

PL/SQL procedure successfully completed.

SQL>

相关问题