a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 142|回复: 2

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
--创建触发器(行级触发器)
/ q& L& E' f+ y    create or replace trigger tri_update_emp_bak' |+ A6 _$ g- V/ Y- B; a, Y+ p
    after update
  [3 t! }  B, Y& K" p, o* H$ j    on emp_bak
# L" b8 Y9 i. I, V5 R% v    for each row  --每更新一行 就触发一次( [" x& t& U0 p* s$ p
    begin  ?+ \0 j. Q, c) \( {7 u
    --Oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据* x) R5 D9 d3 h6 w  ^( d
    dbms_output.put_line('更新后' || :NEW.sal);! m5 k7 \5 W6 T! c: j0 A0 E' R8 M
    dbms_output.put_line('更新前' || :OLD.sal);' R7 {  U& \) P
    if updating then
! w2 E/ D4 V, ]0 G  L( `- z    end if;$ G( T$ F9 G$ F/ a
    if inserting
  G3 g4 [1 ~: n5 K. X3 G    end;5 A% e( Y. L: Y: y
    --创建触发器(行级触发器)(前置)
3 V, E1 [% D7 Z$ c" F    create or replace trigger tri3_update_emp_bak+ M" b& c; c8 t4 ?& M2 E! G
    before update9 y' c% a, e, [- L! g2 g% C
    on emp_bak
5 o5 t2 d. f. F: `+ k    for each row  --每更新一行 就触发一次
( m6 {- N: d% R- F    begin
; O3 a1 w, e8 D) F  O    --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据
6 p& N. @* u9 F# l8 ]: e    dbms_output.put_line('更新后' || :NEW.sal);2 W4 `, g; w% D+ U
    dbms_output.put_line('更新前' || :OLD.sal);4 r) R" ^, P# _1 M
    end;% s( n/ K9 `) [' c, R
    select * from emp_bak
# h' g' M- e& }/ n7 ?; r; O    update emp_bak set sal = 1000 where empno in (7788)- x6 K9 k3 s! r+ y, m3 D* r1 h
    --创建触发器(表级触发器)
2 Y. Q; Q9 c# l3 K4 @$ r7 i: d    --//表级别触发器里面 不允许使用 :NEW :OLD 变量
6 U! P) j  F) ?: V" a; [1 O    create or replace trigger tri2_update_emp_bak
) c5 T; S/ L5 M7 y+ {7 M6 y  c    after update. N& K1 g! N/ P' E% O1 p) Z
    on emp_bak
( V- i8 N) g5 Y- B- A( b    begin
4 }$ [$ X7 z& X$ Z5 `: U    -- dbms_output.put_line('更新后' || :NEW.sal);0 f1 {/ X3 p$ c9 j7 [
    --dbms_output.put_line('更新前' || :OLD.sal);& _' `2 z7 G* }& d" J
    end;0 f$ `  R: B& R" y) g# r3 I
    --创建触发器(行级触发器)  h  P% a  l- `4 r+ u" o# h+ a
    create or replace trigger tri4_update_emp_bak, d( z. t9 E, ~
    after update of sal5 L2 R4 a2 S8 M2 S8 C6 t
    on emp_bak5 W" ]* `4 I) M0 ^. y# j% N- [5 [
    for each row  --每更新一行 就触发一次
1 v# X, j+ s* [# N' v    begin. r; e2 X6 s8 T2 q9 @
    --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据
4 g/ u  F2 G& u5 q$ e7 }3 U    dbms_output.put_line('更新后' || :NEW.sal);
& S9 M4 d+ V4 O6 Z+ r1 {9 }) u    dbms_output.put_line('更新前' || :OLD.sal);
1 d+ W; x/ F: C  i: J    end;
, e5 y& f' H; \1 ^# S    create table userinfo
  C$ j, E+ t, }    (
0 w! q4 X8 Y/ Z; G/ ?+ g    userid number(4) PRimary key,
$ a9 F6 d( A8 B. R& o    username varchar2(20)" P: M8 b* {- }
    )
/ u+ ]. h' d5 d+ T( g8 L    create table addrinfo) Y  ]& [2 i* o, U: w- W* `
    (
* N* `" n9 F6 K/ ^- ~% o( B    addrid number(4) primary key,4 V  w" @( G, K" t! a6 H
    addname varchar2(20),4 t0 ~2 I6 d- z! K5 m# f( ^
    userid number(4) references userinfo(userid)5 R' P3 ~3 A9 z. G: e* A$ ~1 @
    )
- b1 [+ L6 [: ^6 w3 E# v7 D    insert into userinfo values (1,'李四')
8 u0 Z5 S- E8 r) B3 E- _) T    insert into addrinfo values (1,'湖北武汉',1). s8 y% v$ P3 s5 k
    select * from addrinfo
8 _  u* T3 O$ c; S/ U    delete from userinfo where userid =1
6 j4 z& \! I4 }7 {    --级联删除
3 l1 A0 k) h; M* y- w    create or replace trigger tri_userinfo_delete5 n4 K5 b: h! q, C/ f. J
    before  delete
) W# E# X1 D  l2 ]; u2 b    on userinfo
, Q. L  J3 k" U3 e4 k6 [  `    for each row
# c5 }9 f9 a, G; D    begin
2 m1 \. z/ |; P! \5 U    delete from   addrinfo  where userid = :OLD.userid;
% j8 [) E8 M: h$ a4 t. d( C    -- insert into
5 R/ H$ x! h, \; L/ ~9 Z( W    end;
) g! \; v* l* b* P$ s( M    create table dept_bak as select * from dept
. G6 }( p) N  x1 r. X5 B2 m8 k    create or replace view  myview
: ]# R/ R( R0 X  g    as
; L& c( G# \4 a2 ~4 @    select a.empno,a.ename,a.sal,b.dname- M3 D6 T; v: `  y  b2 N/ X- h8 ?
    from emp a inner join dept b
; C# F; q2 K% o) Q& \0 w9 d; F    on a.deptno = b.deptno9 ^1 X1 i' L  ~
    select * from myview
回复

使用道具 举报

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

Oracle技术:Oracle触发器

update  myview set sal = 1000,dname='aaaaa' where empno = 74991 A% k- K& R- L: y8 b2 c4 `0 L
    --替代触发器  用在视图上面 只能是行级的
2 o  a# ]9 X% o    --替代触发器 特点是 真正的操作已经 变成了一个动作而已 功能由触发器来完成
9 H+ H- {, m1 @. O! [9 V    create or replace trigger tri_myview
% k0 ?3 L2 Y3 E3 k' T7 x" d    instead of update$ W1 [; u* C+ t
    on myview
- Y0 z+ G+ o4 |) A7 F9 B    begin
4 A7 k% O3 Y/ ^$ V7 r    dbms_output.put_line('删除操作执行了。。。');- t* J8 L. ~% i
    update emp set sal = :NEW.sal where empno = :OLD.empno;
! x2 _1 e% I8 |) p6 B+ h) c: X" G6 r    update dept set dname = :NEW.dname where dname = :OLD.dname;
4 G; p. ?, |+ j) p    --delete from emp where empno = :OLD.empno;! s" H* u5 Z  P( H3 E
    end;
! z# u- E- o9 M; Z0 P8 P    select * from emp;
7 k- ^* {# \2 }0 |/ R    select * from dept;
7 A0 X% |8 m# ^- v7 Y! f1 U    update emp_bak set ename ='aaaa',sal = 10000 where empno in (7788)8 C/ V4 o7 J! X3 o; _& }
    --系统包
! }, y: p* x7 A. S3 V; d    -- 产生随机数
( m) W9 S4 A" q    **** **** **** ****: I6 ?, q# B4 o* u: t% p
    --dbms_random.value 0-1 之间的随机小数/ r& P, z6 {6 W; O
    --dbms_random.random  随机整数
! N! X* N9 Q# k. P! q% ^    select dbms_random.value from dual;
! e' Y9 v( v* v/ F: \    create or replace procedure proc_cardno(mycardno out varchar2)7 q6 v; M/ s& u) H5 U
    as
) I  {. p$ b2 }. G4 @0 h. \    tempcard varchar2(50);# e( S! l* T: O& U4 C* M
    cardno varchar2(19);0 M5 q6 M: t0 n
    begin
! S" ?( ^+ X  w* G$ F0 Z    tempcard:= dbms_random.value;# v* m& Z0 I/ A, \( x3 K& X
    cardno:=substr(tempcard,2,4)||' '||substr(tempcard,6,4)||' '||substr(tempcard,10,4)||' '||substr(tempcard,14,4);
9 w8 ~9 i0 q$ i5 y" X    mycardno:=cardno;
) A" T$ x# g5 f* y6 v    --   dbms_output.put_line(tempcard);
9 S, z; q4 n+ ]/ E    -- dbms_output.put_line(cardno);
  P' ^2 Q5 \  J+ ~    end;5 b$ M1 r+ g% i7 E8 u) ~
    --使用UTL_FILE包读写文件; w- n& a0 r" A5 u
    create directory MY_DIR as 'd:\temp';
* [2 K1 p; ?$ [9 b' w: G/ R    create directory MY_DIR2 as 'd:\temp2';
4 g) \: b; e; x* l    declare
回复 支持 反对

使用道具 举报

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

Oracle技术:Oracle触发器

--定义文件对象% t1 {" f+ m/ V3 X; G6 X  P3 P7 x: t, ~3 u
    myfile utl_file.file_type;9 d* I. d" |) n/ {! _* t3 ]; u
    --定义变量 用来存储每读出一行的数据( |. u6 }# I/ {" T9 y; S  e
    linestr varchar2(200);& }8 B+ n3 \6 C6 U) F) G
    begin' W  R' b/ U9 q' n" b
    --打开文件. A% S" w# z' Y
    myfile:= utl_file.fopen('MY_DIR','oracle.log','r');
* J4 b: Y) I+ ~. a% |    --进行读取(循环)3 ?# L; d& |/ h# V
    loop0 g" }2 H, E* C( s, T* \, U; I
    utl_file.get_line(myfile,linestr);! l) e9 V8 Z( |4 U# @! q
    dbms_output.put_line(linestr);
# p, Y2 p! Z  ~  V0 F    end loop;
# j  V" n# m6 R8 r; |3 {    exception' X5 z# R" s: O* J/ H: z4 z
    when others  then! {. @7 A; J. ^
    utl_file.fclose(myfile);
* ^+ ~8 W& R4 {    dbms_output.put_line('读取完毕!');
: Z8 r2 H( ?4 _& z8 Q( X    end;; F+ D8 p# E, h
    declare
' z/ Y) Z" u. _0 `- T    --定义文件对象
, L- ^, Y8 @& w8 c2 }    myfile utl_file.file_type;' z/ v2 v. E$ j
    --定义变量 用来存储每读出一行的数据% l) I9 f4 c! v1 T! b, G
    linestr varchar2(200);: [: m# K$ x5 b9 O) [
    begin
, B7 Z1 l- }; B    --打开文件
! X2 w4 p8 t/ M7 `7 I% J0 C    myfile:= utl_file.fopen('MY_DIR','oracle.log','a');8 l& q) v1 k$ v! p7 c
    --追加数据
: H6 q7 a1 a- F8 T/ A    --utl_file.get_line(myfile,linestr);
' B3 S2 _: o) w    utl_file.put_line(myfile,'你好,这是新的数据',true);
/ h3 s: L8 _0 g- j3 k    utl_file.fclose(myfile);
+ r: ~/ t* f& ?) p$ T2 @+ y    exception3 V! Y+ j% _: m0 l1 c
    when others  then8 y  i. f/ \% A
    utl_file.fclose(myfile);9 c! w3 T3 |9 X0 [# @
    dbms_output.put_line('读取完毕!');
$ L2 j$ `* C" O2 B    end;
- \& ?7 F9 }  ^0 [    --拷贝% q1 h6 y# X3 i1 d
    declare! b2 A3 n; Z/ }2 M
    --定义文件对象) @0 _( V, B. Q
    sourcefile utl_file.file_type;
$ w- O" h3 g) \1 m    targetfile utl_file.file_type;
) w4 i. U- V' V& x( v- ?    --定义变量 用来存储每读出一行的数据- g0 `, a& }2 J' o+ U
    linestr varchar2(200);3 v% N) ?$ s1 g4 A: L! w8 U, |1 I: ]
    begin# p! v9 K( A; I  B+ I) D
    --打开文件* a8 k3 x# z  b4 p
    sourcefile:= utl_file.fopen('MY_DIR','oracle.log','r');. T0 }; f3 t" ~7 f: v
    targetfile:= utl_file.fopen('MY_DIR2','copy.txt','a');+ c, F4 Q: ^. N& Z6 M  [
    --进行读取(循环) 并且写入到新的文件里面
! t6 q; t" u. X' v- y6 m    loop" t/ ]2 ^! x) I) X1 M$ K8 |0 k, j
    utl_file.get_line(sourcefile,linestr);* |' n8 D/ S. q3 p
    utl_file.put_line(targetfile,linestr,true);
: j! n) b( V9 |& a6 k2 V( C    -- dbms_output.put_line(linestr);* [6 h) e. F9 v, [
    end loop;5 L2 S  m0 J. Y  E
    exception5 q8 R  P( Q6 C8 w$ B5 q1 W
    when others  then
3 p! o3 P( B- R& u* X2 T0 w. s* }    utl_file.fclose(sourcefile);2 m( `) s6 Z+ a3 ?! C9 u5 r
    utl_file.fclose(targetfile);/ h0 [( n6 W6 q3 `+ v9 U4 L
    dbms_output.put_line('拷贝完毕!');
# ^! d# R4 |) L3 n9 W    end;
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 16:24 , Processed in 0.451968 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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