module - ¿Cómo crear una función definida por el usuario que devuelve una tabla en un módulo DB2?
user-defined-functions db2-luw (0)
Estoy intentando crear una función definida por el usuario que devuelva una tabla en DB2. Esto es lo que tengo hasta ahora.
Esta es una tabla que uso:
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");
Esta es una función definida por el usuario que devuelve una tabla (que funciona bien):
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
Este es un cuánto pude obtener con el módulo:
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))
Cualquier intento de agregar una función a un módulo falló con varios errores. Aquí está la información de mi versión de DB2: Servidor de base de datos = DB2 / LINUXX8664 11.1.2.2 Esta es una instalación de Express-C en Redhat.
Cuando intento esto, obtengo SQL0628N Están presentes palabras clave múltiples o conflictivas que involucran la cláusula "DEVOLUCIONES". NÚMERO DE LÍNEA = 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
Cuando intento esto (cláusula RETURNS eliminada), obtengo SQL0491N La sentencia CREATE FUNCTION o ALTER MODULE utilizada para definir "CORPDATA.MODULE1.DEPTEMPLOYEES" debe tener una cláusula RETURNS, y una de: la cláusula EXTERNAL (con otras palabras clave requeridas); un cuerpo de función SQL; o la cláusula 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
Cuando pruebo esto (eliminado BEGIN ATOMIC), obtengo SQL0104N Se encontró un token inesperado "SELECT" después de "INISTIC RETURN". Los tokens esperados pueden incluir: "(". LINE NUMBER = 9. SQLSTATE = 42601 :) Sí, dice "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