SQL> CREATE OR REPLACE PACKAGE EMPLOYE --包头部分
  2  IS
  3     PROCEDURE SHOW_DETAIL;
  4     PROCEDURE GET_EMPLOYE(P_EMPNO NUMBER);
  5     PROCEDURE SAVE_EMPLOYE;
  6     PROCEDURE CHANGE_NAME(P_NEWNAME VARCHAR2);
  7     PROCEDURE CHANGE_SAL(P_NEWSAL NUMBER);
  8  END EMPLOYE;
  9  /程序包已创建。SQL> create or replace
  2  PACKAGE BODY EMP_PK              --包体部分
  3  IS
  4      V_MESSAGE VARCHAR2(50);     --显示信息
  5      V_MAX_SAL NUMBER(7);        --工资上限
  6      V_MIN_SAL NUMBER(7);        --工资下限
  7      FUNCTION EXIST_EMP(P_EMPNO NUMBER)  RETURN  BOOLEAN; --判断雇员是否存在函数
  8      PROCEDURE SHOW_MESSAGE;     --显示信息过程
  9          ------------------------ 初始化过程 -------------------
 10          PROCEDURE INIT(P_MAX NUMBER,P_MIN NUMBER)
 11          IS
 12          BEGIN
 13             SELECT COUNT(*) INTO V_EMP_COUNT FROM EMP;
 14                V_MAX_SAL:=P_MAX;
 15                V_MIN_SAL:=P_MIN;
 16                V_MESSAGE:='初始化过程已经完成!';
 17                SHOW_MESSAGE;
 18          END INIT;
 19   -------------------- 显示雇员列表过程 -----------------
 20          PROCEDURE LIST_EMP
 21          IS
 22          BEGIN
 23         DBMS_OUTPUT.PUT_LINE('姓名       职务      工资');
 24          FOR emp_rec IN (SELECT * FROM EMP)
 25          LOOP
 26          DBMS_OUTPUT.PUT_LINE(RPAD(emp_rec.ename,10,'')||RPAD(emp_rec.job,10,' ')||TO_CHAR(emp_rec.sal));
 27          END LOOP;
 28          DBMS_OUTPUT.PUT_LINE('雇员总人数'||V_EMP_COUNT);
 29          END LIST_EMP;
 30   ---------------------- 插入雇员过程 -------------------
 31          PROCEDURE INSERT_EMP(P_EMPNO NUMBER,P_ENAME VARCHAR2,P_JOB VARCHAR2,P_SAL NUMBER)
 32          IS
 33          BEGIN
 34          IF NOT EXIST_EMP(P_EMPNO) THEN
 35          INSERT INTO EMP(EMPNO,ENAME,JOB,SAL)VALUES(P_EMPNO,P_ENAME,P_JOB,P_SAL);
 36          COMMIT;
 37              V_EMP_COUNT:=V_EMP_COUNT+1;
 38              V_MESSAGE:='雇员'||P_EMPNO||'已插入!';
 39          ELSE
 40          V_MESSAGE:='雇员'||P_EMPNO||'已存在,不能插入!';
 41          END IF;
 42              SHOW_MESSAGE;
 43          EXCEPTION
 44             WHEN OTHERS THEN
 45                V_MESSAGE:='雇员'||P_EMPNO||'插入失败!';
 46                SHOW_MESSAGE;
 47          END INSERT_EMP;
 48   --------------------- 删除雇员过程 --------------------
 49          PROCEDURE DELETE_EMP(P_EMPNO NUMBER)
 50          IS
 51          BEGIN
 52          IF EXIST_EMP(P_EMPNO) THEN
 53          DELETE FROM EMP WHERE EMPNO=P_EMPNO;
 54          COMMIT;
 55              V_EMP_COUNT:=V_EMP_COUNT-1;
 56              V_MESSAGE:='雇员'||P_EMPNO||'已删除!';
 57           ELSE
 58              V_MESSAGE:='雇员'||P_EMPNO||'不存在,不能删除!';
 59          END IF;
 60              SHOW_MESSAGE;
 61          EXCEPTION
 62             WHEN OTHERS THEN
 63                V_MESSAGE:='雇员'||P_EMPNO||'删除失败!';
 64                SHOW_MESSAGE;
 65          END DELETE_EMP;
 66   --------------- 修改雇员工资过程 ----------------------
 67          PROCEDURE CHANGE_EMP_SAL(P_EMPNO NUMBER,P_SAL NUMBER)
 68          IS
 69          BEGIN
 70          IF (P_SAL>V_MAX_SAL OR P_SAL<V_MIN_SAL) THEN
 71            V_MESSAGE:='工资超出修改范围!';
 72          ELSIF NOT EXIST_EMP(P_EMPNO) THEN
 73             V_MESSAGE:='雇员'||P_EMPNO||'不存在,不能修改工资!';
 74          ELSE
 75             UPDATE EMP SET SAL=P_SAL WHERE EMPNO=P_EMPNO;
 76          COMMIT;
 77             V_MESSAGE:='雇员'||P_EMPNO||'工资已经修改!';
 78          END IF;
 79             SHOW_MESSAGE;
 80          EXCEPTION
 81             WHEN OTHERS THEN
 82                V_MESSAGE:='雇员'||P_EMPNO||'工资修改失败!';
 83                SHOW_MESSAGE;
 84          END CHANGE_EMP_SAL;
 85   ------------------ 显示信息过程 -----------------------
 86          PROCEDURE SHOW_MESSAGE
 87          IS
 88          BEGIN
 89              DBMS_OUTPUT.PUT_LINE('提示信息:'||V_MESSAGE);
 90          END SHOW_MESSAGE;
 91   -------------- 判断雇员是否存在函数 -------------------
 92          FUNCTION EXIST_EMP(P_EMPNO NUMBER)
 93          RETURN BOOLEAN
 94          IS
 95          V_NUM NUMBER; --局部变量
 96          BEGIN
 97          SELECT COUNT(*) INTO V_NUM FROM EMP WHERE EMPNO=P_EMPNO;
 98          IF V_NUM=1 THEN
 99             RETURN TRUE;
