Oracle系統包——dbms_alert用法
2024-08-29 13:54:33
供稿:網友
Oracle內部提供的在數據庫內部和應用程序間通信的方式有以下幾種:1.警報,就是DBMS_ALERT包提供的功能;2.管道,由DBMS_PipE提供;3.高級隊列,這個就很復雜,當然提供的功能也是很高級的。當然還可以使用外部過程,比如用PL/SQL封裝外部的基于C的DLL或java也能實現數據庫和應用程序間的通信。 要使用這些功能,必須知道各個功能的特點,根據需要選用。 警報和事務相關的,是異步發送的;管道是與事務無關的,是同步發送的。dbms_alert用于生成并傳遞數據庫預警信息。使用包DBMS_ALERT,則必須以SYS登陸,為該用戶授予執行權限。sql>conn sys/oracle as sysdbasql>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 sysdbagrant 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時,就可以獲得警報。警報可以是一對一,也可以是一對多的,即一個警報可以同時被多個接收者接收。