1

我正在 System i V7R1 上创建一个 SQL 函数:

CREATE FUNCTION MYSCHEMA.GROUPDIBAS(v_code VARCHAR(50))
RETURNS VARCHAR(2048)
LANGUAGE SQL
BEGIN
    DECLARE str VARCHAR(2048);
    SET str = '';
    FOR row AS (
        SELECT 
            FIELD2
        FROM MYSCHEMA.DIBAS
        WHERE FIELD1 = v_code
    )
    DO
        SET str = 'Bubi'; --I removed many statements to make clear the problem doesn't come from them
    END FOR;
    RETURN str;
END
;

我使用 iSeries Navigator V7R1 中的“运行 SQL 脚本”工具执行它。它可以在另一台 V7R1 服务器上运行(使用 iSeries Navigator V5R4),但不能在我现在工作的那个服务器上运行。它失败并显示此消息:

SQL State: 42601
Vendor Code: -104
Message: [SQL0104] Token <END-OF-STATEMENT> was not valid. Valid tokens: ;.
  Cause . . . . . :   A syntax error was detected at token <END-OF-STATEMENT>.
  Token <END-OF-STATEMENT> is not a valid token.  A partial list of valid tokens is ;.
  This list assumes that the statement is correct up to the token.
  The error may be earlier in the statement, but the syntax of the statement appears to be valid up to this point.
  Recovery  . . . :   Do one or more of the following and try the request again:
  -- Verify the SQL statement in the area of the token <END-OF-STATEMENT>. Correct the statement.
     The error could be a missing comma or quotation mark, it could be a misspelled word, or it could be related to the order of clauses.
  -- If the error token is <END-OF-STATEMENT>, correct the SQL statement because it does not end with a valid clause.

如果我删除FOR块,它的工作原理。

此外,如果我用 5250 Emulator 命令 STRSQL 执行该语句,它就可以工作。所以这似乎是“运行 SQL 脚本”客户端中的一个错误。

任何提示将不胜感激!

4

3 回答 3

4

问题在于FOR 语句。查询分析器在什么时候cursor-name CURSOR FOR是可选的和什么时候是必需的方面是不一致的,即使文档说明如果它没有指定,就会生成一个唯一的游标名称。通过 IBM Access Navigator Run Scripts 实用程序提交的 SQL 需要它。

FOR 语法

括号也不正确,但有时它们被接受(STRSQL、Navigator Run SQL Scripts),有时它们不是(DBVisualizer/JDBC)。

TIL必须根据查询的来源运行不同的查询分析器。

CREATE FUNCTION MYSCHEMA.GROUPDIBAS(v_code VARCHAR(50))
RETURNS VARCHAR(2048)
LANGUAGE SQL
BEGIN
    DECLARE str VARCHAR(2048);
    SET str = '';
    FOR row AS C1 CURSOR FOR
        SELECT 
            FIELD2
        FROM MYSCHEMA.DIBAS
        WHERE FIELD1 = v_code
    DO
        SET str = 'Bubi'; --I removed many statements to make clear the problem doesn't come from them
    END FOR;
    RETURN str;
END

查询1

查询2

于 2011-10-27T13:45:52.990 回答
1

鉴于@JamesA 和我所做的测试,我担心问题可能出在该服务器没有而其他服务器没有的程序临时修复(PTF) 中。具体来说,运行WRKPTFGRP命令,我猜它可能错过了这个 PTF 组:

PTF group  Level  Text
SF99701        5  DB2 FOR IBM I

不幸的是,我现在无法尝试安装它:(。

于 2011-10-27T15:24:47.460 回答
1

在 IDE 的会话属性中,将Statement Separator字段值从更改;|然后重新连接您的会话。然后使用|而不是;. 这样您就可以运行您的语句或过程或函数。

usage example,
CREATE FUNCTION MYSCHEMA.GROUPDIBAS(v_code VARCHAR(50))
RETURNS VARCHAR(2048)
LANGUAGE SQL
BEGIN
    DECLARE str VARCHAR(2048);
    SET str = '';
    FOR row AS C1 CURSOR FOR
        SELECT 
            FIELD2
        FROM MYSCHEMA.DIBAS
        WHERE FIELD1 = v_code
    DO
        SET str = 'Bubi'; --I removed many statements to make clear the problem doesn't come from them
    END FOR;
    RETURN str;
END |
于 2016-06-14T14:19:46.120 回答