将 GROUP BY 结果存储在 Oracle PL/SQL 中的变量中

Store GROUP BY result in a variable in Oracle PL/SQL

我可以使用下面的代码将行集存储在变量类型为 table.

的变量中
DECLARE
    TYPE TABLE_A_ROW_TYPE IS TABLE OF TABLE_A%ROWTYPE ;
    TABLE_A_ROWS_LIST TABLE_A_ROW_TYPE ;
BEGIN
    SELECT * BULK COLLECT INTO TABLE_A_ROWS_LIST FROM TABLE_A
    WHERE ORG_MEMBER_NAME is NULL;
END;

我的要求是将 GROUP BY 子句的结果存储在变量中。而不是 SELECT * 我需要使用以下查询:

SELECT ORG_NAME, COUNT(1) BULK COLLECT INTO TABLE_A_ROWS_LIST FROM TABLE_A
WHERE ORG_MEMBER_NAME is NULL GROUP BY ORG_NAME;

如何将上述 GROUP BY 子句的结果存储在变量中?我应该为 TABLE_A_ROWS_LIST 变量使用什么变量类型才能使其工作?

这是一种选择:

SQL> DECLARE
  2     TYPE ttar IS RECORD
  3     (
  4        org_name   VARCHAR2 (10),
  5        cnt        NUMBER
  6     );
  7
  8     TYPE ttav IS VARRAY (10) OF ttar;
  9
 10     ttab  ttav;
 11  BEGIN
 12       SELECT d.dname, COUNT (*)
 13         BULK COLLECT INTO ttab
 14         FROM dept d JOIN emp e ON e.deptno = d.deptno
 15     GROUP BY d.dname;
 16
 17     FOR i IN ttab.FIRST .. ttab.LAST
 18     LOOP
 19        DBMS_OUTPUT.put_line (ttab (i).org_name || ': ' || ttab (i).cnt);
 20     END LOOP;
 21  END;
 22  /
ACCOUNTING: 3
RESEARCH: 5
SALES: 6

PL/SQL procedure successfully completed.

SQL>

或者,使用在 SQL 级别声明的类型:

SQL> CREATE OR REPLACE TYPE ttar IS OBJECT (org_name VARCHAR2 (10), cnt NUMBER);
  2  /

Type created.

SQL> CREATE OR REPLACE TYPE ttabr IS TABLE OF ttar;
  2  /

Type created.

SQL> DECLARE
  2     ttab  ttabr;
  3  BEGIN
  4       SELECT ttar (d.dname, COUNT (*))
  5         BULK COLLECT INTO ttab
  6         FROM dept d JOIN emp e ON e.deptno = d.deptno
  7     GROUP BY d.dname;
  8
  9     FOR i IN ttab.FIRST .. ttab.LAST
 10     LOOP
 11        DBMS_OUTPUT.put_line (ttab (i).org_name || ': ' || ttab (i).cnt);
 12     END LOOP;
 13  END;
 14  /
ACCOUNTING: 3
RESEARCH: 5
SALES: 6

PL/SQL procedure successfully completed.

SQL>