【发布时间】:2012-08-28 19:17:18
【问题描述】:
DB2 V9 Z/O
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 构建,但即使在特定的 consumer_id 时也无法执行。有人看出什么不对了吗?
单独的 sql 语句完全按预期运行。
我遵循了 IBM 的 SQL 过程中的游标示例。
谢谢
【问题讨论】:
-
你知道这可以(可能)做得更好没有光标,对吧?也就是说,这可以在单个
UPDATE语句中完成,假设更新的行的大小不是太大(对于事务)。大多数时候,首选“普通”语句而不是游标,除非结果集是分页的(如向用户显示时),或者更新/删除/需要“批处理”的任何内容(如果锁定的行数为太大)。
标签: stored-procedures cursor db2 updating