將表添加到現有注冊
前一部分介紹了如何使用更改通知服務使數據庫在注冊對象(在以上示例中為 ORDERS
表)發生更改時發出通知。但從性能角度而言,客戶端應用程序可能更希望緩存 ORDER_ITEMS 表而非 ORDERS
表本身的查詢結果集,這是因為它在每次訪問訂單時,不得不從 ORDERS 表中只檢索一行,但同時必須從 ORDER_ITEMS
表中檢索多個行。在實際情況中,訂單可能包含數十個甚至數百個訂單項。
由於您已經對 ORDERS 表注冊了查詢,因此不必再創建一個注冊來注冊對
ORDER_ITEMS 表的查詢了。相反,您可以使用現有注冊。為此,您首先需要檢索現有注冊的 ID。可以執行以下查詢來完成此工作:
SELECT regid, table_name FROM user_change_notification_regs;結果可能如下所示:
REGID TABLE_NAME獲取注冊 ID 後,可以使用 DBMS_CHANGE_NOTIFICATION.ENABLE_REG
----- --------------
241 OE.ORDERS
DECLARE完成了!從現在開始,數據庫將生成一個通知來響應對 ORDERS 和 ORDER_ITEMS 所做的任何更改,並調用
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;
/
CREATE TYPE rdesc_tab AS TABLE OF SYS.CHNF$_RDESC;然後,返回清單
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