咨询PL/SQL包中添加变量类型及自定义ROT_TMLN_ARRAY类似类型的方法
PL/SQL包类型定义与自定义数组类型创建指南
一、在PL/SQL包中添加变量类型
PL/SQL包分**规范(PACKAGE)和体(PACKAGE BODY)**两部分,类型定义要放在对应位置:
- 若类型需要被外部程序调用,就定义在包规范的开头;
- 若只是包内部使用的私有类型,放在包体的
DECLARE块里即可。
结合你的参考代码,正确的包结构示例如下:
-- 包规范:定义对外可见的类型和存储过程声明 CREATE OR REPLACE PACKAGE PKG_TMLN AS -- 先定义基础记录类型(ROT_TMLN_ARRAY基于该记录创建) TYPE ROT_TMLN_REC IS RECORD ( emp_id VARCHAR2(20), rot_date DATE, dept VARCHAR2(50) -- 按实际业务需求添加字段 ); -- 定义目标数组类型ROT_TMLN_ARRAY TYPE ROT_TMLN_ARRAY IS TABLE OF ROT_TMLN_REC INDEX BY PLS_INTEGER; -- 声明存储过程 PROCEDURE SP_TMLN_SVC ( rotnPrngNb IN VARCHAR2, empiRotnDetails OUT ROT_TMLN_ARRAY ); END PKG_TMLN; / -- 包体:实现存储过程的具体逻辑 CREATE OR REPLACE PACKAGE BODY PKG_TMLN AS PROCEDURE SP_TMLN_SVC ( rotnPrngNb IN VARCHAR2, empiRotnDetails OUT ROT_TMLN_ARRAY ) IS BEGIN -- 示例:给输出数组赋值 empiRotnDetails(1).emp_id := 'E001'; empiRotnDetails(1).rot_date := SYSDATE; empiRotnDetails(1).dept := '技术部'; END SP_TMLN_SVC; END PKG_TMLN; /
二、在SQL Developer中使用ROT_TMLN_ARRAY类型
- 先确保包规范编译通过,SQL Developer会自动识别包内定义的类型;
- 测试存储过程可通过匿名块调用,示例代码:
DECLARE v_result PKG_TMLN.ROT_TMLN_ARRAY; BEGIN PKG_TMLN.SP_TMLN_SVC('PRNG001', v_result); -- 遍历数组输出结果,需提前打开SQL Developer的DBMS输出窗口 FOR i IN 1..v_result.COUNT LOOP DBMS_OUTPUT.PUT_LINE('员工ID: ' || v_result(i).emp_id || ' 轮岗日期: ' || v_result(i).rot_date); END LOOP; END; /
执行后在DBMS Output面板即可查看输出内容。
三、基于ROT_TMLN_ARRAY创建类似的自定义类型
有两种常用方式,按需选择:
1. 包内新增同结构自定义类型
如果仅在当前包内使用,直接在包规范中添加即可:
CREATE OR REPLACE PACKAGE PKG_TMLN AS TYPE ROT_TMLN_REC IS RECORD ( emp_id VARCHAR2(20), rot_date DATE, dept VARCHAR2(50) ); TYPE ROT_TMLN_ARRAY IS TABLE OF ROT_TMLN_REC INDEX BY PLS_INTEGER; -- 新增部门轮岗数组类型,结构与ROT_TMLN_ARRAY类似 TYPE DEPT_ROT_REC IS RECORD ( dept_id VARCHAR2(10), rot_start DATE, rot_end DATE ); TYPE DEPT_ROT_ARRAY IS TABLE OF DEPT_ROT_REC INDEX BY PLS_INTEGER; PROCEDURE SP_TMLN_SVC ( rotnPrngNb IN VARCHAR2, empiRotnDetails OUT ROT_TMLN_ARRAY ); END PKG_TMLN; /
2. 创建全局自定义类型(跨包可用)
如果需要多个包或SQL语句共享该类型,可创建SQL级别的全局类型:
-- 先创建全局记录类型 CREATE OR REPLACE TYPE ROT_TMLN_REC_TYPE AS OBJECT ( emp_id VARCHAR2(20), rot_date DATE, dept VARCHAR2(50) ); / -- 再创建全局数组类型 CREATE OR REPLACE TYPE ROT_TMLN_ARRAY_TYPE AS TABLE OF ROT_TMLN_REC_TYPE; /
之后在任意包或匿名块中都可直接引用该全局类型:
CREATE OR REPLACE PACKAGE PKG_TMLN AS PROCEDURE SP_TMLN_SVC ( rotnPrngNb IN VARCHAR2, empiRotnDetails OUT ROT_TMLN_ARRAY_TYPE ); END PKG_TMLN; /
内容的提问来源于stack exchange,提问作者bazinga01
相关产品推荐
相关产品推荐