100          ELSE
101             RETURN FALSE;
102          END IF;
103          END EXIST_EMP;
104          -----------------------------
105      END EMP_PK;
106  /警告: 创建的包体带有编译错误。
SQL> spool off

解决方案 »

  1.   

    不好意思,贴错代码了,请看如下:分支语句偏瘫了SQL> l
      1  create or replace trigger trig_dept_editdata
      2  before insert or update or delete
      3  on t_dept
      4  declare
      5     v_data number;
      6     v_dy varchar2(25);
      7  begin
      8     select to_char(sysdate,'HH24') into v_data from dual;
      9     select to_char(sysdate,'dy','nls_date_language=american') into v_dy from dual;
     10     if v_data>17 or v_data<8 then
     11          raise_application_error(-20001,'不能在下班时间更新dept表');
     12   --raise_application_error是dbms_standard包中的一个过程,
     13   --可以重新自定义错误信息,-20000--20999,最多2048字节
     14     else if v_dy in ('SAT','SUN') then
     15        raise_application_error(-20002,'不能在周末更新dept表');
     16        else
     17           raise_application_error(-20003,'无法操作');
     18        end if;
     19     end if;
     20* end trig_dept_editdata;
    SQL> /触发器已创建SQL> spool off
    测试代码:
    insert into dept values(90,'总兵部','北戴河');
      

  2.   


    不好意思,贴错代码了,请看如下:分支语句偏瘫了SQL> l
      1 create or replace trigger trig_dept_editdata
      2 before insert or update or delete
      3 on t_dept
      4 declare
      5 v_data number;
      6 v_dy varchar2(25);
      7 begin
      8 select to_char(sysdate,'HH24') into v_data from dual;
      9 select to_char(sysdate,'dy','nls_date_language=american') into v_dy from dual;
     10 if v_data>17 or v_data<8 then
     11 raise_application_error(-20001,'不能在下班时间更新dept表');
     12 --raise_application_error是dbms_standard包中的一个过程,
     13 --可以重新自定义错误信息,-20000--20999,最多2048字节
     14 else if v_dy in ('SAT','SUN') then
     15 raise_application_error(-20002,'不能在周末更新dept表');
     16 else
     17 raise_application_error(-20003,'无法操作');
     18 end if;
     19 end if;
     20* end trig_dept_editdata;
    SQL> /触发器已创建SQL> spool off
    测试代码:
    insert into dept values(90,'总兵部','北戴河');
      

  3.   


    不好意思,贴错代码了,请看如下:分支语句偏瘫了SQL> l
      1 create or replace trigger trig_dept_editdata
      2 before insert or update or delete
      3 on t_dept
      4 declare
      5 v_data number;
      6 v_dy varchar2(25);
      7 begin
      8 select to_char(sysdate,'HH24') into v_data from dual;
      9 select to_char(sysdate,'dy','nls_date_language=american') into v_dy from dual;
     10 if v_data>17 or v_data<8 then
     11 raise_application_error(-20001,'不能在下班时间更新dept表');
     12 --raise_application_error是dbms_standard包中的一个过程,
     13 --可以重新自定义错误信息,-20000--20999,最多2048字节
     14 else if v_dy in ('SAT','SUN') then
     15 raise_application_error(-20002,'不能在周末更新dept表');
     16 else
     17 raise_application_error(-20003,'无法操作');
     18 end if;
     19 end if;
     20* end trig_dept_editdata;
    SQL> /触发器已创建SQL> spool off
    测试代码:
    insert into dept values(90,'总兵部','北戴河');