oracle 触发器与包
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;