I am trying to create a custom function that returns a table in DB2. Here is what I still have.
This is the table I'm using:
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");
This is a custom function that returns a table (which works fine):
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
This is how far I could get with the module:
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))
Any attempts to actually add a function to the module failed with various errors. Here is my DB2 version information: Database Server = DB2 / LINUXX8664 11.1.2.2 This is an Express-C installation under Redhat.
When I try to do this, I get SQL0628N Multiple or conflicting keywords containing the sentence "RETURNS", present. 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
When I try to do this (the RETURNS clause is deleted), I get the SQL0491N CREATE FUNCTION or ALTER MODULE statement used to define "CORPDATA.MODULE1.DEPTEMPLOYEES" should have a RETURNS clause and one of the following: EXTERNAL (with other keywords); SQL function body or SOURCE offer. 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
When I try to do this (deleted by BEGIN ATOMIC), I get SQL0104N An unexpected token "SELECT" was found after "INISTIC RETURN". Expected tokens may include: "(". LINE NUMBER = 9. SQLSTATE = 42601 :) Yes, it says "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