Stored procedures 使用游标的DB2存储过程
DB2V9z/OsStored procedures 使用游标的DB2存储过程,stored-procedures,cursor,db2,updating,Stored Procedures,Cursor,Db2,Updating,DB2V9z/Os CREATE PROCEDURE SERDB.I21MMSNOUPD () RESULT SETS 1 LANGUAGE SQL FENCED COLLID SER WLM ENVIRONMENT DDSNSPENV RUN OPTIONS 'NOTEST(NONE,*,*,*)' P1: BEGIN --Declare variables DECLARE CONSUMER INTEGER; DECLARE NEW_MMS_NO INTEGER;
CREATE PROCEDURE SERDB.I21MMSNOUPD ()
RESULT SETS 1
LANGUAGE SQL
FENCED
COLLID SER
WLM ENVIRONMENT DDSNSPENV
RUN OPTIONS 'NOTEST(NONE,*,*,*)'
P1: BEGIN
--Declare variables
DECLARE CONSUMER INTEGER;
DECLARE NEW_MMS_NO INTEGER;
DECLARE END_TABLE INT DEFAULT 0;
DECLARE C1 CURSOR FOR
SELECT I20_CONSUMER_ID,
NEW_MMS_NO
FROM SERDB.I20_TEMP
-- WHERE I20_CONSUMER_ID = 164921;
ORDER BY I20_CONSUMER_ID;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET END_TABLE = 1;
OPEN C1;
FETCH C1 INTO CONSUMER,
NEW_MMS_NO;
WHILE END_TABLE = 0 DO
UPDATE SERDB.I20_CONSUMER_T
SET I20_MMS_NO = NEW_MMS_NO
WHERE I20_CONSUMER_ID = CONSUMER;
END WHILE;
CLOSE C1;
END P1
上面的存储过程使用cond代码0生成,但即使在特定的使用者id出现时也无法执行。是否有人看到错误
单个sql语句完全按照它们应该的方式运行
我遵循了IBM的SQL过程中的游标示例
谢谢你我百分之百同意@X-Zero,当你可以做一个简单的基于集合的操作(可能有更好的性能)时,定义游标和其他东西似乎需要大量的工作。以下是两个示例,说明如何使用单个操作完成此操作: 正常: 新热度:
这些都是在DB2 for Linux/Unix/Windows v9.7上测试的,但是应该可以在任何比9.1更新的DB2版本上使用(DB2 for iSeries是一个通配符,我永远不记得该平台支持什么或不支持什么:))FETCH命令必须在WHILE中,因此每次调用它时,它都会获取一行。您知道这是可能的(可能)不使用游标可以做得更好,对吗?也就是说,假设更新的行的大小(对于事务而言)不太大,可以在单个
UPDATE
语句中完成。大多数情况下,更喜欢使用“普通”语句而不是游标,除非结果集是分页的(如向用户显示时),或者需要“批处理”的更新/删除/任何内容(如果锁定的行数太大)。我的iSeries不支持合并
,但第一个应该可以正常工作(这正是我所想的)。
UPDATE SESSION.I20_CONSUMER_T A
SET I20_MMS_NO = (
SELECT NEW_MMS_NO
FROM SESSION.I20_TEMP B
WHERE A.I20_CONSUMER_ID = B.CONSUMER
)
WHERE EXISTS (
SELECT 1
FROM SESSION.I20_TEMP C
WHERE A.I20_CONSUMER_ID = C.CONSUMER
)
MERGE INTO SESSION.I20_CONSUMER_T AS T
USING SESSION.I20_TEMP AS M
ON T.I20_CONSUMER_ID = M.CONSUMER
WHEN MATCHED THEN
UPDATE SET T.I20_MMS_NO = M.NEW_MMS_NO
ELSE IGNORE