我面对以下错误:
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版本有关。任何人都可以建议替代创建参数化游标吗?
答案 0 :(得分:0)
您正在尝试在DB2中使用PL / SQL语法。这需要更改服务器环境。如果您还想支持Oracle数据类型,则必须使用正确的设置创建数据库。有关详细信息,请参阅this article。该文章的摘要是:
db2start
db2set DB2_COMPATIBILITY_VECTOR=ORA
db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES
db2stop
db2start
db2 -tv
)命令窗口中。请注意,在尝试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中使用该参数创建游标。