yk156511 发表于 2023-1-6 12:14

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 这个判断去掉了也是只能更新一条!

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 cur_qlrlb loop

总感觉你这里写的很奇怪,平时没这么写过,这里为啥要用游标呢,直接定义变量接收那段sql的count不就行了嘛{:301_1009:}

ly765893958 发表于 2023-1-6 13:57

end loop;
       dbms_output.put_line(i);
    executeimmediatev_s;
这里你是不是应该把后两句写到end loop上面啊,循环都结束了,当然只能更新一条数据了,而且我没猜错的话,是循环的最后一条{:301_995:}

yk156511 发表于 2023-1-6 16:01

ly765893958 发表于 2023-1-6 13:57
end loop;
       dbms_output.put_line(i);
    executeimmediatev_s;



第一种:放循环里面也是一样的。 一次更新一条。

第二种:这么写直接失败。

第三种:提交放到if里面,不报错,提交仍然只更新一条。
注:跟dbms打印的位置没有关系,我删了打印执行也是一样的结果。

yk156511 发表于 2023-1-6 16:04

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的量我搞不懂,他只能更新一条

ly765893958 发表于 2023-1-6 16:07

yk156511 发表于 2023-1-6 16:04
可能是我的水平问题吧。主要是为了获取里面的slid。 接不接收总量其实无所谓。现在就是update的量我搞不 ...

很大可能就是循环有问题

ly765893958 发表于 2023-1-6 16:11

yk156511 发表于 2023-1-6 16:01
第一种:放循环里面也是一样的。 一次更新一条。

第二种:这么写直接失败。


可以这么理解会不会是你整个循环里面,符合h=dj的情况就只有一次呢,所以就只会有一条update语句,也就只更新一次

ly765893958 发表于 2023-1-6 16:12

yk156511 发表于 2023-1-6 16:01
第一种:放循环里面也是一样的。 一次更新一条。

第二种:这么写直接失败。


第三种的写法没问题检查h=dj,看看有多少次符合条件

yk156511 发表于 2023-1-6 16:14

ly765893958 发表于 2023-1-6 16:11
可以这么理解会不会是你整个循环里面,符合h=dj的情况就只有一次呢,所以就只会有一条update语句,也就 ...

不会。我尝试了的 去掉h=dj的条件。 也是一样的,只能循环一次。

yk156511 发表于 2023-1-6 16:17

ly765893958 发表于 2023-1-6 16:12
第三种的写法没问题检查h=dj,看看有多少次符合条件

我没提交一次 再去查select count(*) from bdc_qlrlb where bz = 0 and dyid is null;的量 都会少一条。

说明h=dj的不是一条数据。 不然不会每次提交都能少一条数据吧
页: [1] 2
查看完整版本: oracle数据库循环更新问题请教!