Oracle触发器

作者:互联网

2009-12-31

Oracle教程

--创建触发器(行级触发器)  
create or replace trigger tri_update_emp_bak  
after update  
on emp_bak  
for each row  --每更新一行 就触发一次   
begin 
     --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据  
       
 
     dbms_output.put_line('更新后' || :NEW.sal);  
      dbms_output.put_line('更新前' || :OLD.sal);  
        
      if updating then 
           
      end if;  
        
      if inserting   
 
end;  
 
 
--创建触发器(行级触发器)(前置)  
create or replace trigger tri3_update_emp_bak  
before update  
on emp_bak  
for each row  --每更新一行 就触发一次   
begin 
     --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据  
       
 
      dbms_output.put_line('更新后' || :NEW.sal);  
      dbms_output.put_line('更新前' || :OLD.sal);  
 
end;  
 
 
 
 
 
select * from emp_bak  
 
 
 
update emp_bak set sal = 1000 where empno in (7788)  
 
 
 
--创建触发器(表级触发器)   
--//表级别触发器里面 不允许使用 :NEW :OLD 变量  
create or replace trigger tri2_update_emp_bak  
after update  
on emp_bak  
begin 
 
            
      -- dbms_output.put_line('更新后' || :NEW.sal);  
      --dbms_output.put_line('更新前' || :OLD.sal);  
 
end;  
 
 
 
 
--创建触发器(行级触发器)  
create or replace trigger tri4_update_emp_bak  
after update of sal  
on emp_bak  
for each row  --每更新一行 就触发一次   
begin 
     --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据  
       
 
      dbms_output.put_line('更新后' || :NEW.sal);  
      dbms_output.put_line('更新前' || :OLD.sal);  
 
end;  
 
 
 
create table userinfo  
(  
       userid number(4) primary key,  
       username varchar2(20)  
)  
 
create table addrinfo  
(  
       addrid number(4) primary key,  
       addname varchar2(20),  
       userid number(4) references userinfo(userid)  
)  
 
insert into userinfo values (1,'李四')  
insert into addrinfo values (1,'湖北武汉',1)  
 
select * from addrinfo  
 
 
 
delete from userinfo where userid =1 
 
--级联删除  
create or replace trigger tri_userinfo_delete  
before  delete   
on userinfo  
for each row  
begin 
    delete from   addrinfo  where userid = :OLD.userid;  
   -- insert into   
end;  
 
 
 
 
 
create table dept_bak as select * from dept  
 
 
 
create or replace view  myview   
as 
  select a.empno,a.ename,a.sal,b.dname  
   from emp a inner join dept b  
   on a.deptno = b.deptno  
      
 
 
 
select * from myview  
 
update  myview set sal = 1000,dname='aaaaa' where empno = 7499 
 
 
--替代触发器  用在视图上面 只能是行级的  
--替代触发器 特点是 真正的操作已经 变成了一个动作而已 功能由触发器来完成  
create or replace trigger tri_myview  
instead of update   
on myview   
begin 
 
   dbms_output.put_line('删除操作执行了。。。');  
   update emp set sal = :NEW.sal where empno = :OLD.empno;  
     
   update dept set dname = :NEW.dname where dname = :OLD.dname;  
   --delete from emp where empno = :OLD.empno;  
 
end;  
 
 
 
select * from emp;  
select * from dept;  
 
 
update emp_bak set ename ='aaaa',sal = 10000 where empno in (7788)  
 
 
--系统包  
-- 产生随机数  
**** **** **** ****  
--dbms_random.value 0-1 之间的随机小数  
--dbms_random.random  随机整数  
select dbms_random.value from dual;  
 
 
 
create or replace procedure proc_cardno(mycardno out varchar2)  
as 
   tempcard varchar2(50);  
   cardno varchar2(19);  
begin 
   tempcard:= dbms_random.value;  
      
   cardno:=substr(tempcard,2,4)||' '||substr(tempcard,6,4)||' '||substr(tempcard,10,4)||' '||substr(tempcard,14,4);  
       
   mycardno:=cardno;  
     
--   dbms_output.put_line(tempcard);  
  -- dbms_output.put_line(cardno);  
end;  
 
 
 
 
 
 
--使用UTL_FILE包读写文件  
create directory MY_DIR as 'd:temp';  
create directory MY_DIR2 as 'd:temp2';  
 
declare  
  --定义文件对象   
   myfile utl_file.file_type;  
  --定义变量 用来存储每读出一行的数据  
   linestr varchar2(200);  
begin 
   --打开文件      
     myfile:= utl_file.fopen('MY_DIR','oracle.log','r');  
     
   --进行读取(循环)  
   loop  
           utl_file.get_line(myfile,linestr);  
           dbms_output.put_line(linestr);  
   end loop;  
        
     exception  
       when others  then   
           utl_file.fclose(myfile);  
          dbms_output.put_line('读取完毕!');  
             
end;  
 
 
 
 
 
 
declare  
  --定义文件对象   
   myfile utl_file.file_type;  
  --定义变量 用来存储每读出一行的数据  
   linestr varchar2(200);  
begin 
   --打开文件      
     myfile:= utl_file.fopen('MY_DIR','oracle.log','a');  
     
   --追加数据  
    
           --utl_file.get_line(myfile,linestr);  
           utl_file.put_line(myfile,'你好,这是新的数据',true);  
        
            utl_file.fclose(myfile);  
      exception  
       when others  then   
           utl_file.fclose(myfile);  
          dbms_output.put_line('读取完毕!');  
             
end;  
 
 
--拷贝  
 
 
 
declare  
  --定义文件对象   
   sourcefile utl_file.file_type;  
   targetfile utl_file.file_type;  
  --定义变量 用来存储每读出一行的数据  
   linestr varchar2(200);  
begin 
   --打开文件      
     sourcefile:= utl_file.fopen('MY_DIR','oracle.log','r');  
     targetfile:= utl_file.fopen('MY_DIR2','copy.txt','a');  
       
   --进行读取(循环) 并且写入到新的文件里面  
   loop  
            utl_file.get_line(sourcefile,linestr);  
            utl_file.put_line(targetfile,linestr,true);  
          -- dbms_output.put_line(linestr);  
   end loop;  
        
     exception  
       when others  then   
           utl_file.fclose(sourcefile);  
            utl_file.fclose(targetfile);  
          dbms_output.put_line('拷贝完毕!');  
             
end; 


本文来自CSDN博客,转载请标明出处: