Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有不同返回值的函数_Sql_Function_If Statement_Db2_Return - Fatal编程技术网

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
;