oracle数据库循环更新问题请教!
网络自学几天,求指点,求大佬嘴下留情轻喷。谢谢!declare
v_bdcdyh varchar2(200);
h number;
dj int;
i int := 1;
v_s varchar(1000);
v_slid varchar2(200);
v_slid1 varchar2(200);
v_fwid varchar2(200);
v_bdcqzh varchar2(200);
cursor cur_qlrlb is select * from bdc_qlrlb where bz = 0 and dyid is null;
begin
for qlrlb in cur_qlrlb
loop
select count(*) into h from bdc_regn_zb where slid = qlrlb.slid ;
select count(*) into dj from bdc_qlrlb where bz = 0 and slid = qlrlb.slid;
if h=1 then
select djkid,slid,bdcqzh,bdcdyh into v_fwid,v_slid1,v_bdcqzh,v_bdcdyh from bdc_regn_zb where slid = qlrlb.slid ;
end if;
ifh=djthen
v_S := 'update bdc_qlrlb set dyid=' || '''' || v_fwid || ''' ,bdcqzh=' || '''' || v_bdcqzh || ''',bdcdyh=' || '''' || v_bdcdyh || ''' where slid=' || '''' || trim(v_slid1) || ''' anddyid is null and bz=''0''';
end if ;
i:=i+sql%rowcount;
end loop;
dbms_output.put_line(i);
executeimmediatev_s;
end;
问题1: 请问下为什么每次执行都只更新一条。 打印出来的循环次数是有一万多条。(每执行提交一次,只能更新一条记录)。
问题2:dbms_output.put_line(v_s);放在循环里面,执行语句有时候打印出来的全是一样的内容(多条语句,一个变量),变量相同;有时候又是正常的,变量是不同的(多条语句,不同变量)!
哪位大佬帮忙指点一下,我写的肯定有问题,不知道问题出在哪! ifh=dj then 这个判断去掉了也是只能更新一条!
cursor cur_qlrlb is select * from bdc_qlrlb where bz = 0 and dyid is null;
begin
for qlrlb in cur_qlrlb loop
总感觉你这里写的很奇怪,平时没这么写过,这里为啥要用游标呢,直接定义变量接收那段sql的count不就行了嘛{:301_1009:} end loop;
dbms_output.put_line(i);
executeimmediatev_s;
这里你是不是应该把后两句写到end loop上面啊,循环都结束了,当然只能更新一条数据了,而且我没猜错的话,是循环的最后一条{:301_995:} ly765893958 发表于 2023-1-6 13:57
end loop;
dbms_output.put_line(i);
executeimmediatev_s;
第一种:放循环里面也是一样的。 一次更新一条。
第二种:这么写直接失败。
第三种:提交放到if里面,不报错,提交仍然只更新一条。
注:跟dbms打印的位置没有关系,我删了打印执行也是一样的结果。 ly765893958 发表于 2023-1-6 13:54
cursor cur_qlrlb is select * from bdc_qlrlb where bz = 0 and dyid is null;
begin
for qlrlb in c ...
可能是我的水平问题吧。主要是为了获取里面的slid。 接不接收总量其实无所谓。现在就是update的量我搞不懂,他只能更新一条 yk156511 发表于 2023-1-6 16:04
可能是我的水平问题吧。主要是为了获取里面的slid。 接不接收总量其实无所谓。现在就是update的量我搞不 ...
很大可能就是循环有问题 yk156511 发表于 2023-1-6 16:01
第一种:放循环里面也是一样的。 一次更新一条。
第二种:这么写直接失败。
可以这么理解会不会是你整个循环里面,符合h=dj的情况就只有一次呢,所以就只会有一条update语句,也就只更新一次 yk156511 发表于 2023-1-6 16:01
第一种:放循环里面也是一样的。 一次更新一条。
第二种:这么写直接失败。
第三种的写法没问题检查h=dj,看看有多少次符合条件 ly765893958 发表于 2023-1-6 16:11
可以这么理解会不会是你整个循环里面,符合h=dj的情况就只有一次呢,所以就只会有一条update语句,也就 ...
不会。我尝试了的 去掉h=dj的条件。 也是一样的,只能循环一次。 ly765893958 发表于 2023-1-6 16:12
第三种的写法没问题检查h=dj,看看有多少次符合条件
我没提交一次 再去查select count(*) from bdc_qlrlb where bz = 0 and dyid is null;的量 都会少一条。
说明h=dj的不是一条数据。 不然不会每次提交都能少一条数据吧
页:
[1]
2