具有动态返回值的DB2 SQL函数

时间:2017-02-09 11:17:15

标签: sql function db2 db2-luw

我有以下工作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'))!      

问题是我希望返回表的大小和类型是动态的。 我想使用带有大量返回字段的函数,并且在测试时我不想总是检查返回表,它仍然匹配。

例如:

Test1有5个返回列:INT,INT,INT,CHAR(10),VARCHAR(100)

Test2有20个返回列:10 VARCHAR(100)和10 INT

等等。

有办法吗?

1 个答案:

答案 0 :(得分:0)

您可以将SQL视为静态类型语言,因为它几乎没有能力在运行时发现其变量(例如列)和对象(例如结果集)数据类型;你必须在语句编译时声明类型。换句话说,你想要实现的目标是不可能的。

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

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

但是,您仍需要在接收端声明结果集结构:

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