我正在尝试创建一个在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");
这是一个用户定义的函数,它返回一个表(工作正常):
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
这是我能够在多大程度上获得该模块:
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))
任何向模块实际添加功能的尝试都会因各种错误而失败。这是我的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
当我尝试这个(删除了RETURNS子句)时,我明白了 SQL0491N用于定义的CREATE FUNCTION或ALTER MODULE语句 " CORPDATA.MODULE1.DEPTEMPLOYEES"必须有一个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
当我尝试这个(删除BEGIN ATOMIC)时,我明白了 SQL0104N一个意外的令牌" SELECT"在" INISTIC之后被发现 返回"。预期的令牌可能包括:"("。行号= 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
答案 0 :(得分:1)
似乎DB2 LUW版本11.1尚未完全支持模块内的表函数,除非该表函数包含PIPE语句。尽管已发布的文档表明它可能存在一些限制。这就是你得到"冲突关键字的原因"错误,因为流水线函数一次只能返回一行,这与RETURNS TABLE相反。
检查实现流水线功能是否可以满足您在此领域的要求。
当模块到达Db2 V9.7时,它们根本不支持模块中的表函数,但是从V10.1开始,似乎对模块表函数有一些支持,尽管文档含糊不清,缺乏有用的示例和样品没有专门为此更新。
从{2014年开始developerworks提到了这一限制。
如果这对贵公司很重要,请考虑打开增强请求(RFE),谷歌了解详情。
您可能还想在alter-module的Db2知识中心页面上以及restrictions-on-modules页面上提交文档备注,但未提及有关模块内部表格功能的其他限制使用PIPE声明。