扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Yuli Vasiliev 来源:Oracle技术网 2007年10月21日
关键字:
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 FOR rec IN (SELECT DISTINCT(o.order_id) o_id FROM TABLE(CAST(ntfnds.table_desc_array(i).row_desc_array AS rdesc_tab)) t, orders o, order_items d WHERE t.row_id = d.rowid AND d.order_id=o.order_id) LOOP sendNotification(url, tblname, rec.o_id); END LOOP; END IF;重新创建 orders_nf_callback 后,您需要测试它能否正常工作。为此,您可以针对 ORDER_ITEMS 表执行下列 UPDATE 语句并提交该事务:
UPDATE ORDER_ITEMS SET quantity = 160 WHERE order_id=2421 AND line_item_id=1; UPDATE ORDER_ITEMS SET quantity = 160 WHERE order_id=2421 AND line_item_id=2; COMMIT;然后,检查 nfresults 表,如下所示:
SELECT TO_CHAR(operdate, 'dd-mon-yy hh:mi:ss') operdate, rslt_msg FROM nfresults WHERE tblname = 'OE.ORDER_ITEMS';输出可能如下所示:
OPERDATE RSLT_MSG ------------------- -------------- 03-mar-06 12:32:27 Not Found您可能很奇怪为什么只向 nfresults 表中插入了一行 – 毕竟您更新了 ORDER_ITEMS 表中的两行。实际上,这两个更新了的行具有相同的 order_id – 即它们属于同一订单。此处,我们假设客户端应用程序将使用一个语句选择订单的所有订单项,因此它并不需要确切知道已经更改了某个订单的哪些订单项。相反,客户端需要知道其中至少修改、删除或插入了一个订单项的订单 ID。
濠电姷顣介埀顒€鍟块埀顒€缍婇幃妯诲緞閹邦剛鐣洪梺闈浥堥弲婊勬叏濠婂牊鍋ㄦい鏍ㄧ〒閹藉啴鏌熼悜鈺傛珚鐎规洘宀稿畷鍫曞煛閸屾粍娈搁梻浣筋嚃閸ㄤ即宕㈤弽顐ュС闁挎稑瀚崰鍡樸亜閵堝懎濮┑鈽嗗亝濠㈡ê螞濡ゅ懏鍋傛繛鍡樻尭鐎氬鏌嶈閸撶喎顕i渚婄矗濞撴埃鍋撻柣娑欐崌閺屾稑鈹戦崨顕呮▊缂備焦顨呴惌鍌炵嵁鎼淬劌鐒垫い鎺戝鐎氬銇勯弽銊ф噥缂佽妫濋弻鐔碱敇瑜嶉悘鑼磼鏉堛劎绠為柡灞芥喘閺佹劙宕熼鐘虫緰闂佽崵濮抽梽宥夊垂閽樺)锝夊礋椤栨稑娈滈梺纭呮硾椤洟鍩€椤掆偓閿曪妇妲愰弮鍫濈闁绘劕寮Δ鍛厸闁割偒鍋勯悘锕傛煕鐎n偆澧紒鍌涘笧閹瑰嫰鎼圭憴鍕靛晥闂備礁鎼€氱兘宕归柆宥呯;鐎广儱顦伴崕宥夋煕閺囥劌澧ù鐘趁湁闁挎繂妫楅埢鏇㈡煃瑜滈崜姘跺蓟閵娧勵偨闁绘劕顕埢鏇㈡倵閿濆倹娅囨い蹇涗憾閺屾洟宕遍鐔奉伓