a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 161|回复: 2

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
--创建触发器(行级触发器)( t  U# x9 B  n% @) ?4 N
    create or replace trigger tri_update_emp_bak- l' N  l3 h7 L
    after update& k$ X& ~; N% u( j- k: ]# {8 ^
    on emp_bak
1 g+ }( G* J" M3 y2 v% p' r1 G    for each row  --每更新一行 就触发一次) W6 m' d% N% z, x  m
    begin, z. U/ o" b4 _
    --Oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据
4 m! l( l' c/ w! y$ H+ \) b    dbms_output.put_line('更新后' || :NEW.sal);
# C  C! {/ w7 e% P0 @' }6 O    dbms_output.put_line('更新前' || :OLD.sal);
0 e6 d( g; o: A  E$ d  u) ~5 @0 s    if updating then. O2 ~& k& {8 S& T# W+ A5 L; P
    end if;$ j/ ]. h3 z$ M, R+ z1 |' X
    if inserting/ |! G; [9 i" O# a
    end;5 O. q+ z- p1 B3 x) W- F. a5 F
    --创建触发器(行级触发器)(前置)
4 r7 K5 M, U/ W: E    create or replace trigger tri3_update_emp_bak$ W" D* e: I, h
    before update
# x* w7 }3 x7 f8 A0 x    on emp_bak; Y. ~. c+ r# N8 q4 Q  U  v
    for each row  --每更新一行 就触发一次- ]5 H3 a! C; E8 N+ u% C9 J
    begin
& Q; {; y+ Y8 p7 L  `1 t    --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据. |( Y0 q1 b' T/ `
    dbms_output.put_line('更新后' || :NEW.sal);
4 c- t: b: o, l# w! r  E    dbms_output.put_line('更新前' || :OLD.sal);
& A2 z( Z! w# r, C) ?7 i6 ~    end;& n/ J/ A1 H* c" B1 R
    select * from emp_bak3 n' d1 h& z6 X$ T
    update emp_bak set sal = 1000 where empno in (7788)
, C$ P2 C7 @) I: n  \9 s2 m3 T    --创建触发器(表级触发器)
0 l# c5 z" {/ k& v5 ?5 F# Q    --//表级别触发器里面 不允许使用 :NEW :OLD 变量4 Q) T" B4 y/ x6 w+ n6 `2 M7 ?
    create or replace trigger tri2_update_emp_bak
& o  P) e. |# U( Y    after update( f- V9 m! `8 j' m4 |
    on emp_bak7 m# i; c9 \: A! G! z4 m! ~
    begin
/ b, |2 `+ x8 t9 Y! V4 s8 |* ^0 C    -- dbms_output.put_line('更新后' || :NEW.sal);8 u$ R  P  ~) V8 G
    --dbms_output.put_line('更新前' || :OLD.sal);
* J& v! o' U- Z0 w$ m    end;; I8 O5 k. s& @; e$ n& x
    --创建触发器(行级触发器)3 X' ?) k7 g9 T& m5 B; V; o7 _# k
    create or replace trigger tri4_update_emp_bak
  B/ n0 B$ |5 d( g( H5 E5 Q    after update of sal7 h& M* s0 L% z3 z! u% B2 e: g7 A
    on emp_bak
4 I. i! I8 e$ ~) P    for each row  --每更新一行 就触发一次( t9 Z- S3 @; `) y4 |* r' ~" G
    begin, f: u9 Y) Z" g2 C) u- t; P& T
    --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据6 |  g, o' _1 D! a+ g( L  Z
    dbms_output.put_line('更新后' || :NEW.sal);
