Oracle 包练习
1 /* 2 创建一个程序包,包里面实现如下功能 3 1:构建一个过程,根据用户传入的最低工资计算出emp表中 4 低于最低工资的人数及这些人员信息 5 2:构建一个函数,根据传入的年月,计算该日期入职 6 员工的人数 7 */ 8 9 --包规范 10 create or replace package emp_controller 11 as 12 --创建一个ref游标 13 type emplist is ref cursor return emp%rowtype; 14 15 procedure check_sal_less(v_min number,v_count out number,v_emplist out emplist); 16 17 function count_same_year_emp(v_year number) return number; 18 19 end; 20 21 --包主体 22 create or replace package body emp_controller 23 as 24 --实现过程 25 procedure check_sal_less(v_min number,v_count out number,v_emplist out emplist) 26 as 27 begin 28 --根据传入的最低工资,计算出表中低于最低工资的人数 29 select count(*) into v_count from myemp 30 where sal < v_min; 31 32 --将工资低于最低工资的人存放到游标中 33 --打开游标 34 open v_emplist for select * from myemp 35 where sal < v_min; 36 end; 37 38 --实现函数 39 function count_same_year_emp(v_year number) return number 40 as 41 v_number number; 42 begin 43 --根据传入的年份来统计该年份入职的员工数量 44 select count(*) into v_number from myemp 45 where to_char(hiredate,'yyyy') = v_year; 46 47 return v_number; 48 end; 49 end; 50 51 52 --包程序测试 53 declare 54 v_count number; 55 v_emp emp_controller.emplist; 56 v_e myemp%rowtype; 57 begin 58 --根据传入的最低工资,计算出表中低于最低工资的人数 59 emp_controller.check_sal_less(2000,v_count,v_emp); 60 dbms_output.put_line('低于最低工资2000的人数有:'||v_count||',分别是:'); 61 loop 62 fetch v_emp into v_e; 63 exit when v_emp%notfound; 64 dbms_output.put_line('姓名:'||v_e.ename||',薪水:'||v_e.sal); 65 dbms_output.put_line('---------------------------------------'); 66 end loop; 67 end; 68 69 --包测试 70 declare 71 v_number number; 72 begin 73 --输出测试,直接调用函数,输出返回值 74 dbms_output.put_line(emp_controller.count_same_year_emp('1981')); 75 end;