db2 如何从AS400 SQL中的函数调用存储过程

shstlldc  于 2022-11-07  发布在  DB2
关注(0)|答案(5)|浏览(210)

我有一个将数字转换为单词的存储过程

NUMBER_TO_WORDS (NUMBER, WORDS)

我试着创建一个如下的函数:

CREATE FUNCTION CONVERT_TO_WORDS (NUMBER CHAR (14)) RETURNS TABLE (NUMBER CHAR (14), WORDS CHAR (256)) RETURN
CALL NUMBER_TO_WORDS (NUMBER, WORDS)

这样您就可以进行如下调用:

SELECT WORDS FROM TABLE CONVERT_TO_WORDS ('123456')

但在版本5R6中不接受此语法
在AS400中是否有办法做到这一点?

lnvxswe2

lnvxswe21#

不清楚为什么需要表UDF。
下面是一个标量示例,假定SP未声明为MODIFIES SQL DATA

CREATE OR REPLACE FUNCTION CONVERT_TO_WORDS (NUMBER CHAR (14))
RETURNS CHAR (256)
BEGIN
  DECLARE L_WORDS CHAR(256);
  CALL NUMBER_TO_WORDS (NUMBER, L_WORDS);
  RETURN L_WORDS;
END

用法:

SELECT NUMBER, CONVERT_TO_WORDS (NUMBER) AS WORDS
FROM (VALUES '12345', '67890') T (NUMBER)
mnowg1ta

mnowg1ta3#

"这是我真实的的处境"
GX70 OSCV/PNUMAPAL是程序MYLIB/数字到字
GX70 OSCV/A_PALABR是函数MYLIB/转换为单词
CREATE OR REPLACE FUNCTION GX70OSCV/A_PALABR (NUMERO CHAR (14)) RETURNS CHAR (256) BEGIN DECLARE PALABRAS CHAR(256); CALL GX70OSCV/PNUMAPAL (NUMERO, PALABRAS); RETURN PALABRAS; END
已在GX70 OSCV中创建PNUMAPAL程序。

则在所述库中,过程存在:

操作对象类型属性文本
PNUMAPAL *PGM RPGLE可编程转换器
CREATE OR REPLACE FUNCTION GX70OSCV/A_PALABR (NUMERO CHAR (14)) RETURNS CHAR (256) BEGIN DECLARE PALABRAS CHAR(256); CALL GX70OSCV/PNUMAPAL (NUMERO, PALABRAS); RETURN PALABRAS; END
在GX70 OSCV中创建了A_PALABR功能。

则函数也存在:

操作对象类型属性文本
A_PALABR *SRVPGM CLE SQL函数A_PALABR

但不允许使用:SELECT * FROM (GX70OSCV/A_PALABR('12345')) as T

我不知道我不知道全左交叉内右E
"我想知道它有什么问题"

o75abkj4

o75abkj44#

"我开了一个新的帖子,让事情变得更简单“
GX70 OSCV/PNUMAPAL是程序MYLIB/数字到字
GX70 OSCV/A_PALABR是函数MYLIB/转换为单词
CREATE OR REPLACE FUNCTION GX70OSCV/A_PALABR (NUMERO CHAR (14)) RETURNS CHAR (256)
已在GX70 OSCV中创建PNUMAPAL程序。

然后在库GX70 OSCV中,程序存在:

操作对象类型属性文本
PNUMAPAL *PGM RPGLE可编程转换器
CREATE OR REPLACE FUNCTION GX70OSCV/A_PALABR (NUMERO CHAR (14)) RETURNS CHAR (256)
BEGIN
DECLARE PALABRAS CHAR(256);
CALL GX70OSCV/PNUMAPAL (NUMERO, PALABRAS);
RETURN PALABRAS;
END
在GX70 OSCV中创建了A_PALABR功能。

**则函数也存在:**Opc对象提示属性文本A_PALABR *SRVPGM CLE SQL函数A_PALABR
测试其用法:

SELECT GX70OSCV/A_PALABR('12345') FROM SYSIBM.SYSDUMMY1
{\f4未发现全局}{\f3 GX70 OSCV}{\f4变量列。}

正在检查其定义:

SELECT * FROM QSYS2/SYSROUTINES WHERE FUNCTION_TYPE = 'S' AND IN_PARMS = 1 AND ROUTINE_SCHEMA = 'GX70OSCV' AND ROUTINE_NAME = 'A_PALABR'
特定方案:GX70 OSCV型柴油机
特定名称:A_PALABR
例行程序方案:GX70 OSCV型柴油机
程序名称:A_PALABR
程序类型:功能
创建的程序:2021年8月26日13时57分46秒96万3千
程序定义:"奥瓦卡雷扎"
程序体(_B):查询语句
外部名称:GX70 OSCV/A_面板(A_面板_1)
外部语言(_L):-
参数_样式:-
确定性:
SQL数据访问:读取
SQL_PATH:“QSYS”、“QSYS 2”、“系统作业指导书”、“SYSIBMADM”、“GX70 OSCV”

e0uiprwp

e0uiprwp5#

虽然不能直接在FROM子句中调用用户定义的表函数,但可以通过其他方法将其转换为SELECT语句,下面显示了其中的三种方法:

SELECT MyUDTF('input') as Result
FROM SYSIBM.SYSDUMMY1
-- here the IBM blank or dummy table is a placeholder just so that
-- the FROM clause is syntactically correct

SELECT *
FROM TABLE (MyUDTF('input')) AS T
-- Here you can get it into a subsection of the FROM clause and
-- get rid of the dummy table.
-- Note that this will not work without the extra parentheses
-- and explicitly declaring a table name.

SELECT *
FROM MyTable
JOIN TABLE (MyUDTF(MyTable.Field1, MyTable.Key)) AS T ON T.KEY = MyTable.Key
WHERE MyTable.Field2 = 'criteria'                                       
-- This one requires that your table function returns one of its
-- columns that can be correlated with the input.
-- This well worth designing in if you are going to use this on multiple records.

相关问题