当前位置:Gxlcms > 数据库问题 > ps/sql游标练习

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   排序   

人气教程排行