Xml CLOB在背靠背运行时提交不工作

Xml CLOB在背靠背运行时提交不工作,xml,oracle,clob,xmltype,xmltable,Xml,Oracle,Clob,Xmltype,Xmltable,我们正在运行一个旧的Oracle服务器10.1.0.5 我有一些简单的代码在不同的列中用另一个CLOB替换一个CLOB。 我正在用另一列中的另一个更简单的字符串替换特定字符串,以便执行一些基本的XML解析。参考号: 我希望执行一系列更新命令,每个命令之间都有提交,并正确更新所有字段。如果我按如下方式运行它,则只会提交最后一个查询,尽管它是作为脚本运行的。断断续续的提交似乎不起作用 通过逐行运行每个更新+提交,我可以让它工作,但我想知道为什么我不能同时运行这些。我只显示了前2个更新。我错过了什么

我们正在运行一个旧的Oracle服务器10.1.0.5

我有一些简单的代码在不同的列中用另一个CLOB替换一个CLOB。 我正在用另一列中的另一个更简单的字符串替换特定字符串,以便执行一些基本的XML解析。参考号:

我希望执行一系列更新命令,每个命令之间都有提交,并正确更新所有字段。如果我按如下方式运行它,则只会提交最后一个查询,尽管它是作为脚本运行的。断断续续的提交似乎不起作用

通过逐行运行每个更新+提交,我可以让它工作,但我想知道为什么我不能同时运行这些。我只显示了前2个更新。我错过了什么

set define off

update TABLE1 SET COL_CLEANED = replace(COL_ORIGINAL,' ',  ' ');
COMMIT;

update TABLE1 SET COL_CLEANED = replace(COL_ORIGINAL,'§',  'SECT.');
COMMIT;

update TABLE1 ...
谢谢,


sse

正如@OldProgrammer所说,您反复替换
COL\u CLEANED
值并覆盖早期的更改

假设您从一个需要多次替换的简单值开始:

create table table1 (col_original clob, col_cleaned clob);

insert into table1 (col_original)
values (to_clob('Test without breaks - §1'));
第一次更新是:

update TABLE1 SET COL_CLEANED = replace(COL_ORIGINAL,' ',  ' ');

select col_original, col_cleaned from table1;

COL_ORIGINAL                             COL_CLEANED                             
---------------------------------------- ----------------------------------------
Test without breaks - §1  Test without breaks - §1           
现在执行第二次更新:

update TABLE1 SET COL_CLEANED = replace(COL_ORIGINAL,'§',  'SECT.');

select col_original, col_cleaned from table1;

COL_ORIGINAL                             COL_CLEANED                             
---------------------------------------- ----------------------------------------
Test without breaks - §1  Test without breaks - SECT.1  
没有提交和回滚。但您采用了原始值(仍然保留了两种旧模式),并替换了其中的第二种模式。第一次更新只是被第二次更新覆盖了

您需要对清理后的值应用连续更新;只有第一次更新使用原始值:

-- first update is based on COL_ORIGINAL
update TABLE1 SET COL_CLEANED = replace(COL_ORIGINAL,' ',  ' ');

select col_original, col_cleaned from table1;

COL_ORIGINAL                             COL_CLEANED                             
---------------------------------------- ----------------------------------------
Test without breaks - §1  Test without breaks - §1           

-- subsequent updates are based on COL_CLEANED to keep earlier changes    
update TABLE1 SET COL_CLEANED = replace(COL_CLEANED,'§',  'SECT.');
--------------------------------------------^^^^^^^

select col_original, col_cleaned from table1;

COL_ORIGINAL                             COL_CLEANED                             
---------------------------------------- ----------------------------------------
Test without breaks - §1  Test without breaks - SECT.1            
顺便说一句,实际上并不需要提交;每个逻辑事务应该提交一次,而不是每个语句提交一次


顺便说一句,您可以使用它,但在您的示例中,它将为您提供一个多字节的“section”字符,而不是字符串
“SECT”。

update TABLE1 SET COL_CLEANED = UTL_I18N.UNESCAPE_REFERENCE(COL_ORIGINAL);

select col_original, col_cleaned from table1;

COL_ORIGINAL                             COL_CLEANED                             
---------------------------------------- ----------------------------------------
Test without breaks - §1  Test without breaks - §1                

它可能会做出与其他硬编码替换不同的其他更改。另一方面,在某个点上,您的
col_original
可能通过一个类似的函数来引用当前存储的值;因为真正的原始文本会有
§
,因此会转义到
§,可能更适合将其恢复为原始字符。除非您的字符集无法显示,否则可能。

您正在更新同一字段,列被清除两次,第二个字符集将覆盖第一个字符集。除非您有错误,否则我怀疑是否发生了回滚。您当然是对的,谢谢!完全正确感谢您提供有关UNESCAPE_参考的其他辅助信息。关于Char部分,你是对的。我们遇到的问题是数据库很旧,使用USACII7编码,具有字节语义。在我们迁移到现代角色集之前,恢复它不是一个选项。再次感谢!