如何在 DB2 模块中创建 returns a table 的用户定义函数?
How to create a user defined function that returns a table in a DB2 module?
我正在尝试在 DB2 中创建一个 returns 和 table 的用户定义函数。这是我目前所拥有的。
这是我使用的table:
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");
这是一个用户定义的函数,returns一个table(工作正常):
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" 子句的多个关键字或冲突关键字是
当前的。行号=16。 SQL状态=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 函数体;或者
源条款。行号=8。 SQL状态=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 在“INISTIC”之后发现意外标记 "SELECT"
RETURN "。预期的标记可能包括:"("。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
看来 DB2 LUW 版本 11.1 尚未完全支持模块内的 table-函数,除非 table-函数包含 PIPE 语句。尽管已发布的文档表明有一些限制是可能的。这就是您收到 "conflicting keywords" 错误的原因,因为流水线函数一次只能 return 一行,这与 RETURNS TABLE.[=12= 相反]
还要检查实现流水线函数是否可以满足您在这方面的要求。
当模块到达 Db2 V9.7 时,它们根本不支持模块中的 table 函数,但是从 V10.1 开始似乎对模块 table 函数提供了一些支持,尽管文档含糊不清,缺少可用的示例,并且没有专门为此更新示例。
从 2014 年开始在 developerworks 上提到了此限制。
如果这对您的公司很重要,请考虑打开增强请求 (RFE),google 了解详细信息。
您可能还想在 alter-module, and also on the restrictions-on-modules 页面的 Db2 知识中心页面上提交文档备注,其中没有提及模块内部 table-函数关于使用的附加限制PIPE 语句。
我正在尝试在 DB2 中创建一个 returns 和 table 的用户定义函数。这是我目前所拥有的。
这是我使用的table:
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");
这是一个用户定义的函数,returns一个table(工作正常):
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" 子句的多个关键字或冲突关键字是 当前的。行号=16。 SQL状态=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 函数体;或者 源条款。行号=8。 SQL状态=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 在“INISTIC”之后发现意外标记 "SELECT" RETURN "。预期的标记可能包括:"("。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
看来 DB2 LUW 版本 11.1 尚未完全支持模块内的 table-函数,除非 table-函数包含 PIPE 语句。尽管已发布的文档表明有一些限制是可能的。这就是您收到 "conflicting keywords" 错误的原因,因为流水线函数一次只能 return 一行,这与 RETURNS TABLE.[=12= 相反]
还要检查实现流水线函数是否可以满足您在这方面的要求。
当模块到达 Db2 V9.7 时,它们根本不支持模块中的 table 函数,但是从 V10.1 开始似乎对模块 table 函数提供了一些支持,尽管文档含糊不清,缺少可用的示例,并且没有专门为此更新示例。
从 2014 年开始在 developerworks 上提到了此限制。
如果这对您的公司很重要,请考虑打开增强请求 (RFE),google 了解详细信息。
您可能还想在 alter-module, and also on the restrictions-on-modules 页面的 Db2 知识中心页面上提交文档备注,其中没有提及模块内部 table-函数关于使用的附加限制PIPE 语句。