示例14 开发程序包

来源:互联网 发布:中电科大数据院 编辑:程序博客网 时间:2024/05/21 14:50


/*============================================================
                       示例5 程序包
  ============================================================*/
--需求:程序包完成以下业务需求
--    1.添加雇员信息
--    2.通过雇员编号修改薪水
--    3.通过雇员名称修改薪水
--    4.通过雇员编号查询薪水
/*********************************************************
  包规范 EMP_PACKAGE 
变量minsal  ----------------------全局变量
变量maxsal  ----------------------全局变量
过程add_employee------------------公用过程
过程upd_sal(eno,sal)--------------公用过程
过程upd_sal(name,sal)-------------公用过程
  函数get_sal-----------------------公用函数
  
  包主体 EMP_PACKAGE
   构造函数--------------------------在运行包组件时将雇员的最低和最高工资赋给全局变量
/*********************************************************/
--程序包规范
create or replace package emp_package is
    minsal emp.sal%type;
    maxsal emp.sal%type;
    --    1.添加雇员信息
    procedure add_employee(eno number,name varchar2,salary number,dno number);
    --    2.通过雇员编号修改薪水
    procedure upd_sal(eno number,salary number);
    --    3.通过雇员名称修改薪水
    procedure upd_sal(name varchar2,salary number);
    --    4.通过雇员编号查询薪水
    function get_sal(eno number) return number;
end emp_package;

--程序包主体
create or replace package body emp_package is
--    1.添加雇员信息
procedure add_employee(eno number,name varchar2,
             salary number,dno number)
IS
begin
     if salary between minsal and maxsal  then
        insert into emp (empno,ename,sal,deptno)values (eno,name,salary,dno);
     else
         raise_application_error(-20010,'工资不在范围内');
     end if;
exception
        when DUP_VAL_oN_INDEX then
            raise_application_error(-20011,'该雇员已存在');
end;

--    2.通过雇员编号修改薪水
procedure upd_sal(eno number,salary number)
IS
begin
    if salary between minsal and maxsal  then
        update emp set sal=salary where empno=eno;
        if sql%notfound then
           raise_application_error(-20011,'该雇员不存在');
        end if;
    else
       raise_application_error(-20010,'工资不在范围内');
    end if;     
end;

--    3.通过雇员名称修改薪水
procedure upd_sal(name VARCHAR2,salary number)
IS
begin
     if salary between minsal and maxsal  then
      update emp set sal=salary where UPPER(ename)=UPPER(name);
      if sql%notfound then
         raise_application_error(-20011,'该雇员不存在');
      end if;
     else
       raise_application_error(-20010,'工资不在范围内');
     end if;     
end;

--    4.通过雇员编号查询薪水
function get_sal(eno number) return number
is
v_sal emp.sal%type;
begin
     select sal into v_sal from emp where empno=eno;
     return v_sal;
exception
         when no_data_found then
              raise_application_error(-20012,'该雇员不存在');
end;
begin
  --构造函数
SELECT  MIN(sal),MAX(sal) INTO minsal,maxsal FROM emp;
end emp_package;

--调用添加雇员存储过程
declare
   emp_20010 EXCEPTION;
   PRAGMA EXCEPTION_INIT(emp_20010, -20010);
   emp_20011 EXCEPTION;
   PRAGMA EXCEPTION_INIT(emp_20011, -20011);
begin
   emp_package.add_employee(5111,'mary',3000,20);
   dbms_output.put_line('添加成功!');
   commit;
exception 
        when emp_20010 then
            dbms_output.put_line('工资不在范围内!');
            rollback;
        when emp_20011 then
            dbms_output.put_line('该雇员已存在!');               
            rollback;
end;

--调用查询薪水函数
declare
    v_sal number;
begin
    v_sal:=emp_package.get_sal(7788);
    dbms_output.put_line(v_sal);
end;

/*============================================================
                       示例5 程序包
  ============================================================*/
--需求:程序包完成以下业务需求
--    1.添加雇员信息
--    2.通过雇员编号修改薪水
--    3.通过雇员名称修改薪水
--    4.通过雇员编号查询薪水
/*********************************************************
  包规范 EMP_PACKAGE 
变量minsal  ----------------------全局变量
变量maxsal  ----------------------全局变量
过程add_employee------------------公用过程
过程upd_sal(eno,sal)--------------公用过程
过程upd_sal(name,sal)-------------公用过程
  函数get_sal-----------------------公用函数
  
  包主体 EMP_PACKAGE
   构造函数--------------------------在运行包组件时将雇员的最低和最高工资赋给全局变量
/*********************************************************/
--程序包规范
create or replace package emp_package is
    minsal emp.sal%type;
    maxsal emp.sal%type;
    --    1.添加雇员信息
    procedure add_employee(eno number,name varchar2,salary number,dno number);
    --    2.通过雇员编号修改薪水
    procedure upd_sal(eno number,salary number);
    --    3.通过雇员名称修改薪水
    procedure upd_sal(name varchar2,salary number);
    --    4.通过雇员编号查询薪水
    function get_sal(eno number) return number;
end emp_package;

--程序包主体
create or replace package body emp_package is
--    1.添加雇员信息
procedure add_employee(eno number,name varchar2,
             salary number,dno number)
IS
begin
     if salary between minsal and maxsal  then
        insert into emp (empno,ename,sal,deptno)values (eno,name,salary,dno);
     else
         raise_application_error(-20010,'工资不在范围内');
     end if;
exception
        when DUP_VAL_oN_INDEX then
            raise_application_error(-20011,'该雇员已存在');
end;

--    2.通过雇员编号修改薪水
procedure upd_sal(eno number,salary number)
IS
begin
    if salary between minsal and maxsal  then
        update emp set sal=salary where empno=eno;
        if sql%notfound then
           raise_application_error(-20011,'该雇员不存在');
        end if;
    else
       raise_application_error(-20010,'工资不在范围内');
    end if;     
end;

--    3.通过雇员名称修改薪水
procedure upd_sal(name VARCHAR2,salary number)
IS
begin
     if salary between minsal and maxsal  then
      update emp set sal=salary where UPPER(ename)=UPPER(name);
      if sql%notfound then
         raise_application_error(-20011,'该雇员不存在');
      end if;
     else
       raise_application_error(-20010,'工资不在范围内');
     end if;     
end;

--    4.通过雇员编号查询薪水
function get_sal(eno number) return number
is
v_sal emp.sal%type;
begin
     select sal into v_sal from emp where empno=eno;
     return v_sal;
exception
         when no_data_found then
              raise_application_error(-20012,'该雇员不存在');
end;
begin
  --构造函数
SELECT  MIN(sal),MAX(sal) INTO minsal,maxsal FROM emp;
end emp_package;

--调用添加雇员存储过程
declare
   emp_20010 EXCEPTION;
   PRAGMA EXCEPTION_INIT(emp_20010, -20010);
   emp_20011 EXCEPTION;
   PRAGMA EXCEPTION_INIT(emp_20011, -20011);
begin
   emp_package.add_employee(5111,'mary',3000,20);
   dbms_output.put_line('添加成功!');
   commit;
exception 
        when emp_20010 then
            dbms_output.put_line('工资不在范围内!');
            rollback;
        when emp_20011 then
            dbms_output.put_line('该雇员已存在!');               
            rollback;
end;

--调用查询薪水函数
declare
    v_sal number;
begin
    v_sal:=emp_package.get_sal(7788);
    dbms_output.put_line(v_sal);
end;

0 0
原创粉丝点击