AS400 SQL中如何在自定义函数内调用存储过程
解决方案
方案1:优先使用标量UDF实现(最简便,适配V5R6版本)
你的需求本质是单输入参数返回单文字结果,无需使用表函数,直接创建标量自定义函数即可,语法完全兼容V5R6版本:
CREATE FUNCTION CONVERT_TO_WORDS(INPUT_NUM CHAR(14)) RETURNS CHAR(256) LANGUAGE SQL DETERMINISTIC BEGIN DECLARE OUT_WORDS CHAR(256); CALL NUMBER_TO_WORDS(INPUT_NUM, OUT_WORDS); RETURN OUT_WORDS; END
调用方式更简洁:
SELECT CONVERT_TO_WORDS('123456') AS WORDS FROM SYSIBM.SYSDUMMY1
方案2:如果必须保留表函数形式
V5R6版本的SQL表函数不支持直接将CALL语句作为返回值,需要使用管道输出的写法实现:
CREATE FUNCTION CONVERT_TO_WORDS(INPUT_NUM CHAR(14)) RETURNS TABLE (NUMBER CHAR(14), WORDS CHAR(256)) LANGUAGE SQL DETERMINISTIC BEGIN DECLARE OUT_WORDS CHAR(256); CALL NUMBER_TO_WORDS(INPUT_NUM, OUT_WORDS); PIPE (INPUT_NUM, OUT_WORDS); RETURN; END
调用方式和你的预期基本一致,注意V5R6中TABLE关键字后需要用括号包裹函数:
SELECT WORDS FROM TABLE(CONVERT_TO_WORDS('123456')) AS T
注意事项
- 如果原存储过程
NUMBER_TO_WORDS存在副作用(如修改表数据、产生提交点),需要将函数的DETERMINISTIC参数改为NOT DETERMINISTIC,同时添加MODIFIES SQL DATA参数 - 函数创建前需确认当前账号拥有CREATE FUNCTION权限,以及对
NUMBER_TO_WORDS存储过程的调用权限
内容的提问来源于stack exchange,提问作者Oscar A. Vaccarezza
相关产品推荐
相关产品推荐

