在函数中执行准备好的SQL,而无需循环返回表

时间:2018-11-09 13:29:42

标签: sql function variables db2 return

我在这里有这个来源:

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页面上找不到任何东西。

谢谢您的帮助。

维京人

2 个答案:

答案 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;