问题:
“问题是这样的:我要把表A里面长度不是10的全部改掉,改成KD00000001-KD00001000;这个好像要用变量了,新手,不会整,求大神支援。就比如表A里面有1234;1233;1232,,1231这4个,那我怎么把这4个批量修改成KD00000001;KD00000002......”
解决方法:
1.创建表ta:create table ta(dm varchar2(32));
2.插入测试数据
-
SQL> select * from ta;
-
DM
-
--------------------------------
-
1234
-
122
-
13696
-
1111111111
-
1111111110
- SQL>
-
create or replace procedure pro_cursor_baidu is
-
cursor cur_a is select dm from ta where length(dm) != 10 order by rownum;
-
v_dm ta.dm%type;
-
v_dm1 ta.dm%type;
-
v_dm2 ta.dm%type;
-
i number:=1;
-
j number;
-
begin
-
open cur_a;
-
fetch cur_a into v_dm;
-
while cur_a%found loop
-
select length(i) into j from dual;
-
v_dm1:=i;
-
begin
-
while j < 8 loop
-
v_dm1:=0||v_dm1;
-
j:=j+1;
-
end loop;
-
v_dm2:='KD'||v_dm1;
-
dbms_output.put_line(v_dm2);
-
update ta set dm=v_dm2 where dm=v_dm;
-
i:=i+1;
-
fetch cur_a into v_dm;
-
end;
-
end loop;
-
close cur_a;
- end
-
SQL> exec pro_cursor_baidu;
-
KD00000001
-
KD00000002
-
KD00000003
-
-
PL/SQL procedure successfully completed
-
SQL> select * from ta;
-
DM
-
--------------------------------
-
KD00000001
-
KD00000002
-
KD00000003
-
1111111111
-
1111111110
- SQL>
这里主要使用了存储过程的变量多次传递、替换,通过update语句,实现需求。其中关于存储过程的编写,一定要注意行尾的分号,通过pl/sql调试存储过程,可以看出来是哪个环节出了问题,一直按ctrl+n,查看程序执行步骤,是否符合自己写的顺序。最好加上exception模块。但是pl/sql调试存储,还有很多缺陷,如执行到相应的环节,不能输出相应的变量的值是多少。不如shell的功能,通过sh -x test.sh 可以仔细的看出程序的执行过程,还有变量的传递、是否传递成功。