在论坛里曾经看过一个帖子,有位用户问了这么一个问题:oracle 里一个表插入一条数据,提交后,如何让外部程序收到这个消息? i5TBf&O!@,
当时没有留意,现在想想好像应该可以总结一下了。举例: cZ E95}RL
1、过程中: Fo92T3hp
... 6P^mx1b"
declare MM0vn|
myexcept exception; LXXIFLX
inserted_count1 number; QuCiiz:
inserted_count2 number; ]'y[x7L;
... +H/0:W2
begin ;c#]vlQD
insert into table values(...); /k*nt7g
inserted_count1 := sql%rowcount; J's$qbj
... --可以判断inserted_count1是否大于0来确定是否插入了数据 19-Zmg
commit; V"s;o
inserted_count2 := sql%rowcount; --这里inserted_count2为0 R!BzWM
... --事实上,这里一定是提交成功才会执行,否则会跳到exception段 owX0)e<O
yourprocess(yourpara);--调用你自己的过程或语句跟别的过程通信 l^mN\L?X
... Hh$y3
exception OX>^vh(
when others then ---你可以根据sqlcode自己去查具体的提交失败原因 Lks!iDvB?
... f&t\ xu(
yourprocess_for_fail(yourpara) --调用你自己的过程跟别的过程通信 =;u)Gt:Du
... |gs)5w
end; |,fmxA
H1(kWU
2、直接外部操作,建触发器: DXlRDDrt
create or replace trigger table after insert for each row ^p-Z CuCRM
... [h7;ItY
begin tER/ (W#
... R|M,jF
yourprocess(yourprara); z|;qX1Rz
... He$N8d?
end; $@v>
T3T=p
当然,2的方法这只能更总到提交前,如果要监视提交后状态,你可以在操作表建立标志位或专门建个表,操作表发生变化就通过trigger更新变化信息到状态表,扫描状态表就知道是否commit;成功了 wX/ '_yE
T6%K {U2
Jsvq7Leap
hY_mD
我想这位用户应该通过trigger来调用java source来实现插入数据后来通知外部程序来做一些事情: 9ZCna0:"UU
\ 8cC ~`
使用java source的例子如下: Mm0hVR
Ds,Um4ix
SQL> create or replace and compile java source named HelloWorld H#$Q,9C
2 as 71N7]>XVo
3 public class HelloWorld { Exe3E="<
4 public static void db_run (){ CY1::|4;2
5 System.out.println("Hello World"); [6AbGG>*
6 } !%5;u0Y
7 } .3{qmj&YI
8 / y>7"G^QJ
wc%ED!dnL
Java created. O]~>aiG6
[M83#K1T
,+!qcq/n^
SQL> create or replace procedure run_helloworld a%r:K}'
2 as language java uk!W"
3 name 'HelloWorld.db_run()'; tC9H9]
4 / c $L@N
QD /X j ]
Procedure created. 401`KaNl
SQL> set serveroutput on size 5000 Bg_]YkP+
SQL> call dbms_java.set_output(5000) ; '996-y
6"'c<7g*_3
Call completed. $'8\p2*c:
*@&;`5I
SQL> tnyCb=x}cv
SQL> exec run_helloworld ; %qyN}WeZe
Hello World DC~"K4 FX
e @coNDV<6
PL/SQL procedure successfully completed.