如何执行存储过程及调用包中的存储过程与函数
存储过程执行与包内对象调用方法
一、执行存储过程 P_INSERT_PER_LG
1. 直接在SQL客户端执行
如果存储过程是独立对象(不属于包),可通过PL/SQL块执行并处理输出参数:
DECLARE v_err_msg VARCHAR2(2000); -- 定义变量接收输出参数 BEGIN P_INSERT_PER_LG( IN_DATA => SYSDATE, IN_CHECK => 'Y', IN_PSE => 'PSE001', IN_TP_CHECK => 'TYPE_A', IN_STATUS => 1, IN_MSG => '测试插入', OUT_ERR_MSG => v_err_msg ); DBMS_OUTPUT.PUT_LINE('错误信息: ' || v_err_msg); END; /
也可用EXEC简写命令(适合无需打印输出的场景):
EXEC P_INSERT_PER_LG(SYSDATE, 'Y', 'PSE001', 'TYPE_A', 1, '测试插入', :v_err_msg); -- 注意: :v_err_msg 为绑定变量,需提前在客户端声明
2. 从包中调用存储过程
若该存储过程属于某包(示例包名为PKG_PER_LG),调用时需添加包名前缀:
DECLARE v_err_msg VARCHAR2(2000); BEGIN PKG_PER_LG.P_INSERT_PER_LG( IN_DATA => TO_DATE('2024-05-20', 'YYYY-MM-DD'), IN_CHECK => 'N', IN_PSE => 'PSE002', IN_TP_CHECK => 'TYPE_B', IN_STATUS => 0, IN_MSG => '包内调用测试', OUT_ERR_MSG => v_err_msg ); IF v_err_msg IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE('执行报错: ' || v_err_msg); ELSE DBMS_OUTPUT.PUT_LINE('执行成功'); END IF; END; /
二、调用函数 F_GT_COD_PTH
该函数返回自定义对象类型C_GT_COD_OBJ,需用同类型变量接收返回值。
1. 独立函数的调用
DECLARE v_result C_GT_COD_OBJ; -- 声明与返回值类型匹配的变量 BEGIN v_result := F_GT_COD_PTH(IN_CODE => 'COD001'); -- 假设对象有CODE、PATH属性,按需访问 DBMS_OUTPUT.PUT_LINE('代码: ' || v_result.CODE || ', 路径: ' || v_result.PATH); END; /
2. 从包中调用函数
若函数属于某包(示例包名为PKG_COD_PTH),添加包名前缀即可:
DECLARE v_result C_GT_COD_OBJ; BEGIN v_result := PKG_COD_PTH.F_GT_COD_PTH(IN_CODE => 'COD002'); -- 根据对象实际属性结构打印结果 DBMS_OUTPUT.PUT_LINE('返回结果: ' || v_result.ATTR1 || ' - ' || v_result.ATTR2); END; /
补充说明
- 调用时推荐使用命名参数(如
IN_DATA => SYSDATE),相比位置参数更易读、易维护。 - 自定义对象
C_GT_COD_OBJ需提前创建(如执行CREATE TYPE C_GT_COD_OBJ AS OBJECT(...)),确保当前会话可访问。
内容的提问来源于stack exchange,提问作者Kabilan J
相关产品推荐
相关产品推荐

