Stored procedures 使用游标的DB2存储过程

Stored 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;

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;
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