將表添加到現有註冊
前一部分介紹了如何使用更改通知服務使
資料庫在註冊
對象(在以上樣本中為 ORDERS
表)發生更改時發出通知。但從效能角度而言,用戶端應用程式可能更希望緩衝 ORDER_ITEMS 表而非 ORDERS
表本身的查詢結果集,這是因為它在每次訪問訂單時,不得不從 ORDERS 表中只檢索一行,但同時必須從 ORDER_ITEMS
表中檢索多個行。在實際情況中,訂單可能包含數十個甚至數百個訂單項。
由於您已經對 ORDERS 表註冊了查詢,因此不必再建立一個註冊來註冊對
ORDER_ITEMS 表的查詢了。相反,您可以使用現有註冊。為此,您首先需要檢索現有註冊的 ID。可以執行以下查詢來完成此
工作:
SELECT regid, table_name FROM user_change_notification_regs;
結果可能如下所示:
REGID TABLE_NAME
----- --------------
241 OE.ORDERS
擷取註冊 ID 後,可以使用 DBMS_CHANGE_NOTIFICATION.ENABLE_REG
函數將一個新對象添加到該註冊,如下所示:
DECLARE
ord_id NUMBER;
BEGIN
DBMS_CHANGE_NOTIFICATION.ENABLE_REG(241);
SELECT order_id INTO ord_id FROM order_items WHERE ROWNUM < 2;
DBMS_CHANGE_NOTIFICATION.REG_END;
END;
/
完成了!從現在開始,資料庫將產生一個通知來響應對 ORDERS 和 ORDER_ITEMS 所做的任何更改,並調用
orders_nf_callback 過程來處理通知。因此,下一步就是編輯 orders_nf_callback,以便它可以處理因對 ORDER_ITEMS
表執行 DML 操作而產生的通知。但在重新建立 orders_nf_callback 過程之前,您需要建立以下將在更新過程中引用的表類型:
CREATE TYPE rdesc_tab AS TABLE OF SYS.CHNF$_RDESC;
然後,返回清單
2,在以下程式碼之後:
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;
插入以下代碼:
IF (tblname = 'OE.ORDER_ITEMS') THEN
http://www.bkjia.com/PHPjc/631000.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/631000.htmlTechArticle將表添加到現有註冊 前一部分介紹了如何使用更改通知服務使 資料庫 在註冊 對象 (在以上樣本中為 ORDERS 表)發生更改時發出通知。但從...