为什么在此函数中使用IF语句会导致错误42601 SQL0104,如下所示。这是用于I v7r3m0的DB2-400。
SQL Error [42601]: [SQL0104] Token <END-OF-STATEMENT> was not valid. Valid tokens: ;.
下面我提供的代码示例执行时不会出错,直到IF语句取消注释为止。我试着移动分号,甚至移除它们,但是错误会变得更糟,并开始指向后面的语句无效。
我检查了关于v7r3上的IBM文档,我的语法似乎是正确的。其他代码示例遵循与我的语法相同的语法。我很困惑。
CREATE OR REPLACE FUNCTION F_CERT.CERT_UPC_COMMON_DESC (UPC NUMERIC(14))
RETURNS INTEGER
LANGUAGE SQL
GLOBAL DETERMINISTIC
NO EXTERNAL ACTION
NOT FENCED
ALLOW PARALLEL
BEGIN
DECLARE RETVAL INTEGER DEFAULT 0 ;
DECLARE UPC_COUNT INTEGER DEFAULT 0 ;
DECLARE UPC_LIST CURSOR FOR
SELECT COUNT(*)
FROM F_CERTOB.BEERXT
WHERE BXUPCR=UPC
;
OPEN UPC_LIST ;
FETCH UPC_LIST INTO UPC_COUNT ;
CLOSE UPC_LIST ;
-- IF UPC_COUNT > 0 THEN
-- -- OTHER
-- -- COMMANDS
SET RETVAL = UPC_COUNT ;
-- END IF ;
RETURN RETVAL ;
END ;
SELECT F_CERT.CERT_UPC_COMMON_DESC (793936791660) AS C FROM SYSIBM.SYSDUMMY1 ;编辑:
这是第二个例子,一个精简的版本。与上面的代码一样,一切都很好,直到IF语句没有注释为止:
CREATE OR REPLACE FUNCTION F_CERT.CERT_UPC_COMMON_DESC (UPC NUMERIC(14))
RETURNS INTEGER
LANGUAGE SQL
BEGIN
DECLARE RETVAL INTEGER DEFAULT 0 ;
-- IF 1=1 THEN
SET RETVAL = 1 ;
-- ELSE
SET RETVAL = 100 ;
-- END IF ;
RETURN RETVAL ;
END ;
SELECT F_CERT.CERT_UPC_COMMON_DESC (12345) AS C FROM SYSIBM.SYSDUMMY1 ;发布于 2019-09-06 20:35:10
从我的操作开始,我一直在继续搜索,最后找到了确切的解决方案这里。
问题是语句分隔符。当函数包含跨多行的流控制和类似结构的语句时,就会发生冲突。在我的代码示例中,编译器停留在END IF;,认为这就是全部,而不是继续函数的END;。
我的different是DBeaver 5.2.5,它确实具有以不同方式运行语句和脚本的一些功能。这篇文章给了我一个想法,尝试用DBeaver的不同动作来运行我的CREATE脚本,我发现如果我突出显示从CREATE到END的整个脚本,但不包括尾随分号,我就可以让它工作。然后我用Execute Statement {Ctrl+Enter}代替了通常的Execute Sctipt {Alt+X}。终于成功了!但这似乎“疯狂”,所以我继续寻找一个解决办法。
然后,我在上面提到的主要文章中发现了不完美但完全可以接受的解决方案。我按照指示更改了我的DBeaver客户机中的设置,并编辑了如下代码(注意@字符)。最后终于成功了!我可以运行整个脚本,包括SELECT语句,并且能够通过我已经习惯的通常的Execute Statement {Alt+X}击键来运行。
CREATE OR REPLACE FUNCTION F_CERT.CERT_UPC_COMMON_DESC (UPC NUMERIC(14))
RETURNS INTEGER
LANGUAGE SQL
BEGIN
DECLARE RETVAL INTEGER DEFAULT 0;
IF 1=0 THEN
SET RETVAL = 1;
ELSE
SET RETVAL = 100;
END IF;
RETURN RETVAL;
END @
SELECT F_CERT.CERT_UPC_COMMON_DESC (793936791660) AS C FROM SYSIBM.SYSDUMMY1 @ https://stackoverflow.com/questions/57826590
复制相似问题