我需要检查数据库模式中的所有文本字段是否存在任何非法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/
对于某些想法,但我对效率和这些解决方案的灵活性表示担忧。
客户端想要处理解决方案的方式是将表配置为包含非法字符,并且它是首选替换。然后,该函数使用从此表中选择的值来预先形成替换。
答案 0 :(得分:2)
create type xmltest is object (s clob);
select XMLTYPE.createXml(xmltest('a& and ''')) from dual;
XMLTYPE.CREATEXML(XMLTEST('A&'''))
-------------------------------------------------------------------------------------
<XMLTEST>
<S>a& '</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 & bar <> bar "hemingway's"</e>