a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 141|回复: 2

[考试辅导] Oracle技术:Oracle触发器

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
--创建触发器(行级触发器)# m0 @2 Q  O) i) f  O( F
    create or replace trigger tri_update_emp_bak: j# D* g5 n4 |% t. g# F* v  O
    after update
" h: @3 _1 w( C    on emp_bak; M0 P3 D6 M0 w( H2 T
    for each row  --每更新一行 就触发一次
# E* J# t! v5 @2 M2 j8 E1 ?# b    begin
( d; G9 u3 M& e' v. w9 o    --Oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据
3 E# E% r+ Y/ b, q, l    dbms_output.put_line('更新后' || :NEW.sal);
2 y. v. N( h# e* F/ h: J5 Q4 `    dbms_output.put_line('更新前' || :OLD.sal);) b9 |1 T! o9 N
    if updating then
5 Y$ }4 g8 `' F! E- g+ }6 [7 M6 Q    end if;
6 ]" V" x  j0 l- M' M    if inserting! U( A& d4 @6 t6 m' d% N' P, h
    end;# U8 d$ w  x% C
    --创建触发器(行级触发器)(前置)" r6 O& c+ h) P4 s
    create or replace trigger tri3_update_emp_bak# V' m$ e+ O; b4 @" X/ ]; ?
    before update
* p7 n& {% M5 X% v! n- E. |$ ^    on emp_bak
0 x! z: ~$ m7 h" w& V: r    for each row  --每更新一行 就触发一次
7 t% K* K2 s  \3 C- o$ f    begin
$ y) P' P8 L5 _, ^    --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据" I9 N9 C2 H/ n; ]6 o4 a. ]9 K
    dbms_output.put_line('更新后' || :NEW.sal);
/ l: W3 v9 m2 J6 a; k    dbms_output.put_line('更新前' || :OLD.sal);
; P7 S3 Y0 c; c    end;
6 d5 w; ~& M" D9 v8 N    select * from emp_bak
! S$ |! R9 F2 c  h2 Q: g    update emp_bak set sal = 1000 where empno in (7788)+ u4 O. F1 V6 p* D: K! \+ n7 a" x% ]
    --创建触发器(表级触发器)7 D8 C0 N" T3 k# g) U
    --//表级别触发器里面 不允许使用 :NEW :OLD 变量+ X) K" V. {5 q& y7 k, X8 }+ M- W
    create or replace trigger tri2_update_emp_bak4 A) o. r, D% k" u5 b/ a
    after update( |* d6 n, {: I/ E+ I
    on emp_bak
0 C+ y( T* j" v2 X) n: @  |    begin
" [5 y9 w3 {3 p/ {% v    -- dbms_output.put_line('更新后' || :NEW.sal);, X6 P% ?% y0 F+ ~2 a
    --dbms_output.put_line('更新前' || :OLD.sal);
9 w: v7 m, L: P) U7 \1 e    end;
& I! t: `) N! [. m    --创建触发器(行级触发器)
8 n* q0 s* S+ L    create or replace trigger tri4_update_emp_bak! G" H' Q; |$ F* b' `: s5 l( E
    after update of sal
- @, w; E. t' L! f. b$ W    on emp_bak
) f& e, G/ [6 }, N3 R7 q    for each row  --每更新一行 就触发一次% K" b7 O, H, k& l  D
    begin$ `/ V6 z2 K! @/ b$ s$ O
    --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据7 M2 o  j0 H! O/ |* C
    dbms_output.put_line('更新后' || :NEW.sal);, @# n' }% {! M  g6 C) s4 S" Y
    dbms_output.put_line('更新前' || :OLD.sal);, {( L" f, d! F- o! U* f7 m
    end;  T8 ?, d, q$ u( b/ t5 X
    create table userinfo
% n0 I9 F, |7 J! Q8 e    (  x9 C! z4 [9 E8 J( r/ X- V
    userid number(4) PRimary key,0 k$ }- W! E8 b0 n6 }( _+ t! \
    username varchar2(20)* }* N: T7 W0 U/ _. _3 f2 P
    )
, W& ^" q& X4 L1 Q: \: v  q- c    create table addrinfo
1 H- P2 a$ N# `! s    (
* G. a; o+ i+ A% I; ?    addrid number(4) primary key,8 P: v8 A7 h$ g/ r
    addname varchar2(20),  R3 R6 C9 j( X
    userid number(4) references userinfo(userid)# S# |; n. K/ w$ y6 U, U5 l, G
    )( q8 K% W% g- Z3 W9 T% f$ ~) W
    insert into userinfo values (1,'李四')
6 S6 h1 B2 j+ G    insert into addrinfo values (1,'湖北武汉',1)
4 [! @2 T4 S7 h; s2 k    select * from addrinfo/ M4 k, j9 P5 }
    delete from userinfo where userid =1
) P( P( I) l- L) z    --级联删除
( q0 ]6 S1 n2 v* J+ R    create or replace trigger tri_userinfo_delete9 j! {% B# v* l: ?+ z$ W) `
    before  delete
2 ~5 J7 e5 ?# X7 D) s- p0 x% n- ?1 @4 O    on userinfo# o/ M2 ~" _; ]
    for each row& S+ I% P0 I4 C1 B- g2 N
    begin
6 B! B6 t# k  J  L" j" G    delete from   addrinfo  where userid = :OLD.userid;, f/ G9 t( K  h' ~0 \) Y" S9 J5 F+ _
    -- insert into4 I  W3 P. u' t1 T( u) s9 n' z
    end;
0 I6 j) Z. a0 k8 R+ J! o    create table dept_bak as select * from dept
' v. N9 f, b( I) ~4 }2 m- v) T    create or replace view  myview# y: ?$ E" o* A
    as
