我试图使用' LogMiner'以同步DB的方式。
当包含单引号字符('
)的长clob无法转义到''
时,我遇到了问题,我试图尝试找到一种方法来告诉LogMiner'当它从桌子上出来时逃脱它。
例如:
我有一个名为TEXT_FILES的表,其名称为VARCHAR2
,文件为CLOB
,CLOB
是从文本文件加载的。该文件包含如下行:
This won't work!!!
当它是一个短文件时,LogMiner会给我这些命令:
insert into "TESTDB"."TEXT_FILES" ("NAME","FILE") values ('test1.txt',EMPTY_CLOB());
update "TESTDB"."TEXT_FILES" set "FILE"='This won''t work!!!' where "NAME"='test1.txt'
commit;
请注意,单引号转义并出现两次,这可以完美运行。
但是当文件很长(我猜多于1k字节)并且包含这一行时,LogMiner会生成一种程序,如下所示:
insert into "TESTDB"."TEXT_FILES" ("NAME","FILE") values ('test2.txt',EMPTY_CLOB());
DECLARE
loc_c CLOB;
buf_c VARCHAR(6222)
...
BEGIN
select "FILE" into loc_c from "TESTDB"."TEXT_FILES" where "NAME" = 'test2.txt' for update;
buf_c := 'This won't work!!!This won't work!!! ........'; --(line continues)
dbms_lob.write(loc_c, 1024, 1, buf_c);
END;
buf_c := '.... '; --file go on..
dbms_lob.write(loc_c, 1024, 1025, buf_c);
END;
buf_c := '.... '; --till end of file..
dbms_lob.write(loc_c, 500, 2049, buf_c);
END;
(我不知道为什么在每次写作后都会放END;
,但这是另一个问题的主题...)
重点是单引号未自动转义,脚本将无法运行。
我正在寻找一个适用于任何文件的解决方案,(甚至包含SQL查询的文件,甚至包含上述过程文本的文件,因此我不能只查找{{1} })它应该自动工作。
所以我想知道是否有人遇到这个问题,如果有人能够解决它。
修改
我正在使用' LogMiner'使用这些命令:
对于来自V $ ARCHIVED_LOG的每个文件,时间较新,然后是上次同步:buf_c :=
然后我打电话给:
DBMS_LOGMNR.ADD_LOGFILE
然后:DBMS_LOGMNR.START_LOGMNR(OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.NO_ROWID_IN_STMT);
但它是一个长脚本,最后将每个更改提取到一个文件,并按时间顺序编号。