Oracle中declare的用例

场景:如果一场考试有100个科目,每个科目的成绩存放在以"t_科目代码_1_pyjd"格式命名的表里面。
若想获取每个科目的阅卷进度(ksstzt不为8则为未阅),就要写100个sql,如何用一个语句查询出来呢?

看成三部分:1.declare到begin;2.begin到end;3.for循环

第一部分里面是:变量名+数据类型。除此之外还定义了一个游标cursor命名为cur,在for循环里遍历这个查询的结果集

第三部分中的c.kmdm是从游标中取值,into是给第一部分的变量赋值,dbms_output.put_line()是输出到pl/sql的output页面结果集

declare
  res number(7);
  tablename varchar2(20);
  cursor cur is select kmdm from t_jxxxb group by kmdm having count(*)=1;
begin
   for c in cur loop
       tablename:='t_'||c.kmdm||'_1_pyjd';
       execute immediate 'select count(*) from '||tablename||' where ksstzt<>8' into res;
       dbms_output.put_line(c.kmdm||':'||res); 
   end loop;
end;

扩展declare中的if怎么用
这里新增需求,把已经阅完的科目(ksstzt=8)剔除出结果集

declare
  res number(7);
  tablename varchar2(40);
  cursor cur is select kmdm from t_jxxxb group by kmdm having count(*)=1;
begin
   for c in cur loop
       tablename:='t_'||c.kmdm||'_1_pyjd';
       execute immediate 'select count(*) from '||tablename||' where ksstzt<>8' into res;
       if res!=0 then
           dbms_output.put_line(c.kmdm||':'||res);      
         end if; 
   end loop;
end;

2021年5月更新:
使用plsql批量更新数据库某表,7万多条数据会特别慢,容易内存溢出,故查询sql用分页,每次更新1万条,这条语句里还用到了比较复杂的拼接,是个很好的例子。

declare
       res number(7);
       colname varchar2(800);
       sjmh_c varchar2(100);
       cursor cur is 这里填底下的分页查询sql;
begin
       for c in cur loop
          colname:='';
          sjmh_c:=c.sjmh;
          for i in 1 .. c.omrcd loop
            colname:=colname||'omr'||i||'||'||chr(39)||','||chr(39)||'||';
          end loop;
          execute immediate 'update omrtest set jmxx2='||substr(colname,0,(length(colname)-2))||' where sjmh='||chr(39)||sjmh_c||chr(39);
       end loop;
end;
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值