在 PL/SQL 集合中存储和检索 SQL 查询输出
OP 中的示例看起来很像 Oracle 的新示例 HR 数据模式。 (对于那些知道的老手,SCOTT-TIGER 数据模型的继承者)。此解决方案是在 Oracle 11g R2 实例上开发的。
演示表设计 - EMP
演示目标
这个例子将展示如何从对象TYPE 定义创建一个PL/SQL 集合。复杂数据类型派生自以下游标定义:
CURSOR l_employees_cur IS
SELECT emp.empno as EMPLOYEE_ID, emp.mgr as MANAGER_ID, emp.ename as LAST_NAME
FROM EMP;
在将游标内容加载到索引集合变量后,存储过程的后半部分包含一个可选步骤,该步骤循环返回集合并通过DBMS_OUTPUT 或在另一个表上的 INSERT DML 操作显示数据.
存储过程示例源代码
这是用于查询演示表 EMP 的存储过程。
create or replace procedure zz_proc_employee is
CURSOR l_employees_cur IS
SELECT emp.empno as EMPLOYEE_ID, emp.mgr as MANAGER_ID, emp.ename as LAST_NAME
FROM EMP;
TYPE employees_tbl_type IS TABLE OF l_employees_cur%ROWTYPE INDEX BY PLS_INTEGER;
employees_rec_var l_employees_cur%ROWTYPE;
employees_tbl_var employees_tbl_type;
v_output_string varchar2(80);
c_output_template constant varchar2(80):=
'Employee: <<EMP>>; Manager: <<MGR>>; Employee Name: <<ENAME>>';
idx integer;
outloop integer;
BEGIN
idx:= 1;
OPEN l_employees_cur;
FETCH l_employees_cur INTO employees_rec_var;
WHILE l_employees_cur%FOUND LOOP
employees_tbl_var(idx):= employees_rec_var;
FETCH l_employees_cur INTO employees_rec_var;
idx:= idx + 1;
END LOOP;
CLOSE l_employees_cur;
-- OPTIONAL (below) Output Loop for Displaying The Array Contents
-- At this point, employees_tbl_var can be handed off or returned
-- for additional processing.
FOR outloop IN 1 .. idx LOOP
-- Build the output string:
v_output_string:= replace(c_output_template, '<<EMP>>',
to_char(employees_tbl_var(outloop).employee_id));
v_output_string:= replace(v_output_string, '<<MGR>>',
to_char(employees_tbl_var(outloop).manager_id));
v_output_string:= replace(v_output_string, '<<ENAME>>',
employees_tbl_var(outloop).last_name);
-- dbms_output.put_line(v_output_string);
INSERT INTO zz_output(output_string, output_ts)
VALUES(v_output_string, sysdate);
COMMIT;
END LOOP;
END zz_proc_employee;
由于我无法控制的服务器配置问题,我注释掉了dbms_output 调用。输出表的备用insert 命令是一种直观地验证 EMP 表中的数据是否成功进入声明的集合变量的快速方法。
解决方案的结果与讨论
这是调用过程并查询输出表后的输出:
虽然在 OP 的非常简洁的细节中并不清楚访问此表的实际目的,但我认为第一种方法是尝试了解使用集合和自定义数据类型来进行有效的数据提取和从诸如 PL/SQL 游标之类的结构中进行处理。
这个示例过程的一部分非常可重用,初始步骤代表了一种制作和加载 PL/SQL 集合的工作方式。如果您注意到,即使您自己的 EMP 表版本不同,唯一需要重新定义的地方就是游标本身。
从长远来看,使用类型、数组、嵌套表和其他集合类型实际上会简化工作,因为它们具有动态特性。