【问题标题】:Temp table for user defined functions用户定义函数的临时表
【发布时间】:2023-03-20 09:55:01
【问题描述】:

我正在尝试在 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

【问题讨论】:

    标签: db2 user-defined-functions ibm-data-studio


    【解决方案1】:

    您的代码中有语法错误,详情请见下文。 除了语法错误,你的标题提到了临时表,但你的代码没有,所以你的问题很糟糕。

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

    在寻求有关 Db2 的帮助时,请始终在问题中填写 Db2 版本 Db2 所在的操作系统(Z/OS、i 系列、Linux/Unix/Windows) -server 运行,因为答案可能取决于这些事实。针对不同操作系统的不同版本的 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
    @
    

    【讨论】:

    • 大多数 IBM 文档都是无用的。这就是为什么在这里。从游标返回静态结果... ..没有原子...声明 x1 整数;从 csr 获取下一个到 x1; update myfile set p=p+1 where current of csr;关闭企业社会责任; return select * from myfile where x = x1;结束;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多