8 f, B* _' A# X. O    dbms_output.put_line('更新前' || :OLD.sal);
" M; Q+ z5 @& {) e0 b& e- ]2 L8 ^% O    end;
- B3 F. K7 z: P' r) i! N    create table userinfo
2 Q5 r( w7 j: A+ y8 _, n0 x    (5 m7 r$ @6 w8 ?+ H& i1 J, E" @1 ]  h
    userid number(4) PRimary key,0 X& p8 S) P/ q- F& n# }
    username varchar2(20)
( O. t( m$ U3 A    )' P% _* i" w2 A
    create table addrinfo# P) U7 f6 ]1 A* `( d: v
    (* B" Z( h" n; H0 q: P1 l8 S6 t
    addrid number(4) primary key,
, _' R: I% p" @5 A) g5 g& j) P% Q! Z    addname varchar2(20),: Z, o& d1 N3 ~# [
    userid number(4) references userinfo(userid)
" c% r9 w( z& m    )
1 O, j! L$ f: U/ ~# B9 k8 |$ g* V1 @    insert into userinfo values (1,'李四')
0 Q7 p' v" k- x    insert into addrinfo values (1,'湖北武汉',1)
% t+ k( C3 j! V. D    select * from addrinfo
- e; ~# G. W; ^    delete from userinfo where userid =1
. T; C3 D1 j1 P& N    --级联删除3 T  W; Z: u8 {# B
    create or replace trigger tri_userinfo_delete: h2 a8 K& v# Z" e8 i
    before  delete. d' Q, ^$ {! |2 g, {
    on userinfo3 `8 `, Y' m1 ]4 Q$ ]1 Y
    for each row
5 V, Z+ S$ w7 a+ @  \    begin
4 a' v8 K/ ~4 k    delete from   addrinfo  where userid = :OLD.userid;
7 o8 h  S6 B) }' l" Q" S    -- insert into
& g  C# r: V& B4 d    end;
  `5 x' N9 t- q  I    create table dept_bak as select * from dept
; M6 K9 H* R% F# }. n6 C( F1 I    create or replace view  myview
! w) c6 S. ?0 ^- H4 j    as! |- m$ d, y# O8 D
    select a.empno,a.ename,a.sal,b.dname  f3 U+ k8 f  O8 \
    from emp a inner join dept b
8 o( [1 o. j+ L" v+ H    on a.deptno = b.deptno
6 u" Q* w) G  `6 \    select * from myview
回复

使用道具 举报

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

Oracle技术:Oracle触发器

update  myview set sal = 1000,dname='aaaaa' where empno = 7499
+ o) k& k# n+ S9 J3 g- u. c    --替代触发器  用在视图上面 只能是行级的4 ~$ g( k, Q. y3 |- k3 k& ^
    --替代触发器 特点是 真正的操作已经 变成了一个动作而已 功能由触发器来完成, ^4 w8 P  H- m
    create or replace trigger tri_myview! g+ j/ ]6 A7 j* x' W) I
    instead of update
1 a0 h2 [& x& g) Q/ ~    on myview) q. N9 h; r4 K" G$ u
    begin; y; ~. L) ~; j; A/ i
    dbms_output.put_line('删除操作执行了。。。');4 b/ D1 m! @0 m7 i; j. P
    update emp set sal = :NEW.sal where empno = :OLD.empno;
' t+ r0 a: p% U* ?    update dept set dname = :NEW.dname where dname = :OLD.dname;
  o* n/ M  S: `    --delete from emp where empno = :OLD.empno;
- j0 `7 D, i. @) }& u. r1 {( ^1 s: X# V    end;
) a4 A' n) W, U: U    select * from emp;2 ]! K' ?% f% Y* Q$ \
    select * from dept;
1 T1 F; c; A; ^: Y" j; ]% i    update emp_bak set ename ='aaaa',sal = 10000 where empno in (7788)0 ]2 R: `) D# G) }* E5 n
    --系统包
& X* x, q/ t- k# ]+ l& U* l- Q; W    -- 产生随机数
8 s# H' L/ X5 n, F' v    **** **** **** ****
; a$ b; G4 n5 h# a8 \, Y4 k8 N    --dbms_random.value 0-1 之间的随机小数
8 g7 E6 G: u+ Z4 d, R. I! Q    --dbms_random.random  随机整数
( I: h; P  G: Z+ E; o: i) @; ]    select dbms_random.value from dual;
7 H" ]; Y4 j3 v; |* @    create or replace procedure proc_cardno(mycardno out varchar2)9 f) S* X5 H6 h$ c% G/ n1 Z- n
    as
