如何调用包含OBJECT类型输出参数的Oracle存储过程?
1. 自定义OBJECT类型能否作为存储过程输出参数
Oracle完全支持将自定义OBJECT类型作为存储过程的IN/OUT/IN OUT参数,你现有存储过程的参数定义完全合法,不存在语法错误。
2. 正确获取OBJECT类型输出结果的方法
分两种常用使用场景:
场景1:在SQL*Plus、Oracle SQL Developer等客户端直接测试(你当前使用的绑定变量测试方式)
你现有的测试脚本逻辑已经正确,仅需要注意autoprint对自定义OBJECT类型的自动打印支持不统一,执行完存储过程调用后,你可以通过以下两种方式获取结果:
- 直接查询绑定变量的OBJECT属性:
-- 以你示例中的PRE_RESUMEN_TYP类型变量cursortemp12为例,执行完存储过程后执行以下查询即可拿到对应字段值 SELECT :cursortemp12.COL1, :cursortemp12.COL2, :cursortemp12.COL3, :cursortemp12.COL14 FROM DUAL;
- 用PRINT命令直接打印整个OBJECT(多数Oracle客户端均支持):
PRINT cursortemp12;
注意:如果你的存储过程没有封装在PKG包下,调用时去掉前缀
PKG.,直接写存储过程名即可。
场景2:在PL/SQL代码块中调用获取结果
如果是在业务逻辑、PL/SQL脚本中调用,可以直接声明对应OBJECT类型的变量接收输出,再直接访问属性使用:
DECLARE -- 声明和输出参数类型匹配的变量 v_tramite PRE_TRAMITE_TYP; v_canal PRE_CANAL_TYP; v_resumen PRE_RESUMEN_TYP; -- 剩余输出参数按同样规则声明即可 BEGIN -- 调用存储过程 CONSULTAR_PR( piinRegion => 123, pistIdTramite => null, pistFolio => null, pistFzaVta => 'qwer', pistTipoTramite => 'asdf', pistCurp => 'xxxxx', potyTramite => v_tramite, potyCanal => v_canal, potyResumen => v_resumen -- 剩余参数按顺序补全即可 ); -- 直接访问OBJECT属性使用 DBMS_OUTPUT.PUT_LINE('RESUMEN类型COL1字段值:' || v_resumen.COL1); DBMS_OUTPUT.PUT_LINE('RESUMEN类型COL2字段值:' || v_resumen.COL2); END; /
内容的提问来源于stack exchange,提问作者Cristian Piste
相关产品推荐
相关产品推荐

