Function with different returns DB2

落爺英雄遲暮 提交于 2019-12-11 07:52:24

问题


Hi I have this function:

 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@

Calling would be

select TEST from TABLE(Tablereturn(1))@

or

select JAR from TABLE(Tablereturn(2))@

The problem is, that it doesn't work. Compiler says that after return the unexpected Token "SELECT1" is there. I want to be able to call it as a table and select values as I need them from the call. I can't just call it as a procedure with the select as return, since I need to work with the select as a table and change the returned output in a bigger select. Can I have EXECUTE IMMEDIATE in a function?

Any ideas? The other question is, how can I make the function return different tables? The select2 returns 3 values while select1 returns only 2.

Thank you for your help.


回答1:


RETURN statement must be the last statement of the function. There is a class of functions called 'pipelined' where you can use 'if then else' logic. Like this:

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@



回答2:


An alternative to using PIPE would be something simple like this

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
;


来源:https://stackoverflow.com/questions/52983941/function-with-different-returns-db2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!