PL/SQL包中能否定义返回多表联合字段自定义值的Cursor?
错误原因说明
你遇到的PLS-00304报错是代码循环引用导致的:声明CUR_TEST游标时,返回值类型用了CUR_TEST%ROWTYPE,但此时游标本身还没有完成定义,Oracle无法解析这个尚未存在的游标的行类型。
实现跨表自定义字段返回的游标方案
完全可以实现返回多表自定义字段的游标,常用两种实现方式:
方案1:先定义自定义RECORD类型作为游标返回值
适合游标逻辑复杂、不想把实现细节暴露在包头的场景,先把跨表所需的字段组合成自定义RECORD,再指定游标返回该RECORD类型即可:
-- 包头定义 CREATE OR REPLACE PACKAGE TEST IS -- 第一步:定义自定义RECORD类型,包含来自不同表的所需字段 TYPE emp_dept_rec IS RECORD ( employee_id employees.employee_id%TYPE, emp_name employees.last_name%TYPE, dept_name departments.department_name%TYPE, job_title jobs.job_title%TYPE ); -- 第二步:声明游标,返回类型指定为上面定义的RECORD类型 CURSOR CUR_TEST (id_in IN employees.employee_id%TYPE) RETURN emp_dept_rec; -- 可直接基于游标定义关联集合类型 TYPE t_cur_test IS TABLE OF CUR_TEST%ROWTYPE INDEX BY BINARY_INTEGER; END TEST; / -- 包体实现 CREATE OR REPLACE PACKAGE BODY TEST IS CURSOR CUR_TEST (id_in IN employees.employee_id%TYPE) RETURN emp_dept_rec IS -- 多表关联查询,字段顺序、类型要和RECORD定义完全对应 SELECT e.employee_id, e.last_name, d.department_name, j.job_title FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN jobs j ON e.job_id = j.job_id WHERE e.employee_id = id_in; END TEST; /
方案2:包头直接写完整游标定义
适合游标逻辑简单的场景,不需要单独声明返回类型,直接在包头写完游标的完整查询逻辑,即可直接使用CUR_TEST%ROWTYPE:
CREATE OR REPLACE PACKAGE TEST IS -- 包头直接写完整的游标定义,包含多表查询语句 CURSOR CUR_TEST (id_in IN employees.employee_id%TYPE) IS SELECT e.employee_id, e.last_name, d.department_name, j.job_title FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN jobs j ON e.job_id = j.job_id WHERE e.employee_id = id_in; -- 直接定义集合类型 TYPE t_cur_test IS TABLE OF CUR_TEST%ROWTYPE INDEX BY BINARY_INTEGER; END TEST; /
这种方式包体中不需要再重复定义游标,可直接调用。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

