ps/sql游标练习

Posted yanyunpiaomaio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ps/sql游标练习相关的知识,希望对你有一定的参考价值。

--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游标练习的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL练习显式游标

游标练习

2017-07-31(触发器,包,游标练习)

mysql sp 练习游标和预编译

Oracle——触发器和游标练习题

Oracle——触发器和游标练习题