1 /*
2
3 1. 触发器
4 什么是触发器?
5 更改表中数据时,自动执行的一组代码。
6
7 触发器特征:
8 触发事件、触发条件、触发操作。
9 事件(insert、update、delete)
10 条件(on 表对象)
11 操作(具体的plsql功能代码)
12 时机(先后循环;之前执行(before)、之后执行(after))
13
14 触发器的分类(级别):表级别、行级别。
15
16 行级别:NEW(新的数据)、:OLD(旧的数据)
17
18 表级别示例:before insert on test1
19 行级别示例:before insert on test1 for each row
20
21
22 2. 程序包。
23
24 */
25 -------------------------------------程序包--------------------------------------------
26 --包(将过程、函数逻辑上存放在一起)
27 --存储过程、函数
28
29 --系统内置包。
30 dbms_output
31 dbms_lob
32
33 --用户自定义包。
34
35 --包(包头(过程、函数的声明)、包体(过程、函数具体实现))
36
37 --包头
38 create or replace package first_package
39 as
40 procedure show99;--99乘法表
41 procedure showEmpInfo(eno number);
42 end first_package;
43
44 --包体(具体实现)
45 create or replace package body first_package
46 as
47 procedure show99
48 as
49 begin
50 for i in 1..9 loop
51 for j in 1..i loop
52 dbms_output.put(i*j||' ');
53 end loop;
54 dbms_output.put_line('');
55 end loop;
56 end show99;
57
58 procedure showEmpInfo(eno number)
59 as
60 empinfo scott.emp%rowtype;
61 begin
62 select * into empinfo from scott.emp where empno=eno;
63 dbms_output.put_line(empinfo.empno||':'||empinfo.ename);
64 exception
65 when no_data_found then
66 dbms_output.put_line('没有找到该员工的信息');
67 when others then
68 dbms_output.put_line('others.............');
69 end showEmpInfo;
70 end first_package;
71
72 --调用
73 begin
74 first_package.showEmpInfo(&编号);
75 end;
76
77 select first_package.fun from dual;
78
79
80
81
82
83
84
85
86
87
88 -------------------------------------触发器操作--------------------------------------------
89 --将表锁定(判断星期一、星期五表中的数据,可以正常操作;否则不能操作该表数据)
90
91 create or replace trigger trig_test_table
92 before insert or update or delete on test1
93 declare
94 cweekday varchar2(20);
95 begin
96 select to_char(sysdate,'dy') into cweekday from dual;
97 if cweekday='星期六' or cweekday='星期日' then
98 dbms_output.put_line('你不能操作这张表哟!');
99 raise_application_error(-20005,'今天系统放假了!');--抛异常,阻止用户操作
100 end if;
101 end;
102
103 select to_char(sysdate,'dy') from dual;
104
105
106 create table test1
107 (
108 tid int primary key,
109 tname varchar2(20)
110 )
111
112 insert into test1 values (sequ_test1.nextval,'admin')
113
114 create sequence sequ_test1
115
116
117 select * from test1
118
119 --能否利用触发器,给test1表添加一个自动增长列。
120 --drop trigger trigger_test1
121 create or replace trigger trigger_test1
122 before insert on test1 for each row
123 declare
124 begin
125 select sequ_test1.nextval into :NEW.tid from dual;
126 end;