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
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 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,'总兵部','北戴河');
不好意思,贴错代码了,请看如下:分支语句偏瘫了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,'总兵部','北戴河');
不好意思,贴错代码了,请看如下:分支语句偏瘫了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,'总兵部','北戴河');