Sql 在DB2中创建参数化游标

Sql 在DB2中创建参数化游标,sql,db2,cursor,Sql,Db2,Cursor,我面临以下错误: 在“CURSOR”之后发现了一个意外的标记(“CURSOR”)。预期的标记可能包括:“CURSOR”。SQLSTATE=42601 我只是想创建一个简单的游标,实际上就是我们找到的例子 游标声明类似于: DECLARE CURSOR c1 (max_wage NUMBER) IS SELECT * FROM emp WHERE sal < max_wage; 声明 光标c1(最大工资编号)为 从emp中选择*,其中sal

我面临以下错误:
在“CURSOR”之后发现了一个意外的标记(“CURSOR”)。预期的标记可能包括:“CURSOR”。SQLSTATE=42601

我只是想创建一个简单的游标,实际上就是我们找到的例子

游标声明类似于:

DECLARE
CURSOR c1 (max_wage NUMBER) IS
SELECT * FROM emp WHERE sal < max_wage;
声明
光标c1(最大工资编号)为
从emp中选择*,其中sal<最高工资;

不确定这是否适用于正在使用的DB2版本。是否有人可以建议创建参数化游标的替代方案?

您正在尝试在DB2中使用PL/SQL语法。这需要更改服务器环境。如果您还想支持Oracle数据类型,则必须使用正确的设置创建数据库,也是。有关更多详细信息,请参阅。该文章的摘要如下:

  • 打开DB2命令窗口(在管理员模式下)
  • 运行
    db2start
  • 运行db2set DB2\u COMPATIBILITY\u VECTOR=ORA
  • 运行
    db2set DB2\u DEFERRED\u PREPARE\u SEMANTICS=YES
  • 运行
    db2stop
  • 运行
    db2start
  • 执行PL/SQL语句,例如在DB2CLP(run
    DB2-tv
    )命令窗口中执行
  • 请注意,您应该运行
    
    在尝试PL/SQL之前,在DB2 CLP中设置SQLCOMPAT PLSQL;
    。这允许使用正斜杠(
    /
    )作为PL/SQL语句终止符。显然,您也应该使用正斜杠终止命令:)

    下面是一个取自您的链接的示例,经过修改后可用于DB2中的默认
    SAMPLE
    数据库:

    SET SQLCOMPAT PLSQL;
    
    DECLARE
        my_record       emp%ROWTYPE;
        CURSOR c1 (max_wage integer) IS
            SELECT * FROM employee WHERE salary < max_wage;
    BEGIN
        OPEN c1(40000);
        LOOP
            FETCH c1 INTO my_record;
            EXIT WHEN c1%NOTFOUND;
            DBMS_OUTPUT.PUT_LINE('Name = ' || my_record.firstnme || ', salary = '
                || my_record.salary);
        END LOOP;
        CLOSE c1;
    END;
    /
    

    …但它不支持参数化游标。为此,我建议创建一个包含参数的存储过程。然后,此存储过程可以直接在SQL中使用该参数创建游标。

    是的,我尝试使用IBM文档中的精确语法。它不起作用,我创建了以您建议的格式定义的游标,但它似乎只适用于非参数化游标。我正试图根据IBM文档创建一个参数化游标,但没有luckAh。。。当我回复时,你与知识中心的链接不起作用。我没有意识到您试图使用PL/SQL语法。事实上,你确实需要施展一些魔法来实现这一点。我将修改我的回答,以反映……不要混合使用SQL PL和PL/SQL语法,并确保为后者启用Oracle兼容性。要扩展@mustaccio所说的内容……您提供的链接是针对Oracle兼容PL/SQL的。您必须打开Oracle兼容模式。本机DB2语法如下所示:
    DECLARE [cursor name] CURSOR FOR [...]