Выполнение подготовленного SQL в функции без цикла, возвращающего таблицу - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть этот источник здесь:

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')) @

Он должен просто выполнить SQL в подготовленном операторе S1, и я не хочу использовать цикл в функции.

Я использую DB2 Windows 10.5

Есть идеи, как это исправить?

Я знаю, что EXEC (S1) не так, но я не могу найти на странице IBM ничего, что показывало бы, как заставить это работать.

Спасибо за вашу помощь.

Viking

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Не уверен, что он соответствует вашим потребностям, но вы можете использовать выражение для выбора столбцов для таблицы результатов. Я не думаю, что fetch first поддерживается в функциях, но вы можете добавить это в вызов:

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;
0 голосов
/ 09 ноября 2018

Использование промежуточного СОЗДАННОГО ГЛОБАЛЬНОГО ВРЕМЕННОГО СТОЛА.

--#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@
...