And*_*ykh 7 db2 module user-defined-functions db2-luw
我正在尝试创建一个在DB2中返回表的用户定义函数.这是我到目前为止所拥有的.
这是我使用的表:
CREATE TABLE "CORPDATA"."EMPLOYEE" (
"EMPNO" CHAR(6) NOT NULL,
"FIRSTNME" VARCHAR(12) NOT NULL,
"MIDINIT" CHAR(1) NOT NULL,
"LASTNAME" VARCHAR(15) NOT NULL,
"WORKDEPT" CHAR(3),
"PHONENO" CHAR(4),
"HIREDATE" DATE,
"JOB" CHAR(8),
"EDLEVEL" SMALLINT NOT NULL,
"SEX" CHAR(1),
"BIRTHDATE" DATE,
"SALARY" DECIMAL(9 , 2),
"BONUS" DECIMAL(9 , 2),
"COMM" DECIMAL(9 , 2)
);
ALTER TABLE "CORPDATA"."EMPLOYEE" ADD CONSTRAINT "PK_EMPLOYEE" PRIMARY KEY
("EMPNO");
Run Code Online (Sandbox Code Playgroud)
这是一个用户定义的函数,它返回一个表(工作正常):
CREATE OR REPLACE FUNCTION "CORPDATA"."DEPTEMPLOYEES" (DEPTNO CHAR(3))
RETURNS TABLE (EMPNO CHAR(6),
LASTNAME VARCHAR(15),
FIRSTNAME VARCHAR(12))
LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN ATOMIC
RETURN
SELECT EMPNO, LASTNAME, FIRSTNME
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = "DEPTEMPLOYEES".DEPTNO;
END
Run Code Online (Sandbox Code Playgroud)
这是我能够在多大程度上获得该模块:
CREATE MODULE CORPDATA.MODULE1
ALTER MODULE CORPDATA.MODULE1
PUBLISH FUNCTION DEPTEMPLOYEES2 (DEPTNO CHAR(3))
RETURNS TABLE (EMPNO CHAR(6),
LASTNAME VARCHAR(15),
FIRSTNAME VARCHAR(12))
Run Code Online (Sandbox Code Playgroud)
任何向模块实际添加功能的尝试都会因各种错误而失败.这是我的DB2版本信息:数据库服务器= DB2/LINUXX8664 11.1.2.2这是Redhat下的Express-C安装.
当我尝试这个时,我得到SQL0628N存在涉及"RETURNS"子句的多个或冲突的关键字.LINE NUMBER = 16.SQLSTATE = 42613
ALTER MODULE corpdata.module1
ADD FUNCTION DEPTEMPLOYEES (DEPTNO CHAR(3))
RETURNS TABLE (EMPNO CHAR(6),
LASTNAME VARCHAR(15),
FIRSTNAME VARCHAR(12))
LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN ATOMIC
RETURN
SELECT EMPNO, LASTNAME, FIRSTNME
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = "DEPTEMPLOYEES".DEPTNO;
END
Run Code Online (Sandbox Code Playgroud)
当我尝试这个(删除RETURNS子句)时,我得到SQL0491N用于定义"CORPDATA.MODULE1.DEPTEMPLOYEES"的CREATE FUNCTION或ALTER MODULE语句必须有一个RETURNS子句,以及一个:EXTERNAL子句(带有其他必需的关键字); 一个SQL函数体; 或SOURCE条款.LINE NUMBER = 8.SQLSTATE = 42601
ALTER MODULE corpdata.module1
ADD FUNCTION DEPTEMPLOYEES (DEPTNO CHAR(3))
LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN ATOMIC
RETURN
SELECT EMPNO, LASTNAME, FIRSTNME
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = "DEPTEMPLOYEES".DEPTNO;
END
Run Code Online (Sandbox Code Playgroud)
当我尝试这个(删除BEGIN ATOMIC)时,我得到SQL0104N在"INISTIC RETURN"之后发现了一个意外的令牌"SELECT".预期的令牌可能包括:"(".LINE NUMBER = 9.SQLSTATE = 42601 :)是的,确实说"INISTIC".
ALTER MODULE corpdata.module1
ADD FUNCTION DEPTEMPLOYEES (DEPTNO CHAR(3))
LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
RETURN
SELECT EMPNO, LASTNAME, FIRSTNME
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = "DEPTEMPLOYEES".DEPTNO
Run Code Online (Sandbox Code Playgroud)
看来 DB2 LUW 在版本 11.1 中尚未完全支持模块内的表函数,除非该表函数包含 PIPE 语句。尽管已发布的文档表明这是可能的,但有一些限制。这就是您收到“关键字冲突”错误的原因,因为管道函数一次只能返回一行,这与 RETURNS TABLE 相反。
还要检查实现管道函数是否可以满足您在这方面的要求。
当模块到达 Db2 V9.7 时,它们根本不支持模块中的表函数,但从 V10.1 开始,似乎对模块表函数有一些支持,尽管文档含糊不清,缺乏工作示例,并且示例也不是专门为此更新。
从 2014 年起,developerworks上就提到了这一限制。
如果这对您的公司很重要,请考虑提出增强请求 (RFE),通过 google 获取详细信息。
您可能还想在 Db2 知识中心页面上提交alter-module的文档注释,以及在模块限制页面上提交文档注释,其中没有提到有关使用 PIPE 的模块内表函数的附加限制陈述。