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;

 

posted @ 2013-01-25 11:51  全力以赴001  阅读(434)  评论(0编辑  收藏  举报