我有一个将数字转换为单词的存储过程
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 有办法做到这一点吗?
不清楚为什么需要表 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)
这是我的真实情况
GX70OSCV/PNUMAPAL 是程序 MYLIB/NUMBER_TO_WORDS
GX70OSCV/A_PALABR 是函数 MYLIB/CONVERT_TO_WORDS
CREATE OR REPLACE PROCEDURE GX70OSCV/PNUMAPAL ( INOUT CHAR(14), INOUT CHAR(256)) NO SQL DETERMINISTIC EXTERNAL NAME GX70OSCV/PNUMAPAL LANGUAGE RPGLE GENERAL
然后在该库中,存在该程序:
Opc Objeto Tipo Atributo Texto
PNUMAPAL *PGM RPGLE 转换器 nro a palabras
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
那么,这个函数也存在:
Opc Objeto Tipo Atributo Texto
A_PALABR *SRVPGM CLE SQL 函数 A_PALABR
但是不允许使用:
SELECT * FROM (GX70OSCV/A_PALABR('12345')) as T
我想知道这是怎么回事?
我打开这个新线程是为了让事情变得更整洁
GX70OSCV/PNUMAPAL 是程序 MYLIB/NUMBER_TO_WORDS
GX70OSCV/A_PALABR 是函数 MYLIB/CONVERT_TO_WORDS
CREATE OR REPLACE PROCEDURE GX70OSCV/PNUMAPAL ( INOUT CHAR(14), INOUT CHAR(256)) DETERMINISTIC EXTERNAL NAME GX70OSCV/PNUMAPAL LANGUAGE RPGLE SQL
那么在GX70OSCV库中,程序存在:
Opc Objeto Tipo Atributo Texto
PNUMAPAL *PGM RPGLE 转换器 nro a palabras
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
创建 GX70OSCV 中的 A_PALABR 功能。
那么,该函数也存在: Opc 对象 Tipo Atributo Texto A_PALABR *SRVPGM CLE SQL 函数 A_PALABR
测试其用法:
SELECT GX70OSCV/A_PALABR('12345') FROM SYSIBM.SYSDUMMY1
检查其定义:
SELECT * FROM QSYS2/SYSROUTINES WHERE FUNCTION_TYPE = 'S' AND IN_PARMS = 1 AND ROUTINE_SCHEMA = 'GX70OSCV' AND ROUTINE_NAME = 'A_PALABR'
SPECIFIC_SCHEMA:GX70OSCV
SPECIFIC_NAME:A_PALABR
例程_SCHEMA:GX70OSCV
ROUTINE_NAME:A_PLABR
例程_类型:功能
例程_创建:2021-08-26-13.57.46.963000
例程定义器:OVACAREZZA
ROUTINE_BODY:SQL
EXTERNAL_NAME:GX70OSCV/A_PALABR(A_PALABR_1)
外部语言:-
参数样式:-
IS_DETERMINISTIC:否
SQL_DATA_ACCESS:读取
SQL_PATH:“QSYS”、“QSYS2”、“SYSPROC”、“SYSIBMADM”、“GX70OSCV”
虽然您无法直接在
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.