5 s1 l- l4 q0 t: o" j8 a  j    select a.empno,a.ename,a.sal,b.dname7 N/ a' \  z# p+ H4 h7 @
    from emp a inner join dept b) z% g# u$ w0 C6 q  E6 F
    on a.deptno = b.deptno
' N. m) w2 b7 C9 M& x1 k    select * from myview
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:Oracle触发器

update  myview set sal = 1000,dname='aaaaa' where empno = 7499
6 X1 A" ]8 Y* L7 L5 t    --替代触发器  用在视图上面 只能是行级的! d3 y: B# I* h0 }1 r
    --替代触发器 特点是 真正的操作已经 变成了一个动作而已 功能由触发器来完成
5 W/ k( K! l. C5 a8 U. w9 b( O    create or replace trigger tri_myview
3 k7 q1 B- p) S    instead of update
4 n: {; n$ x5 F/ R' ]    on myview2 O$ z& i! b. |% `& A  u
    begin
- N: Z7 z  h$ d( q4 i' o/ i7 ?    dbms_output.put_line('删除操作执行了。。。');4 L( `1 S& a5 y# f
    update emp set sal = :NEW.sal where empno = :OLD.empno;* q, w  E0 }1 @7 b% t
    update dept set dname = :NEW.dname where dname = :OLD.dname;! t; w" T" e" y0 c2 [2 d; e
    --delete from emp where empno = :OLD.empno;
( i- n: I: _( C: J6 u: ^/ ]    end;
% h4 e" J" T' @$ g- Q8 y0 N# F! `    select * from emp;
! R& N2 f+ u3 t* E4 `- B    select * from dept;/ |( s: R8 `% q( B3 j
    update emp_bak set ename ='aaaa',sal = 10000 where empno in (7788)
, O: ~0 s; V, c0 s& a, J    --系统包4 g% M; X. W, y: N
    -- 产生随机数- I4 ?/ @( }1 A8 T
    **** **** **** ****3 u" v" `$ N; a  o# d/ ^+ X8 v% b( ^
    --dbms_random.value 0-1 之间的随机小数
4 {+ X# a' G  e& G/ A! e& y    --dbms_random.random  随机整数! v: P; }# P; o& i
    select dbms_random.value from dual;1 }! c/ Z: O' z! A
    create or replace procedure proc_cardno(mycardno out varchar2)7 s8 y0 R/ |# j) h6 s6 _6 z
    as
8 u8 @  S. D7 e7 P$ ]/ r    tempcard varchar2(50);
0 a( a" A* w! }& A+ g5 q4 ^    cardno varchar2(19);
! g- N$ |( N4 ]  c5 M4 Y+ ?2 v8 Y* C    begin
. V$ q5 P" O( l- U3 i  U; y    tempcard:= dbms_random.value;+ V+ V. W% ~: s
    cardno:=substr(tempcard,2,4)||' '||substr(tempcard,6,4)||' '||substr(tempcard,10,4)||' '||substr(tempcard,14,4);: c! u0 ]4 p( e7 r# ]. }
    mycardno:=cardno;/ u- y/ g3 y7 F0 L9 g  ~2 T
    --   dbms_output.put_line(tempcard);; H& T6 ]/ P2 M7 |2 }% D
    -- dbms_output.put_line(cardno);
- f( N: D7 B6 i0 f2 R    end;
0 g6 J( Z. M/ H6 _2 J& {    --使用UTL_FILE包读写文件8 p1 L' F" i8 x2 N2 b
    create directory MY_DIR as 'd:\temp';, h1 i5 x4 g% y/ D
    create directory MY_DIR2 as 'd:\temp2';
7 q3 |2 ]% U. x- @! \# j    declare
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:21 | 显示全部楼层

Oracle技术:Oracle触发器

--定义文件对象
0 y- z+ J7 U0 o2 \3 F* i# r    myfile utl_file.file_type;1 `7 Q) P: m4 r% U
    --定义变量 用来存储每读出一行的数据
# v  D& V" s; U9 _; U  D' r    linestr varchar2(200);
- P) ^9 E: @  c+ b    begin
5 V4 l7 B# {9 I! b1 n    --打开文件
+ G1 c* p/ _3 E    myfile:= utl_file.fopen('MY_DIR','oracle.log','r');
, t& L& l8 C6 W1 M    --进行读取(循环)
# ], V* Y$ Z6 V    loop- v3 |( ~6 e* r2 B
    utl_file.get_line(myfile,linestr);: `- Q+ l: ?  b$ O9 W
    dbms_output.put_line(linestr);& [) P9 |4 b3 A& N5 i4 y2 s
    end loop;6 G0 a. N  ^. z) O1 y
    exception
5 f3 `9 p. \# ]. o& @" q    when others  then5 `! l- j# U' s+ y; m2 o' I, a
    utl_file.fclose(myfile);
9 O" [% t6 x5 ~! [9 @: U% M& K    dbms_output.put_line('读取完毕!');) W* D# }+ p: j2 t4 x  O
    end;* I" E6 i! R/ Y+ w* U
    declare
2 v3 m# b5 i  `+ D: j- P    --定义文件对象
+ K! h2 b$ c3 S+ L" s+ t# M    myfile utl_file.file_type;
  R5 c' n; H! B6 E5 L  v5 M5 \    --定义变量 用来存储每读出一行的数据
+ s+ b$ B0 G/ u( K    linestr varchar2(200);
$ Q# e8 W- W. G8 x    begin% l8 t, V0 s& k! b" z) J$ a
    --打开文件
& E" y- |9 G; O# H    myfile:= utl_file.fopen('MY_DIR','oracle.log','a');% w2 l( {: K' v
    --追加数据
. `0 t  {& v$ J* o+ i    --utl_file.get_line(myfile,linestr);3 N. e# N2 ~* ?, o$ |
    utl_file.put_line(myfile,'你好,这是新的数据',true);
; |! h4 L# G1 B+ R$ _- d8 o    utl_file.fclose(myfile);' C3 u  z+ M2 I
    exception
8 o8 s, C- H1 d7 g% z4 h    when others  then
+ U, r2 M% ^8 n$ K% Q. ~1 ~. f+ c    utl_file.fclose(myfile);
9 L& n% n7 |" v/ v- Z" E0 q    dbms_output.put_line('读取完毕!');: q! U/ E* E" I6 }
    end;
% |7 ^# S6 e" X% E) C% y8 ^& t  C    --拷贝9 h7 i0 {, e/ Z. M3 g' J$ _
    declare& C1 L5 q+ z4 P4 T
    --定义文件对象8 J# ?# b2 F) J+ \
    sourcefile utl_file.file_type;3 t+ V8 j8 L6 ?3 u2 @
    targetfile utl_file.file_type;, _! l- k/ a5 r
    --定义变量 用来存储每读出一行的数据
- h% m+ j# Y6 u( Y. v2 [& @9 _5 u    linestr varchar2(200);
* a7 p( D- C: H) [3 z    begin! W0 I' o, i9 b; Y7 l6 Y4 u% N; N
    --打开文件( x9 z5 S0 S0 s. B! O4 p- L8 {
    sourcefile:= utl_file.fopen('MY_DIR','oracle.log','r');
* N; T2 |( l) D9 l) ?" G    targetfile:= utl_file.fopen('MY_DIR2','copy.txt','a');
) r4 b) }' D( s3 M. H+ j9 [& Z    --进行读取(循环) 并且写入到新的文件里面: z- w" M4 W  O% N( l
    loop
* O% J7 P: b& ?: D    utl_file.get_line(sourcefile,linestr);
% _- ]( \6 R: H' i' F4 n: Z" z    utl_file.put_line(targetfile,linestr,true);
) o. x( D' j: W8 z$ Z* ]    -- dbms_output.put_line(linestr);
+ X) w3 l6 \  ?& v) ?9 d& X/ r    end loop;
$ V& z; e6 e4 N    exception1 P$ E4 z% F5 x  W8 [
    when others  then$ E6 u  s* K8 N
    utl_file.fclose(sourcefile);4 Y4 z( x1 U8 b7 w4 O- s6 q
    utl_file.fclose(targetfile);
( C( R1 \* `& m1 R, x5 r# `/ J    dbms_output.put_line('拷贝完毕!');
8 }% B5 I* _. M    end;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 21:07 , Processed in 0.208024 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表