Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1610887
  • 博文数量: 409
  • 博客积分: 6240
  • 博客等级: 准将
  • 技术积分: 4908
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 00:04
文章分类

全部博文(409)

文章存档

2021年(1)

2019年(1)

2017年(1)

2016年(13)

2015年(22)

2013年(4)

2012年(240)

2011年(127)

分类: Oracle

2013-07-09 20:48:19

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

问题:

问题是这样的:我要把表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 可以仔细的看出程序的执行过程,还有变量的传递、是否传递成功。
阅读(2477) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~