ps/sql游标练习
时间:2021-07-01 10:21:17
帮助过:17人阅读
1,用游标显示所有部门编号与名称,以及其所拥有的员工人数。
begin
for v_emp
in (
select d.dname ,
count(e.empno) total,d.deptno
from dept d
left join emp e
on
d.deptno=e.deptno
group by d.dname,d.deptno)
loop
dbms_output.put_line(‘部门编号:‘||v_emp.deptno
||‘部门名称:‘||v_emp.dname
||‘员工人数:‘||v_emp.total);
end loop ;
end;
--2,用游标属性%rowcount实现输出前十个员工的信息
declare
cursor c
is (
select * from emp);
begin
for v
in c
loop
exit when c
%rowcount>10;
dbms_output.put_line(c%rowcount || ‘员工编号‘ || v.empno
|| ‘员工姓名‘ || v.ename
|| ‘员工工资‘ || v.sal);
end loop;
end;
--3,通过使用游标来显示dept表中的部门名称,及其相应的员工列表(提示:可以使用双重循环)。
begin
for v_dept
in (
select d.dname,deptno
from dept d)
loop
dbms_output.put_line(‘部门名称‘ || v_dept.dname);
for v_emp
in (
select e.ename
from emp e
where e.deptno
=v_dept.deptno)
loop
dbms_output.put_line( ‘ 员工姓名‘ ||v_emp.ename);
end loop;
end loop;
end;
select * from dept
--4,接受一个部门号,使用For循环,从emp表中显示该部门的所有雇员的姓名,工作和薪水。
--方法1
begin
for v_dept
in (
select d.dname,deptno
from dept d
where d.deptno
=&请输入部门编号)
loop
dbms_output.put_line(‘部门名称‘ || v_dept.dname);
for v_emp
in (
select e.ename,e.job,e.sal
from emp e
where e.deptno
=v_dept.deptno)
loop
dbms_output.put_line( ‘ 员工姓名‘ ||v_emp.ename
||‘ 工作‘||v_emp.job
||‘ 薪资‘||v_emp.sal);
end loop;
end loop;
end;
--方法2
declare
cursor c_emp
is select * from emp
where deptno
= &输入部门编号;
v_dept dept%rowtype;
begin
select * into v_dept
from dept
where deptno
= &输入部门编号;
dbms_output.put_line(‘部门名称‘ || v_dept.dname);
for v_emp
in c_emp loop
dbms_output.put_line( ‘ 员工姓名‘ ||v_emp.ename
||‘ 工作‘||v_emp.job
||‘ 薪资‘||v_emp.sal);
end loop;
end;
select * from salgrade
--5,编写一个程序块,将emp表中前5人的名字,及其出的工资等级(salgrade)显示出来。
--方法1
begin
for v_emp
in (
select e.ename, s.grade
from emp e
inner join salgrade s
on e.sal
between s.losal
and s.hisal
where rownum
<6)
loop
dbms_output.put_line(v_emp.ename || ‘ 等级 ‘ || v_emp.grade);
end loop;
end;
--方法2
declare
cursor c
is (
select e.ename, s.grade
from emp e
inner join salgrade s
on e.sal
between s.losal
and s.hisal);
begin
for v_emp
in c
loop
exit when c
%rowcount>5;
dbms_output.put_line(v_emp.ename || ‘ 等级 ‘ || v_emp.grade);
end loop;
end;
--前两种自动按等级排序 这个方法不会
begin
for v_emp
in (
select * from emp
where rownum
<6)
loop
for v_emp2
in(
select s.grade
from salgrade s
where v_emp.sal
between s.losal
and s.hisal)
loop
dbms_output.put_line(v_emp.ename||v_emp2.grade);
end loop;
end loop;
end;
--6,使用带参数的游标,实现接受一个部门名称,从emp表中显示该部门的所有雇员的姓名,工作和薪水。
--不可行
declare
cursor c(v_dname
varchar2)
is select e.ename,e.job,e.sal
from emp e
where e.deptno
=(
select deptno
from
dept where dname
=v_dname);
v_dname varchar2(
20):
=&请输入部门名称;
begin
dbms_output.put_line(‘ 部门员工名单:‘);
for v_emp
in c(v_danme)
loop
dbms_output.put_line(v_emp.ename || ‘ :: ‘ || v_emp.job
|| ‘ :: ‘ || v_emp.sal);
end loop;
end;
--可行
declare
cursor c_emp(v_dname
varchar2)
is select * from emp
where deptno
=
(select deptno
from dept
where dname
= v_dname);
begin
dbms_output.put_line(‘SALES 部门员工名单:‘);
for v_emp
in c_emp(
‘SALES‘) loop
dbms_output.put_line( ‘ 员工姓名‘ ||v_emp.ename
||‘ 工作‘||v_emp.job
||‘ 薪资‘||v_emp.sal);
end loop;
end;
--不可行
declare
cursor c_cs(c_deptno
varchar2)
is select * from emp
where deptno
=
(select deptno
from dept
where dname
= c_deptno); --(sql语句可用这个替代 select e.*,d.dname from emp e left join dept d on e.deptno=d.deptno where d.dname=‘SALES‘)
v_deptno varchar2(
1000);
begin
v_deptno:=&请输入部门名称;
for erow
in c_cs(v_deptno) loop
dbms_output.put_line(erow.ename||‘ ‘ ||erow.job
||‘ ‘||erow.sal);
end loop;
end;
--7,用游标获取所有收入超过2000的销售员(job为salesman)的信息
begin
for v_emp
in(
select * from emp
where job
=‘SALESMAN‘ and sal
+nvl(comm,
0)
>2000)
loop
dbms_output.put_line(‘ 员工姓名‘ ||v_emp.ename
||‘ 工作‘||v_emp.job
||‘ 薪资‘||v_emp.sal);
end loop;
end;
--8,编写一个PL/SQL程序块,从emp表中对名字以"A"或"S"开始的所有雇员按他们基本薪水的10%给他们加薪。
begin
dbms_output.put_line(‘加薪的员工有:‘);
for v_emp
in(
select * from emp
where ename
like ‘A%‘ or ename
like ‘S%‘)
loop
dbms_output.put_line(‘ ‘||v_emp.ename);
update emp
set sal
=sal
*110/100 where ename
=v_emp.ename;
end loop;
end;
begin
update emp
set sal
=sal
*110/100 where ename
like ‘A%‘ or ename
like ‘S%‘
end;
ps/sql游标练习
标签:替代 收入 join left join amp sele row oop 排序