建立通知處理常式
現在,您可以建立一個通知處理常式,它將藉助於上面介紹的 sendNotification
過程向用戶端發送更改通知。來看一看“清單 2”中的 PL/SQL 過程 orders_nf_callback。
清單 2.
處理對 OE.ORDERS 表所做更改的通知的通知處理常式
CREATE OR REPLACE PROCEDURE orders_nf_callback (ntfnds IN SYS.CHNF$_DESC) IS
tblname VARCHAR2(60);
numtables NUMBER;
event_type NUMBER;
row_id VARCHAR2(20);
numrows NUMBER;
ord_id VARCHAR2(12);
url VARCHAR2(256) := 'http://webserverhost/phpcache/dropResults.php?order_no=';
BEGIN
event_type := ntfnds.event_type;
numtables := ntfnds.numtables;
IF (event_type = DBMS_CHANGE_NOTIFICATION.EVENT_OBJCHANGE) THEN
FOR i IN 1..numtables LOOP
tblname := ntfnds.table_desc_array(i).table_name;
IF (bitand(ntfnds.table_desc_array(i).opflags,
DBMS_CHANGE_NOTIFICATION.ALL_ROWS) = 0) THEN
numrows := ntfnds.table_desc_array(i).numrows;
ELSE
numrows :=0;
END IF;
IF (tblname = 'OE.ORDERS') THEN
FOR j IN 1..numrows LOOP
row_id := ntfnds.table_desc_array(i).row_desc_array(j).row_id;
SELECT order_id INTO ord_id FROM orders WHERE rowid = row_id;
sendNotification(url, tblname, ord_id);
END LOOP;
END IF;
END LOOP;
END IF;
COMMIT;
END;
/
如“清單 2”所示,此通知處理常式將 SYS.CHNF$_DESC
對象用作參數,然後使用它的屬性擷取該更改的詳細資料。在該樣本中,此通知處理常式將只處理
資料庫為響應對註冊對象進行的 DML 或 DDL
更改(也就是說,僅當通知類型為 EVENT_OBJCHANGE
時)而發布的通知,並忽略有關其他資料庫事件(如執行個體啟動或執行個體關閉)的通知。從以上版本開始,處理常式可以處理針對 OE.ORDERS
表中每個受影響的行發出的更改通知。在本文後面的“將表添加到現有註冊”部分中,您將向處理常式中添加幾行代碼,以便它可以處理針對 OE.ORDER_ITEMS
表中被修改的行發出的通知。