场景:如果一场考试有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;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36190.html