zoukankan      html  css  js  c++  java
  • 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('&no 部门员工名单:');
      for v_emp in c_emp('&no') 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;
  • 相关阅读:
    MVC简介
    Scrapy中的item是什么
    Git删除文件操作
    vi编辑文件出现Can't open file for writing错误
    CentOs安装Scrapy出现error: Setup script exited with error: command ‘gcc’ failed with exit status 1错误解决方案
    Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
    激活MyEclipse 6.5方法-通过一段Java程序生成激活码
    oninput,onpropertychange,onchange的用法和区别【转载】
    Myeclipse6.5项目启动时由于数据库连接失败的错误日志
    IE和Firefox的Javascript兼容性总结
  • 原文地址:https://www.cnblogs.com/yanyunpiaomaio/p/10847011.html
Copyright © 2011-2022 走看看