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数据类型,则必须使用正确的设置创建数据库,也是。有关更多详细信息,请参阅。该文章的摘要如下:
db2start
db2set DB2\u DEFERRED\u PREPARE\u SEMANTICS=YES
db2stop
db2start
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 [...]