Sql 具有不同返回值的函数
嗨,我有这个功能:Sql 具有不同返回值的函数,sql,function,if-statement,db2,return,Sql,Function,If Statement,Db2,Return,嗨,我有这个功能: CREATE or replace FUNCTION Tablereturn (SWITCHER INTEGER) RETURNS TABLE (Test CHAR(9), tester INTEGER ) LANGUAGE SQL CONTAINS SQL DETERMINISTIC NO EXTERNAL ACTION BEGIN DECLARE SELECT1, SELECT2 VA
CREATE or replace FUNCTION Tablereturn (SWITCHER INTEGER)
RETURNS TABLE (Test CHAR(9),
tester INTEGER
)
LANGUAGE SQL
CONTAINS SQL
DETERMINISTIC
NO EXTERNAL ACTION
BEGIN
DECLARE SELECT1, SELECT2 VARCHAR(1024);
set select1 ='SELECT TEST, TESTER FROM TESTTAB';
set select2 ='SELECT DUMMY, JAR, BRAND FROM TESTTAB';
IF (SWITCHER = '1') THEN return select1;
ELSEIF (SWITCHER = '2') THEN return select2;
END IF;
RETURN TABLE;
END@
打电话是
select TEST from TABLE(Tablereturn(1))@
或
问题是,它不起作用。编译器说在返回后,出现了意外的标记“SELECT1”。
我希望能够将其作为表调用,并根据需要从调用中选择值。
我不能将它作为一个使用select作为返回的过程来调用,因为我需要使用select作为一个表,并在一个更大的select中更改返回的输出。我可以在函数中立即执行吗
有什么想法吗?另一个问题是,如何使函数返回不同的表?select2返回3个值,而select1仅返回2个值
谢谢您的帮助。返回语句必须是函数的最后一条语句。有一类称为“流水线”的函数,可以使用“if-then-else”逻辑。像这样:
CREATE OR REPLACE FUNCTION TEST_PIPELINED(P_CHOICE INT)
RETURNS TABLE (R_COL1 VARCHAR(128), R_COL2 VARCHAR(128))
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE L_COL1 VARCHAR(128);
DECLARE L_COL2 VARCHAR(128);
DECLARE c1 CURSOR FOR S1;
IF P_CHOICE=1 THEN
PREPARE S1 FROM 'SELECT COLNAME, COLNO FROM SYSCAT.COLUMNS FETCH FIRST 10 ROWS ONLY';
ELSE
PREPARE S1 FROM 'SELECT TABNAME, OWNER FROM SYSCAT.TABLES FETCH FIRST 10 ROWS ONLY';
END IF;
OPEN c1;
L1: LOOP
FETCH c1 INTO L_COL1, L_COL2;
IF SQLSTATE<>'00000' THEN LEAVE L1; END IF;
PIPE(L_COL1, L_COL2);
END LOOP L1;
CLOSE c1;
RETURN;
END@
创建或替换功能测试\u流水线(P\u选项INT)
返回表(R_COL1 VARCHAR(128),R_COL2 VARCHAR(128))
开始
声明SQLSTATE字符(5);
声明L_COL1 VARCHAR(128);
声明L_COL2 VARCHAR(128);
为S1声明c1游标;
如果P_CHOICE=1,则
从“SELECT COLNAME,COLNO FROM SYSCAT.COLUMNS仅获取前10行”中准备S1;
其他的
从“SELECT TABNAME,OWNER FROM SYSCAT.TABLES仅获取前10行”中准备S1;
如果结束;
开c1;
L1:循环
取c1到L_COL1,L_COL2;
如果SQLSTATE为“00000”,则保留L1;如果结束;
管道(L_COL1,L_COL2);
端环L1;
关闭c1;
返回;
结束@
使用管道的另一种方法是这样简单
CREATE OR REPLACE FUNCTION TEST_CHOICE(P_CHOICE INT)
RETURNS TABLE (R_COL1 VARCHAR(128), R_COL2 VARCHAR(128))
RETURN
SELECT COLNAME, TYPENAME FROM SYSCAT.COLUMNS WHERE P_CHOICE = 1
UNION ALL
SELECT TABNAME, OWNER FROM SYSCAT.TABLES WHERE P_CHOICE = 2
;
“它不起作用”是什么意思?它的可能副本无法编译,因为select1不被接受。我不明白为什么它是副本?是否有一种方法可以根据P_的选择返回不同的表?如果你询问不同结构的结果集,那么不,你不能。结果集的结构必须与“RETURN TABLE(…)”子句中声明的结构相同。我们有一个名为“generic”的函数类,您可以在运行时声明结果集结构。但它们只能是JAVA(外部)函数,而不能是SQL函数。
CREATE OR REPLACE FUNCTION TEST_CHOICE(P_CHOICE INT)
RETURNS TABLE (R_COL1 VARCHAR(128), R_COL2 VARCHAR(128))
RETURN
SELECT COLNAME, TYPENAME FROM SYSCAT.COLUMNS WHERE P_CHOICE = 1
UNION ALL
SELECT TABNAME, OWNER FROM SYSCAT.TABLES WHERE P_CHOICE = 2
;