新车轻微抖动正常吗:DB2 -Cursor sample

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 04:17:40
DB2 简单的游标处理例子2011-11-19 16:12

首先, 以  db2 -td@  进入系统。

也就是以 @ 作为 语句终止字符

 

测试表与数据

db2 =>  select * from test_main@

ID          VALUE
----------- ----------
          1 ONE
          2 TWO
          3 THREE

  3 条记录已选择。

 

output_debug 表,为只有1列的 测试表,用于暂时存储中间过程的数据。 

 

 

简单循环处理I

TRUNCATE TABLE output_debug IMMEDIATE@

BEGIN
  -- 暂存变量.
  DECLARE  v_id    INT;
  DECLARE  v_value VARCHAR(10);
  DECLARE  SQLCODE INT;
  -- 定义游标.
  DECLARE c_test_main CURSOR FOR
      SELECT id, value FROM test_main;
  -- 打开游标.
  OPEN c_test_main;
  -- 填充数据.
  FETCH c_test_main INTO v_id, v_value;
  -- 假如检索到了数据,才处理.
  WHILE (SQLCODE = 0) DO
    INSERT INTO output_debug VALUES(v_value);
    -- 填充下一条数据.
    FETCH c_test_main INTO v_id, v_value;
  END WHILE;
  -- 关闭游标
  CLOSE c_test_main;
END
@

 

db2 => select * from output_debug@
DATA
------------------------------------
ONE
TWO
THREE

  3 条记录已选择。

 

 

简单循环处理II

 

TRUNCATE TABLE output_debug IMMEDIATE@

BEGIN
  -- 暂存变量.
  DECLARE  v_id    INT;
  DECLARE  v_value VARCHAR(10);
  DECLARE SQLCODE INT;
  -- 定义游标.
  DECLARE c_test_main CURSOR FOR
      SELECT id, value FROM test_main;
  -- 打开游标.
  OPEN c_test_main;
  MyLoop: LOOP
    -- 填充数据.
    FETCH c_test_main INTO v_id, v_value;
    IF (SQLCODE = 0) THEN
      -- 假如检索到了数据,插入 debug 表.
      INSERT INTO output_debug VALUES(v_value);
    ELSE
      -- 假如没有数据,跳出循环.
      LEAVE MyLoop;
    END IF;
  END LOOP;
  -- 关闭游标
  CLOSE c_test_main;
END
@

 

db2 => select * from output_debug@
DATA
------------------------------------
ONE
TWO
THREE

  3 条记录已选择。

 

用于更新的游标

 

BEGIN
  -- 暂存变量.
  DECLARE  v_id    INT;
  DECLARE  v_value VARCHAR(10);
  DECLARE SQLCODE INT;
  -- 定义游标.
  -- with hold 选项。如果循环内有commit或rollback 保持该cursor不被关闭
  DECLARE c_test_main CURSOR with hold FOR
      SELECT id, value FROM test_main  for update;
  -- 打开游标.
  OPEN c_test_main;
  MyLoop: LOOP
    -- 填充数据.
    FETCH c_test_main INTO v_id, v_value;
    IF (SQLCODE = 0) THEN
      -- 假如检索到了数据,修改 test_main 表.
      UPDATE
        test_main
      SET
        value = value || '1'
      WHERE
        CURRENT OF c_test_main;
    ELSE
      -- 假如没有数据,跳出循环.
      LEAVE MyLoop;
    END IF;
  END LOOP;
  -- 关闭游标
  CLOSE c_test_main;
END
@

 

db2 => select * from test_main@

ID          VALUE
----------- ----------
          1 ONE1
          2 TWO1
          3 THREE1

  3 条记录已选择。

 

 

FOR的使用 

 

TRUNCATE TABLE output_debug IMMEDIATE@

BEGIN
  -- 游标处理.
  FOR  V1 AS c_test_main CURSOR FOR
      SELECT id, value FROM test_main
  DO
    INSERT INTO output_debug VALUES(V1.value);
  END FOR;
END
@

 

db2 => select * from output_debug@
DATA
-----------------------------------
ONE1
TWO1
THREE1

  3 条记录已选择。