如何写一个简单的 update 和 select 存储过程?

2016-02-03 17:10:48 +08:00
 flyingnn

自己写了一下,执行不成功:

CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
SPECIFIC DB2INST1.GETPEOPLE2
DYNAMIC RESULT SETS 1
MODIFIES SQL DATA
LANGUAGE SQL

BEGIN 
    update test2 set a=a+1 where a>ids;
    DECLARE rs1 CURSOR 
    select * from db2inst1.test2;
    OPEN rs1;

END

错误显示:

SQL0104N 在 "ids; DECLARE" 之后发现意外的标记 "rs1 CURSOR sele"。期望的标记可能包括:"<psm_variable_name_list>"。 LINE NUMBER=10. SQLSTATE=42601

感觉 DB2 写东西很难上手,郁闷中。。。

2631 次点击
所在节点    问与答
7 条回复
flyingnn
2016-02-03 17:11:27 +08:00
对了,是 DB2 的 存储过程。
ivvei
2016-02-03 17:21:31 +08:00
你能不能先把基础语法学习下…… Declare 一个游标后可以直接这么加语句? FOR 都不需要?
flyingnn
2016-02-03 17:33:13 +08:00
嗯,是删除了部份,漏掉了,
CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
SPECIFIC DB2INST1.GETPEOPLE2
DYNAMIC RESULT SETS 1
MODIFIES SQL DATA
--READS SQL DATA
LANGUAGE SQL

BEGIN
update test2 set a=a+1 where a>ids;
DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR
select * from db2inst1.test2;
OPEN rs1;
END

当没有 update 这句,是可以成功 create 的,加了 update,就不行了。

主要是用得少,没怎么去看文档。
flyingnn
2016-02-03 17:54:16 +08:00
@ivvei
这个写没问题:
CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
SPECIFIC DB2INST1.GETPEOPLE2
DYNAMIC RESULT SETS 1
MODIFIES SQL DATA
--READS SQL DATA
LANGUAGE SQL

BEGIN
DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR select * from db2inst1.test2;
update test2 set a=a+1 where a>ids;
commit;
OPEN rs1;
END

这样就不行了:

CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
SPECIFIC DB2INST1.GETPEOPLE2
DYNAMIC RESULT SETS 1
MODIFIES SQL DATA
--READS SQL DATA
LANGUAGE SQL

BEGIN
update test2 set a=a+1 where a>ids;
DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR select * from db2inst1.test2;

OPEN rs1;
END

提示:
SQL0104N 在 "" 之后发现意外的标记 "<cursor declaration>"。期望的标记可能包括:"<SQL statement>"。 LINE NUMBER=10. SQLSTATE=42601
ivvei
2016-02-03 18:17:19 +08:00
@flyingnn begin 后面游标声明的前面 这段 不要有可执行语句。 DB2 特性如此,只能接受。
flyingnn
2016-02-04 09:28:19 +08:00
@ivvei 那像我这样的需求不可以实现吗?先 update ,再 select 返回。
flyingnn
2016-02-04 09:43:06 +08:00
@ivvei 明白了, update 放在后面也没有关系,放在 open 语句之前和之后,返回的结果都是一样的,都是 update 后的结果。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/255236

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX