Oracle触发器

–创建触发器(行级触发器)  
create or replace trigger tri_update_emp_bak  
after update  
on emp_bak  
for each row –每更新一行 就触发一次   
begin
     –oracle 里面 对触发器 也提供了特殊的对象 :NEW
–创建触发器(行级触发器)  
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: emp’;  
create directory MY_DIR2 as ‘d: emp2′;  

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;

http://edu.codepub.com/2010/0101/19285.php

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>