2017-02-09 143 views
0

我有以下工作DB2 SQL函数DB2 SQL函数与动态返回值

CREATE OR REPLACE FUNCTION selector (param VARCHAR(3)) 
RETURNS TABLE (id INT, CMD VARCHAR(1024), ATTR CHAR(10)) 
LANGUAGE SQL 
DETERMINISTIC 
NO EXTERNAL ACTION 
RETURN 
    SELECT id, cmd, attr 
     FROM test.commandtbl c 
     WHERE c.attr=param; 

调用它像:

select * from table (selector('c'))!  

的问题是,我想回表的大小动态并键入。 我想使用具有很多返回字段的函数,并且在测试时我不想总是检查返回表,但它仍然匹配。

例如:

测试1是具有5返回列:INT,INT,INT,CHAR(10),VARCHAR(100)

Test2的是用20返回列:10 VARCHAR(100)和10 INT

等等。

有没有办法做到这一点?

+0

什么是DB2版本/平台? – mustaccio

+0

Windows 7,DB2 v10 – Thevagabond

+0

Windows上没有DB2 v10--有10.1和10.5,哪一个? – mustaccio

回答

0

您可以将SQL视为静态类型语言,因为它在运行时无法发现其变量(例如列)和对象(例如结果集)数据类型;你必须在语句编译时声明类型。换句话说,你想达到什么是不可能的。

有一个generic table function的概念,它允许你定义一个基于Java的UDF返回一些结果集:

CREATE FUNCTION selector (param VARCHAR(3)) 
RETURNS GENERIC TABLE 
EXTERNAL NAME... 

不过,你仍然需要声明在接收结果集结构end:

SELECT t.* FROM TABLE (selector('c')) AS t (foo INT, bar INT, baz VARCHAR(10)...) 
+0

当我使用它,我得到SQLCODE = -628,SQLSTATE = 42613 – Thevagabond

+0

当你使用什么?完全按照手册中的示例进行操作。 – mustaccio

+0

'CREATE OR REPLACE FUNCTION选择器(PARAM VARCHAR(3)) RETURNS GENERIC TABLE EXTERNAL NAME '选择' DETERMINISTIC NO EXTERNAL ACTION RETURN SELECT标识,CMD,ATTR FROM test.commandtblÇ WHERE c.attr = param;' 'SELECT t。* FROM TABLE(selector('c'))AS t(id INT,cmd VARCHAR(1024),attr VARCHAR(10))!' – Thevagabond