PLSQL编程

练习1:

--查找scott用户的emp表中的所有数据,
--如果job为MANAGER 工资大于2500,则下调百分之10;如果小于2500 则增加百分之10,
--如果job为SALESMAN 工资小于1500 则上调百分之10;
--最后符合条件的人.插入到test表中.并且打印符合条件的人数的个数.
--Test表结构如下:
--Ename varchar
--Sal number

  
  
  
  
  1. --创建test表  
  2. create table test(Ename varchar(20), Sal number);  
  3. --存储过程  
  4. create or replace procedure lj_pro1 is 
  5.   cursor  emp_cur IS   select * from emp;  
  6.   v_sql    varchar2(100) := 'select count(1) from test';  
  7.   v_total  number;  
  8. begin 
  9.   FOR emp_rec IN emp_cur loop  
  10.     if  emp_rec.job = 'MANAGER'  then 
  11.       if  emp_rec.sal > 2500  then 
  12.         update  emp set  emp.sal  =  emp.sal * 0.9  
  13.           where emp.empno = emp_rec.empno;  
  14.         insert  into  test  values (emp_rec.ename, emp_rec.sal * 0.9);  
  15.       elsif  emp_rec.sal < 2500  then 
  16.         update  emp  set  emp.sal  =  emp.sal * 1.1  where  emp.job = 'MANAGER';  
  17.         insert  into  test  values (emp_rec.ename, emp_rec.sal * 1.1);  
  18.       else 
  19.         null;  
  20.       end if;  
  21.     elsif  emp_rec.job = 'SALESMAN'  then 
  22.       if  emp_rec.sal < 1500  then 
  23.         update  emp  set  emp.sal  =  emp.sal * 1.1 where  emp.job = 'SALESMAN';  
  24.         insert  into  test  values (emp_rec.ename, emp_rec.sal * 1.1);  
  25.       else 
  26.         null;  
  27.       end if;  
  28.     else 
  29.       null;  
  30.     end if;  
  31.   end loop;  
  32.   execute  immediate v_sql into  v_total;  
  33.   dbms_output.put_line('符合条件的人数为:'||v_total);  
  34. end

练习2:

--建立函数valid_empno_f,根据输入的员工编号,检查员工是否存在,
--如果员工存在,则返回ture.否则返回false.

  
  
  
  
  1. create  or  replace  function  valid_empno_f(No number)  return boolean  is 
  2.   v_ename  emp.ename%type;  
  3. begin 
  4.   select  ename  into  v_ename  from  emp  where  empno  =  No;  
  5.   --dbms_output.put_line('v_ename='||v_ename);  
  6.   return  true;  
  7. exception  
  8.   when  no_data_found  then 
  9.     --dbms_output.put_line('员工不存在!');  
  10.     return  false;  
  11. end

练习3:

