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

问题描述 投票:0回答:5

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

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 有办法做到这一点吗?

sql function stored-procedures db2 ibm-midrange
5个回答
1
投票

不清楚为什么需要表 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)


0
投票

这是我的真实情况

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

创建 GX70OSCV 的 PNUMAPAL 程序。

然后在该库中,存在该程序:
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 Objeto Tipo Atributo Texto
A_PALABR *SRVPGM CLE SQL 函数 A_PALABR

但是不允许使用:

SELECT * FROM (GX70OSCV/A_PALABR('12345')) as T

Símbolo ( no válido。Símbolos válidos: FULL LEFT CROSS INNER RIGHT E

我想知道这是怎么回事?


0
投票

我打开这个新线程是为了让事情变得更整洁

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 的 PNUMAPAL 程序。

那么在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

没有设置全局变量 GX70OSCV 的柱状图。

检查其定义:

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”


-1
投票

虽然您无法直接在

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.
© www.soinside.com 2019 - 2024. All rights reserved.