我想使用给定的参数在函数中返回一个表。
该语句在最后会很长,这就是为什么我想使用游标。
如何解决以下错误并从游标中检索表作为返回值。
{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
问题中的示例代码至少存在两个问题。
第一个问题是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