stream是 Oracle 11g 支持的数据同步技术,虽然该技术已经不是什么新技术,但目前国内采用该技术开发的软件不多见。 stream 同步软件项目参与近一年,近期软件上线实施,效果不是很理想。 同步过程中会偶尔出现 ORA-00001,ORA-26786,ORA-26787 等常见错误。 经过几天的的研究,开发了一个守护平台,采用 java 平台和存储过程相结合的方式自动处理以上错误。 我写的这些算法具有通用性,不需要手工指定删除表的列,通过实践具有较好的效果。 相对于set_update_conflict_handler这个方法,简单易用。 java 平台代码便不开源了,其实核心的思想还是在存储过程中,特分享给大家,共同进步。
自定义 type
create or replace type myvarray_list as varray(300) of varchar2(50)
CREATE OR REPLACE PROCEDURE EXECUTE_TRANSACTION_1(applyname IN VARCHAR2,ltxnid IN VARCHAR2) IS
i NUMBER;
x NUMBER;
loopdog NUMBER;
txnid VARCHAR2(30);
source VARCHAR2(128);
msgno NUMBER;
msgcnt NUMBER;
errno NUMBER;
errmsg VARCHAR2(2000);
lcr ANYDATA;
rowlcr SYS.LCR$_ROW_RECORD;
typenm VARCHAR2(61);
res NUMBER;
command VARCHAR2(10);
old_values SYS.LCR$_ROW_LIST;
new_values SYS.LCR$_ROW_LIST;
v_code NUMBER;
v_errm VARCHAR2(1024);
object_owner VARCHAR2(30);
object_name VARCHAR2(40);
key_column myvarray_list;
remove_column myvarray_list;
remove_flag NUMBER;
remove_count NUMBER;
BEGIN
SELECT LOCAL_TRANSACTION_ID,
SOURCE_DATABASE,
MESSAGE_NUMBER,
MESSAGE_COUNT,
ERROR_NUMBER,
ERROR_MESSAGE
INTO txnid, source, msgno, msgcnt, errno, errmsg
FROM DBA_APPLY_ERROR
WHERE LOCAL_TRANSACTION_ID = ltxnid;
DBMS_OUTPUT.PUT_LINE(' --- Local Transaction ID: ' || txnid);
DBMS_OUTPUT.PUT_LINE(' --- Source Database: ' || source);
DBMS_OUTPUT.PUT_LINE(' ---Error in Message: '|| msgno);
DBMS_OUTPUT.PUT_LINE(' ---Error Number: '||errno);
DBMS_OUTPUT.PUT_LINE(' ---Message Text: '||errmsg);
i := msgno;
loopdog :=0;
WHILE i