. Q" {+ m$ |/ P/ R: w2 O0 Y    tempcard varchar2(50);
/ m- F% q' {$ z4 {5 y0 `# @    cardno varchar2(19);. \) |8 \* l5 x. I# I: N5 B
    begin2 S8 Z. p( v% C' z2 I% V
    tempcard:= dbms_random.value;8 n+ r  Z- ^3 z" X, u- q
    cardno:=substr(tempcard,2,4)||' '||substr(tempcard,6,4)||' '||substr(tempcard,10,4)||' '||substr(tempcard,14,4);
. ]$ L1 Y' z5 }% @% H3 B% I1 i    mycardno:=cardno;
' {0 |$ V2 k+ b" h0 }& F    --   dbms_output.put_line(tempcard);
" s4 P1 z- r" u1 Y    -- dbms_output.put_line(cardno);
# c* _1 X7 M3 \( J' q% p4 Z; U    end;
) v0 [& ^2 c& T3 p    --使用UTL_FILE包读写文件
8 E1 R) b0 ~( e. y- L    create directory MY_DIR as 'd:\temp';( i* N% s$ r0 R( a5 N" X
    create directory MY_DIR2 as 'd:\temp2';
, z2 ]8 R% i& e- X% u; b    declare
回复 支持 反对

使用道具 举报

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

Oracle技术:Oracle触发器

--定义文件对象' t- [1 N6 W, J, S
    myfile utl_file.file_type;" \) d. p7 r) e- h8 U2 j
    --定义变量 用来存储每读出一行的数据
, Y# e9 |8 v, }: E" B4 p0 E    linestr varchar2(200);0 O- ~& t6 n& B$ @8 k! d7 R
    begin1 t. B' p* n/ [& |! x
    --打开文件/ B5 X4 w. b' O- Y7 w
    myfile:= utl_file.fopen('MY_DIR','oracle.log','r');
4 c- U5 t6 Q9 ?    --进行读取(循环)
2 ~0 X8 v+ H8 F9 K: @$ i    loop/ |. ^( R2 p2 w4 Z. [
    utl_file.get_line(myfile,linestr);& X, R9 T1 d& T% r# D9 n
    dbms_output.put_line(linestr);8 ]% c, |% g; M
    end loop;- O' C1 S8 G0 v, {& j
    exception
, i3 ]: H! G% a0 A& q  G    when others  then* u8 i( T( B  D; K7 n5 d/ U9 z( M: ^0 b
    utl_file.fclose(myfile);! z1 i4 F2 g/ A# z
    dbms_output.put_line('读取完毕!');$ t: R4 S5 B; h! {/ H& ?
    end;
+ `. }) s7 ]3 K6 [) a( I7 k6 f, A9 M    declare/ N* z  D# ^7 ]
    --定义文件对象4 V+ M9 O/ p1 `* A6 f; `2 w) |" X
    myfile utl_file.file_type;5 V% c9 ^* |, t( O
    --定义变量 用来存储每读出一行的数据
' `& A/ @2 c) C9 `6 n# q    linestr varchar2(200);
0 o: w) r- Y; D: w$ }: [6 P7 W& t    begin2 S& n: R+ w" \  l* s
    --打开文件
+ c5 J5 F5 L7 v3 [3 Q' R; n    myfile:= utl_file.fopen('MY_DIR','oracle.log','a');
, U6 ^5 f4 t+ y* i( s    --追加数据  E- Q; r! g6 r( i2 O
    --utl_file.get_line(myfile,linestr);
, c8 a; {+ a2 t    utl_file.put_line(myfile,'你好,这是新的数据',true);2 q8 x4 ?# M* ?8 q/ L
    utl_file.fclose(myfile);
2 M( s( g  ]7 s7 @6 v, t    exception+ h  K: h- Z9 Y& Y/ b8 Z$ X4 |! I$ u
    when others  then, s- |0 m2 R7 M2 i7 |
    utl_file.fclose(myfile);: {( o: b" S5 g# k
    dbms_output.put_line('读取完毕!');
8 v) {" Y) P! B: b    end;7 t& O" W% q' a' W( n
    --拷贝
3 v8 a# U# [/ j$ c8 b    declare& j* ?) h8 k' r: ]2 T) d
    --定义文件对象4 p9 p- O3 K3 @6 |! I7 w5 R' ~
    sourcefile utl_file.file_type;, T/ A0 a" k" l1 q& @7 `9 |7 i
    targetfile utl_file.file_type;
# G% X$ j" g6 v: y& ~; n' z$ q( g    --定义变量 用来存储每读出一行的数据
5 R6 X; C' C! ^. Z9 y    linestr varchar2(200);. @, e3 B5 j0 g( [4 Y
    begin
4 z7 I! Q+ n6 M3 ], y- K# f+ I    --打开文件' Y7 }" o2 _/ m" S$ e, F
    sourcefile:= utl_file.fopen('MY_DIR','oracle.log','r');, d$ S  Y# W/ p8 _8 L
    targetfile:= utl_file.fopen('MY_DIR2','copy.txt','a');9 [( N2 T6 \* u, J  b) |
    --进行读取(循环) 并且写入到新的文件里面2 X" e% q3 E' a% T5 E4 W- A
    loop0 G5 ^: Q: h# m& o3 C& K
    utl_file.get_line(sourcefile,linestr);% B7 N& V/ E" o7 L) C
    utl_file.put_line(targetfile,linestr,true);5 m/ Z2 ^7 d' f; W5 \/ j; p
    -- dbms_output.put_line(linestr);. D" R4 s1 ~" r# I9 C4 `
    end loop;: N& t  ], I4 A& U1 z2 B& R
    exception
; X1 c" Q8 O! R  d    when others  then- x! q, B6 B2 D$ ~( o6 n: a
    utl_file.fclose(sourcefile);
; @+ ~; J; z) G: _/ {    utl_file.fclose(targetfile);0 D" u' @8 J' p+ O8 i. ?
    dbms_output.put_line('拷贝完毕!');; p1 U/ m* Z/ ~1 g, ^; p' Y
    end;
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 08:16 , Processed in 0.292911 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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