根据主管编号查询出其直接下级员工和所有下级员工、所在部门的平均薪酬、所在部门高于平均薪酬的员工(入参为主管编号,出参为分别输出下级员工集合、所有下级员工集合、部门平均薪酬、高薪员工)。

  
  
  
  
  1. create or replace package p_lj is 
  2.   procedure lj_pro2(mgr_in         in  number,  
  3.                       ename_out      out varchar2,  
  4.                       ename_all_out  out varchar2,  
  5.                       avg_saL_out    out number,  
  6.                       high_sal_out   out varchar2);  
  7. end p_lj;  
  8. /  
  9. create or replace package body p_lj is 
  10.   procedure lj_pro2(mgr_in         in number,  
  11.                       ename_out      out varchar2,  
  12.                       ename_all_out  out varchar2,  
  13.                       avg_saL_out    out number,  
  14.                       high_sal_out   out varchar2) is 
  15.     --定义直接下级员工游标  
  16.     cursor emp_cur is 
  17.       select * from emp where mgr = mgr_in;  
  18.     --定义下下级员工游标  
  19.     cursor emp_all_cur is 
  20.       select *  from emp  
  21.        where mgr in (select empno from emp where mgr = mgr_in);  
  22.     --定义高薪员工游标  
  23.     cursor emp_high_sal_cur is 
  24.       select * from emp  
  25.        where sal >  
  26.              (select AVG(sal)  from emp  
  27.                where deptno = (select deptno from emp where empno = mgr_in));  
  28.     --定义记录  
  29.     TYPE TYP_REC_EMP IS RECORD(  
  30.       empno    EMP.empno%TYPE, --个人编号  
  31.       ename    EMP.ename%TYPE, --姓名  
  32.       job       EMP.job%TYPE, --工作岗位  
  33.       mgr       EMP.mgr%TYPE, --主管编号  
  34.       hiredate  EMP.hiredate%TYPE, --雇佣日期  
  35.       sal       EMP.sal%TYPE, --工资  
  36.       comm     EMP.comm%TYPE, --津贴  
  37.       deptno    EMP.deptno%TYPE --部门编号  
  38.       );  
  39.     -- 定义记录变量  
  40.     emp_rec TYP_REC_EMP;  
  41.  
  42.     --定义数组  
  43.     --TYPE TYP_TAB_EMP IS TABLE OF TYP_REC_EMP INDEX BY VARCHAR2(30);  
  44.     -- 定义数组变量  
  45.     --emp_tab TYP_TAB_EMP;  
  46.  
  47.     --sql变量  
  48.     v_sql varchar2(1000) := 'select AVG(sal) from emp where deptno =(select deptno from emp where empno =' ||  
  49.                             mgr_in || ')';  
  50.     --记录异常编号和信息  
  51.     err_num   NUMBER;  
  52.     err_msg   VARCHAR2(100);  
  53.  
  54.   begin 
  55.     -- 查询直接下级员工  
  56.     ename_out := '直接下级员工的姓名:';  
  57.     FOR emp_rec IN emp_cur loop  
  58.       ename_out := ename_out || emp_rec.ename || ', ';  
  59.     end loop;  
  60.     -- 查询所有下级员工  
  61.     ename_all_out := '所有下级员工的姓名:';  
  62.     ename_all_out := ename_out;  
  63.     FOR emp_rec IN emp_all_cur loop  
  64.       ename_all_out := ename_all_out || emp_rec.ename || ', ';  
  65.     end loop;  
  66.     --查询主管所在部门的平均薪酬  
  67.     execute immediate v_sql  
  68.       into avg_saL_out;  
  69.     --查询高薪员工  
  70.     high_sal_out := '高薪员工的姓名:';  
  71.     FOR emp_rec IN emp_high_sal_cur loop  
  72.       high_sal_out := high_sal_out || emp_rec.ename || ', ';  
  73.     end loop;    
  74.     --异常处理  
  75.   exception  
  76.     when no_data_found then   
  77.       err_num :=  SQLCODE;  
  78.       err_msg := SQLERRM;  
  79.       dbms_output.put_line('数据库中没有编号为'||mgr_in||'的主管');  
  80.       insert into log values(err_num,'procedure lj_pro2',err_msg);  
  81.       commit;  
  82.     when too_many_rows then 
  83.       err_num :=  SQLCODE;  
  84.       err_msg := SQLERRM;  
  85.       dbms_output.put_line('返回了多行!请使用游标!');  
  86.       insert into log values(err_num,'procedure lj_pro2',err_msg);  
  87.       commit;  
  88.     when cursor_already_open then 
  89.       err_num :=  SQLCODE;  
  90.       err_msg := SQLERRM;  
  91.       dbms_output.put_line('游标已经打开!');  
  92.       insert into log values(err_num,'procedure lj_pro2',err_msg);  
  93.       commit;  
  94.     when invalid_cursor then 
  95.       err_num :=  SQLCODE;  
  96.       err_msg := SQLERRM;  
  97.       dbms_output.put_line('请检测游标是否打开!');  
  98.       insert into log values(err_num,'procedure lj_pro2',err_msg);  
  99.       commit;  
  100.     when invalid_number then 
  101.       err_num :=  SQLCODE;  
  102.       err_msg := SQLERRM;  
  103.       dbms_output.put_line('输入的数字不正确!');  
  104.       insert into log values(err_num,'procedure lj_pro2',err_msg);  
  105.       commit;  
  106.     when OTHERS then 
  107.       err_num :=  SQLCODE;  
  108.       err_msg := SQLERRM;  
  109.       dbms_output.put_line(err_num||'---'||err_msg);  
  110.       insert into log values(err_num,'procedure lj_pro2',err_msg);  
  111.       commit;  
  112.   end lj_pro2;  
  113.  
  114. begin 
  115.   null;  
  116. end p_lj;  

 

你可能感兴趣的:(存储过程,plsql,职场,休闲)