我在这里有这个来源:
CREATE OR REPLACE FUNCTION SWITCHTEST (CHOICE VARCHAR(10))
RETURNS TABLE ( R_COL1 VARCHAR(1024) ,R_COL2 VARCHAR(1024) )
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE SELECT1 VARCHAR(1024);
DECLARE L_COL1 VARCHAR(1024);
DECLARE L_COL2 VARCHAR(1024);
SET SELECT1 = 'SELECT TEST, DESCR FROM TESTTAB FETCH FIRST 10 ROWS ONLY';
SET SELECT2 = 'SELECT DESCR, COLOUR FROM TESTTAB FETCH FIRST 10 ROWS ONLY';
IF CHOICE = 'FIRST' THEN
PREPARE S1 FROM SELECT1;
ELSEIF CHOICE = 'SECOND' THEN
PREPARE S1 FROM SELECT2;
ELSE
END IF;
RETURN EXEC(S1);
END@
像
那样调用SELECT * FROM TABLE (SWITCHTEST('FIRST')) @
它应该只在S1准备语句中执行SQL,而我不想在函数中使用循环。
我正在运行DB2 Windows 10.5
关于如何解决此问题的任何想法?
我知道EXEC(S1)是错误的,但是在显示如何进行此工作的IBM页面上找不到任何东西。
谢谢您的帮助。
维京人
答案 0 :(得分:0)
使用中间创建的全局临时表。
--#SET TERMINATOR @
CREATE GLOBAL TEMPORARY TABLE SWITCHTEST ( R_COL1 VARCHAR(1024) ,R_COL2 VARCHAR(1024)) ON COMMIT PRESERVE ROWS NOT LOGGED@
CREATE OR REPLACE FUNCTION SWITCHTEST (CHOICE VARCHAR(10))
RETURNS TABLE (R_COL1 VARCHAR(1024), R_COL2 VARCHAR(1024) )
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN ATOMIC
DELETE FROM SWITCHTEST;
IF CHOICE='FIRST' THEN
INSERT INTO SWITCHTEST SELECT TEST, DESCR FROM TESTTAB FETCH FIRST 10 ROWS ONLY;
ELSEIF CHOICE='SECOND' THEN
INSERT INTO SWITCHTEST SELECT DESCR, COLOUR FROM TESTTAB FETCH FIRST 10 ROWS ONLY;
END IF;
RETURN SELECT R_COL1, R_COL2 FROM SWITCHTEST;
END@
答案 1 :(得分:0)
不确定是否满足您的需求,但是您可以使用案例表达式为结果表选择列。我认为函数不支持先获取,但您可以在调用中添加它:
CREATE OR REPLACE FUNCTION SWITCHTEST (CHOICE VARCHAR(10))
RETURNS TABLE ( R_COL1 VARCHAR(1024) ,R_COL2 VARCHAR(1024) )
LANGUAGE SQL
READS SQL DATA
RETURN
SELECT CASE CHOICE WHEN 'FIRST' THEN TEST ELSE DESCR END
, CASE CHOICE WHEN 'FIRST' THEN DESCR ELSE COLOUR END
FROM TESTTAB ;
SELECT * FROM TABLE (SWITCHTEST('FIRST'))
FETCH FIRST 10 ROWS ONLY;