在DB2中创建参数化游标

时间:2016-03-12 21:31:34

标签: sql db2 cursor

我面对以下错误: An unexpected token "(" was found following " CURSOR ". Expected tokens may include: "CURSOR". SQLSTATE=42601

我只是想创建一个简单的游标,实际上是一个找到here in IBM documentation的示例。

光标声明类似于:

DECLARE
CURSOR c1 (max_wage NUMBER) IS
SELECT * FROM emp WHERE sal < max_wage;

不确定这是否与正在使用的DB2版本有关。任何人都可以建议替代创建参数化游标吗?

1 个答案:

答案 0 :(得分:0)

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

  1. 打开DB2命令窗口(在管理员模式下)
  2. 运行db2start
  3. 运行db2set DB2_COMPATIBILITY_VECTOR=ORA
  4. 运行db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
  5. 运行db2stop
  6. 运行db2start
  7. 执行您的PL / SQL语句,例如在DB2 CLP(运行db2 -tv)命令窗口中。
  8. 请注意,在尝试PL / SQL之前,应在DB2 CLP中运行 SET 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;
    /
    

    如果您不想执行上述所有操作,请使用标准DB2游标语法:

    DECLARE [cursor name] CURSOR FOR [...]
    

    ...但是这不支持参数化游标。为此,我建议使用参数创建存储过程。然后,此存储过程可以直接在SQL中使用该参数创建游标。