oracle数据库 使用游标循环更新数据

Java中有多种实现循环的方式,数据库中可使用游标实现循环操作数据。

1. 存储过程中(较为严谨的写法)

CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(PI_BATCHNO IN  PKG_GLOBALS.T_BATCHNO)
  
   AS
   VC_SPNAME       PKG_GLOBALS.T_SPNAME; --记录操作表名称
   CUR_ACCOUNT     PKG_GLOBALS.T_CURSOR_REF; --操作游标
   VE_EXCEPTION    EXCEPTION;

    TYPE R_ACCOUNT IS RECORD(
      --定义结果集变量 
      --sql查询多少个字段这里就应该有多少个变量
      );
    TYPE  T_R_ACCOUNT IS TABLE OF R_ACCOUNT ;
    VRT_S_ACCOUNT T_R_ACCOUNT;
    VN_NEXT_SK        PKG_GLOBALS.T_NUMBER10;

  BEGIN
    OPEN CUR_ACCOUNT FOR
    --执行SQL

    LOOP
      FETCH CUR_ACCOUNT BULK COLLECT
        INTO VRT_S_ACCOUNT LIMIT 1000;
      EXIT WHEN VRT_S_ACCOUNT.COUNT = 0;

      FOR VN_ROWCOUNT IN 1 .. VRT_S_ACCOUNT.COUNT LOOP

    ---处理流程
    --调用结果集变量时编写:VRT_S_ACCOUNT.变量名
      END LOOP;
      COMMIT;
    END LOOP;
    CLOSE CUR_ACCOUNT;

  EXCEPTION
    WHEN VE_EXCEPTION THEN
      IF CUR_ACCOUNT%ISOPEN THEN
        CLOSE CUR_ACCOUNT;
      END IF;
      PO_RETMSG := VC_SPNAME || '信息加载失败:' || PO_RETMSG;
      ROLLBACK;
      RETURN;
    WHEN OTHERS THEN
      IF CUR_ACCOUNT%ISOPEN THEN
        CLOSE CUR_ACCOUNT;
      END IF;
      PO_RETCOD := '9000';
      PO_RETMSG := SQLERRM;
      ROLLBACK;
      RETURN;

  END PROCEDURE_NAME;

2. 直接执行的简洁写法(用于自己玩数据的时候)

declare
  --定义游标并且赋值(is 不能和cursor分开使用)
  cursor cur_1 is select * from table_1;
  --定义rowtype
  cur_stu table_1%rowtype;
  begin
  --开启游标
  for cur_stu in cur_1 loop
   --执行操作sql
   update table t set t.name = cur_1.name where t.number = cur_1.number;
   --结束循环
   end loop;
  --关闭游标
  close stus_cur;
  /*结束执行*/
 end;

loop循环和for循环原理一致,若采用以下方式开启游标,需注意设置最大循环次数,不然会有一条数据重复循环哦。循环条件 exit when stus_cur%notfound,我理解为for循环中 i <= list.size()。 

begin
open cur_1 ;
--loop循环
 loop
 --循环条件
 exit when stus_cur%notfound;
 --游标值赋值到rowtype
 fetch stus_cur into cur_1;
 --执行操作

更为简单的写法:

begin
 for cur_2 in(sql)  --需更新的数据
  loop
  execute immediate 'excutesql'; --执行更新操作
end loop;
end;


  

你可能感兴趣的:(oracle数据库 使用游标循环更新数据)