DB2 表函数

问题描述 投票:0回答:1

我想使用给定的参数在函数中返回一个表。
该语句在最后会很长,这就是为什么我想使用游标。

如何解决以下错误并从游标中检索表作为返回值。

{0:0} 在“”后面发现了意外的标记“FOR”。预期的代币可能包括:“ 声明 C1 游标”.. SQLCODE=-104,SQLSTATE=42601,DRIVER=4.28.11

 CREATE OR REPLACE FUNCTION "TT"."MY_FUNC" ()
    RETURNS TABLE(LIMITT INT)
    LANGUAGE SQL
    READS SQL DATA
    NO EXTERNAL ACTION
    DETERMINISTIC
    BEGIN ATOMIC
    
    DECLARE STMT CLOB(1K);
    DECLARE C1 CURSOR FOR S1;
    
    SET STMT = 'SELECT 1 FROM FROM SYSIBM.SYSDUMMY1 LIMIT '''|| LIMITT ||'''';
    PREPARE S1 FROM STMT;
    OPEN C1;
    CLOSE C1;
    
    RETURN 
    --table
    END
db2 db2-luw
1个回答
0
投票

问题中的示例代码至少存在两个问题。

第一个问题是LIMIT子句不能有变量,它只能有一个常量整数。换句话说,你不能有

LIMIT '''|| some_variable ||''''
,但你可以有
LIMIT 100 
LIMIT 1000
或任何固定数字。

您可以在编译例程中使用动态 SQL,以便在运行时进行最终 SQL 查询(即每次进行准备时,您可以指定不同的常量整数),然后准备并执行该代码。这可能很浪费。研究文档和示例程序以了解如何使用动态 SQL,因为这超出了本答案的范围。

第二个问题是你不能在 SQL 内联函数中使用游标,即在 BEGIN ATOMIC 函数中。您可以仅使用 BEGIN (而不是 BEGIN ATOMIC)来编译该函数。

另一个问题是,您对为什么需要光标的描述毫无意义。要返回表格,您需要

RETURN (SELECT... FROM someTable)
,而
SELECT
可能又长又复杂。您似乎正在学习,因此花时间研究样本可能是您的最佳选择。

考虑研究文档和示例程序以了解更多信息。示例程序位于 DB2-LUW 服务器“samples”目录树中,它们也在 github 上,并且也在 Db2-LUW-知识中心中。

请参阅此处文档中的内联 SQL 限制 https://www.ibm.com/docs/en/db2/11.5?topic=support-inline-sql-pl

© www.soinside.com 2019 - 2024. All rights reserved.