sql批量处理——通过游标来实现

2570阅读 0评论2013-07-09 linux_kaige
分类:Oracle

今天在网上看到一个人提了个问题,刚好手头上没什么事儿,就想了下,在这里分享一下。

问题:

问题是这样的:我要把表A里面长度不是10的全部改掉,改成KD00000001-KD00001000;这个好像要用变量了,新手,不会整,求大神支援。就比如表A里面有1234;1233;1232,,1231这4个,那我怎么把这4个批量修改成KD00000001;KD00000002......”

解决方法:

1.创建表ta:create table ta(dm varchar2(32));
 2.插入测试数据

  1. SQL> select * from ta;
  2.    DM
  3.  --------------------------------
  4.  1234
  5.  122
  6.  13696
  7.  1111111111
  8.  1111111110
  9.  SQL>
 3.创建存储过程

  1. create or replace procedure pro_cursor_baidu is
  2.  cursor cur_a is select dm from ta where length(dm) != 10 order by rownum;
  3.  v_dm ta.dm%type;
  4.  v_dm1 ta.dm%type;
  5.  v_dm2 ta.dm%type;
  6.  i number:=1;
  7.  j number;
  8.  begin
  9.    open cur_a;
  10.  fetch cur_a into v_dm;
  11.  while cur_a%found loop
  12.  select length(i) into j from dual;
  13.  v_dm1:=i;
  14.  begin
  15.  while j < 8 loop
  16.  v_dm1:=0||v_dm1;
  17.  j:=j+1;
  18.  end loop;
  19.  v_dm2:='KD'||v_dm1;
  20.  dbms_output.put_line(v_dm2);
  21.  update ta set dm=v_dm2 where dm=v_dm;
  22.  i:=i+1;
  23.  fetch cur_a into v_dm;
  24.  end;
  25.  end loop;
  26.  close cur_a;
  27.  end
 4.测试结果:
 
  1. SQL> exec pro_cursor_baidu;
  2.  KD00000001
  3.  KD00000002
  4.  KD00000003
  5.   
  6.  PL/SQL procedure successfully completed
  7.  SQL> select * from ta;
  8.  DM
  9.  --------------------------------
  10.  KD00000001
  11.  KD00000002
  12.  KD00000003
  13.  1111111111
  14.  1111111110
  15.  SQL>
总结:

这里主要使用了存储过程的变量多次传递、替换,通过update语句,实现需求。其中关于存储过程的编写,一定要注意行尾的分号,通过pl/sql调试存储过程,可以看出来是哪个环节出了问题,一直按ctrl+n,查看程序执行步骤,是否符合自己写的顺序。最好加上exception模块。但是pl/sql调试存储,还有很多缺陷,如执行到相应的环节,不能输出相应的变量的值是多少。不如shell的功能,通过sh -x test.sh 可以仔细的看出程序的执行过程,还有变量的传递、是否传递成功。
上一篇:Linux下程序的启动和关闭方法
下一篇:CU的博客是怎么了???