PostgreSQL存储过程间值传递及转函数可行性咨询
存储过程返回值获取方案分析
核心结论
你当前写的SELECT * FROM UTILITY_SERVICES_SP_DELETE_SCHPAY(...) INTO ...写法不可行——存储过程(Stored Procedure)不能像表函数那样通过SELECT ... FROM的方式调用,这种写法会直接报错。
可行解决方案
方案1:通过OUT参数获取存储过程返回值
如果要保留UTILITY_SERVICES_SP_DELETE_SCHPAY作为存储过程,你需要在它的定义里将P_SUC_FLAG和P_ERROR声明为OUT类型参数,调用时直接通过CALL语句传递变量,无需使用SELECT:
CALL UTILITY_SERVICES_SP_DELETE_SCHPAY( P_ENTITY_CODE, P_CUST_CODE, IDY.SRV_REF_NUM, OUT P_SUC_FLAG, OUT P_ERROR );
注意:存储过程执行完成后,会自动将结果写入这两个OUT参数中,调用前不需要提前给它们赋值。
方案2:将存储过程转换为表函数
如果更习惯用SELECT ... INTO的方式获取结果,可以把UTILITY_SERVICES_SP_DELETE_SCHPAY改成表函数(Table Function),让函数返回包含SUC_FLAG和ERROR两个字段的行类型。此时调用代码调整为:
SELECT SUC_FLAG, ERROR FROM UTILITY_SERVICES_SP_DELETE_SCHPAY(P_ENTITY_CODE, P_CUST_CODE, IDY.SRV_REF_NUM) INTO STRICT P_SUC_FLAG, P_ERROR;
转换后的函数只需接收输入参数,无需再把
P_SUC_FLAG、P_ERROR作为参数传入,结果通过返回的行数据传递。
选择建议
- 若
UTILITY_SERVICES_SP_DELETE_SCHPAY核心是执行删除这类有副作用的操作,建议保留为存储过程,用OUT参数传递状态; - 若它的主要作用是计算并返回状态值,没有复杂的DML操作,转换成表函数会更适配你的调用习惯。
内容的提问来源于stack exchange,提问作者KSMNOP k
相关产品推荐
相关产品推荐

