oracle系統包——dbms_alert用法

Ruthless發表於2013-06-24

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時,就可以獲得警報。
警報可以是一對一,也可以是一對多的,即一個警報可以同時被多個接收者接收。

相關文章