使用表Oracle PL \ SQL中的值替换非法XML字符

时间:2011-06-06 11:26:52

标签: oracle plsql

我需要检查数据库模式中的所有文本字段是否存在任何非法XML字符,并用一组预定义的可接受值替换它们。这是构成数据转换规则的一部分,而不是从其他函数调用。所以这个函数可以被要求在我们的数据集上调用超过十亿次,所以我需要它才能真正有效地运行。

即。 &安培; = AND, '= APOS

该功能需要实现的一个例子应该是:

Update sometable set somefield = functioncall('f&re'd');

应该导致 某个字段的值为'fANDreAPOSd'

这是由通用类型的PL / SQL函数执行的,该函数接受文本字段的输入并遍历该字段并替换所有非法值。

我看过http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:2612348048

http://decipherinfosys.wordpress.com/2007/11/27/removing-un-wanted-text-from-strings-in-oracle/

对于某些想法,但我对效率和这些解决方案的灵活性表示担忧。

客户端想要处理解决方案的方式是将表配置为包含非法字符,并且它是首选替换。然后,该函数使用从此表中选择的值来预先形成替换。

2 个答案:

答案 0 :(得分:2)

好吧,不完全是你想要的,但请考虑一下:

create type xmltest is object (s clob);

select XMLTYPE.createXml(xmltest('a& and ''')) from dual;

XMLTYPE.CREATEXML(XMLTEST('A&'''))
-------------------------------------------------------------------------------------
<XMLTEST>
  <S>a&amp; &apos;</S>
</XMLTEST>

但是list of predefined of XML entities非常小,所以用replace替换它们不会有问题

答案 1 :(得分:0)

如果这是因为XML我会支持hal9000 - 你应该让Oracle为你做这件事。例如。 XML functions自动执行此操作:

SQLPLUS> set define off
SQLPLUS> select xmlelement("e", 'foo & bar <> bar "hemingway''s"') from dual;

XMLELEMENT("E",'FOO&BAR<>BAR"HEMINGWAY''S"')
--------------------------------------------------------------------------------
<e>foo &amp; bar &lt;&gt; bar &quot;hemingway&apos;s&quot;</e>