在Oracle DB中:有没有办法让LogMiner转义某些字符?

时间:2015-06-10 15:38:47

标签: oracle

我试图使用' LogMiner'以同步DB的方式。

当包含单引号字符(')的长clob无法转义到''时,我遇到了问题,我试图尝试找到一种方法来告诉LogMiner'当它从桌子上出来时逃脱它。

例如: 我有一个名为TEXT_FILES的表,其名称为VARCHAR2,文件为CLOBCLOB是从文本文件加载的。该文件包含如下行:

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); 但它是一个长脚本,最后将每个更改提取到一个文件,并按时间顺序编号。

0 个答案:

没有答案