解答:
1、
create or replace procedure test_cursor
is
cursor c_tmp1 is select '>=2000' as salway,job,sum(case when sal>=2000 then 1 else 0 end) as countnum from emp group by job ;
cursor c_tmp2 is select '<=1000' as salway,job,sum(case when sal<=1000 then 1 else 0 end) as countnum from emp group by job ;
begin
for r_tmp1 in c_tmp1
loop
dbms_output.put_line('职位'||r_tmp1.job||'大于2000元的人数为'||r_tmp1.countnum);
end loop;
dbms_output.put_line(chr(13)); -- 打印回车
for r_tmp2 in c_tmp2
loop
dbms_output.put_line('职位'||r_tmp2.job||'小于1000元的人数为'||r_tmp2.countnum);
end loop;
end test_cursor;
2、
建表:
drop table good;
create table good(
gid number(5) primary key,
gename varchar2(20) not null,
gejob varchar2(20) not null,
gesal number not null,
grank integer not null
) ;
-- 建序列
create sequence s_good
minvalue 1
maxvalue 99999999999999999999999999
start with 1
increment by 1
cache 20;
-- 建触发器
create trigger t_good before insert on good for each row
begin
select s_good.nextval into :new.gid from dual;
end;
--建过程
create or replace procedure test_cursor2
is
cursor c_tmp is select * from good;
begin
insert into good(gename,gejob,gesal,grank) select * from (select ename gename,job gejob,sal gesal,row_number() over(partition by job order by sal) grank from emp) where grank<4;
commit;
for r_tmp in c_tmp
loop
dbms_output.put_line('姓名:'||r_tmp.gename||',职位:'||r_tmp.gejob||',薪水:'||r_tmp.gesal||',职位排名:'||r_tmp.grank);
end loop;
end test_cursor2;