oracle內部提供的在數據庫內部和應用程序間通信的方式有以下幾種:
1.警報,就是DBMS_ALERT包提供的功能;
2.管道,由DBMS_PIPE提供;
3.高級隊列,這個就很復雜,當然提供的功能也是很高級的。
當然還可以使用外部過程,比如用PL/SQL封裝外部的基於C的DLL或JAVA也能實現數據庫和應用程序間的通信。 要使用這些功能,必須知道各個功能的特點,根據需要選用。 警報和事務相關的,是異步發送的;管道是與事務無關的,是同步發送的。
dbms_alert用於生成並傳遞數據庫預警信息。使用包DBMS_ALERT,則必須以SYS登陸,為該用戶授予執行權限。
sql>conn sys/oracle as sysdba
sql>grant execute on dbms_alert to scott;
1.register:用於注冊預警事件
示例如下:
sql>exec dbms_alter.register('alter1');
2.remove:用於刪除會話不需要的預警事件.
3.removeall:用於刪除當前會話所有已注冊的預警事件
語法如下:dbms_alter.removeall;
4.set_defaults
用於設置檢測預警事件的時間間隔,默認時間間隔為5秒
5.signal:用於指定預警事件所對應的預警消息.
6.waitany:用於等待當前會話的任何預警事件,並且在預警事件發生時輸出相應信息.在執行該過程之前,會隱含地發出COMMIT.
語法如下:
dbms_alter.waitany (
name out varchar2,
message out varchar2,
status out integer,
timeout in number default maxwait
);
注:status用於返回狀態值,返回0表示發生了預警事件,返回1表示超時;timeout用於設置預警事件的超時時間.
7.waitone:
用於等待當前會話的特定預警事件,並且在發生預警事件時輸出預警消息.
語法同上
警報的使用:
簡單來說,警報是在服務器端發出,然后在客戶端接收,這就需要在客戶端有一個線程來監聽警報。現在拿SQLPLUS做個例子,打開兩個SQLPLUS,分別用提示符SQL1和SQL2表示。
1、首先應先授予用戶使用DBMS_ALERT的權限。登錄到SYS用戶下,執行一下語句:
conn sys/oracle as sysdba grant execute on dbms_alert to scott;
2、發送進程(服務器端發出)
SQL1>DECLARE V_ALERTNAME VARCHAR2(30) := 'alert1'; BEGIN DBMS_ALERT.SIGNAL(V_ALERTNAME, 'hello, this is sending process!'); COMMIT; --必須COMMIT,警報才會真正被發出 END; /
3、接受進程(客戶端接收)
SQL2>set serveroutput ON; SQL2>DECLARE V_ALERTNAME VARCHAR2(30) := 'alert1'; V_STATUS NUMBER; V_MSG VARCHAR2(100); BEGIN DBMS_ALERT.REGISTER(V_ALERTNAME); --注冊要接收信息的警報器 DBMS_ALERT.WAITONE(V_ALERTNAME, V_MSG, V_STATUS); IF V_STATUS != 0 THEN DBMS_OUTPUT.PUT_LINE('error'); ELSE DBMS_OUTPUT.PUT_LINE(V_MSG); END IF; END; /
注意:接收者要接收警報必須執行等待過程,等待警報的到來,否則不會得到任何警報的。
用二種方法測試一下:
方法一:先執行步驟2,再執行步驟3。這時可以獲得警報
方法二:先執行步驟3,再執行步驟2。這時不能獲得任何警報,執行步驟3的SESSION處於等待狀態,當下一時間點再次執行步驟2時,就可以獲得警報。
警報可以是一對一,也可以是一對多的,即一個警報可以同時被多個接收者接收。