-1

我正在尝试在 DB2 的用户定义函数中使用临时表。我正在尝试在数据工作室中执行此操作,但下面的代码不起作用。我怎样才能使这项工作?

谢谢。

CREATE FUNCTION BELSIZE.TEST (aSTRING VARCHAR(50))
RETURNS TABLE(
column1 INTEGER
 )

F1: BEGIN ATOMIC

DECLARE c1 CURSOR WITH RETURN TO CLIENT FOR stmt;

SET v_dynStmt = 'SELECT 1 column1 from sysibm.sysdummy1';

PREPARE stmt FROM v_dynStmt;
OPEN c1;

RETURN
END
4

1 回答 1

1

您的代码中有语法错误,下面有更多详细信息。除了语法错误之外,您的标题还提到了临时表,但您的代码没有,所以您的问题很糟糕。

永远不要写“ ...不工作”,而是写出你看到的确切的 SQLCODE 和 SQLSTATE 和消息。

在寻求有关 Db2 的帮助时,请始终在问题中填写 Db2 版本运行 Db2 服务器的操作系统(Z/OS、i 系列、Linux/Unix/Windows),因为答案可能取决于那些事实。针对不同操作系统的不同版本的 Db2 具有不同的功能和不同的语法。

如果要将游标用于结果集,请使用 SQL PL 存储过程,因为限制较少。

SQL 表函数适用于不需要为结果集声明游标的情况。

当您使用 BEGIN ATOMIC 时,Db2-LUW 会阻止您在 SQL 表函数中声明游标。

如果您不使用 BEGIN ATOMIC,则 Db2-LUW(当前版本,即 v11.1)允许您在 SQL UDF 中声明游标,但不能直接使用该游标来返回结果集,就像在 SQL PL 中所做的那样存储过程。

对于您的示例,以下语法有效且无用,因此请考虑改用 SQL PL 过程:

--#SET TERMINATOR @

CREATE or replace FUNCTION BELSIZE.TEST (aSTRING VARCHAR(50))
RETURNS TABLE( column1 INTEGER)
language sql
specific belsize.test
BEGIN atomic
RETURN select 1 as column1 from sysibm.sysdummy1 ;
END
@

select * from table(belsize.test('a')) as t
@
于 2018-06-06T10:22:42.600 回答