【问题标题】:DB2 Stored Procedure using a Cursor使用游标的 DB2 存储过程
【发布时间】: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


【解决方案1】:

我 100% 同意 @X-Zero,当您可以执行简单的基于集合的操作(可能具有更好的性能)时,这似乎是定义游标和其他东西的大量工作。下面是两个示例,说明如何通过单个操作完成此操作:

普通UPDATE:

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热度:

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

这些已在 DB2 for Linux/Unix/Windows v9.7 上进行了测试,但应该适用于任何比 9.1 更新的 DB2 版本(DB2 for iSeries 是一个通配符,我不记得那个平台支持或不支持什么@ 987654327@)

【讨论】:

  • 我的 iSeries 不支持MERGE,但第一个应该可以正常工作(这正是我的想法)。
【解决方案2】:

FETCH 命令必须在 WHILE 内,这样每次调用时,它都会获取一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2020-02-04
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多