Oracle SQL中是否有内置的HTF.ESCAPE_SC的反函数?

3

有一个名为HTF.ESCAPE_SC的PL/SQL函数,可以转义特殊字符,例如将&转义为&

示例:

SELECT HTF.ESCAPE_SC('<parameter name="port">48677</parameter>')
FROM dual;

&lt;parameter name=&quot;port&quot;&gt;48677&lt;/parameter&gt;

有人知道它的反函数吗?当然,我可以运行
SELECT REPLACE(REPLACE(REPLACE(REPLACE(
    '&lt;parameter name=&quot;port&quot;&gt;48677&lt;/parameter&gt;', 
 '&lt;', '<'), '&gt;', '>'), '&quot;','"'), '&amp;','&')
FROM dual;

但我想知道是否有内置函数可用。

3个回答

2
我找到了这个函数:DBMS_XMLGEN.CONVERT,它可以进行编码和解码操作。
SELECT DBMS_XMLGEN.CONVERT('Please encode &lt;this&gt; tag', 1) FROM dual;

Please encode <this> tag



SELECT DBMS_XMLGEN.CONVERT('Please decode <this> tag', 0) FROM dual;

Please decode &lt;this&gt; tag

不,它并没有。在Oracle 12c中,SELECT dbms_xmlgen.convert('Please encode &lt;this&gt; tag') FROM dual会输出Please encode &amp;lt;this&amp;gt; tag - cartbeforehorse
啊,好的,没问题 :-) - cartbeforehorse

1
我找到了这个:

SELECT utl_i18n.unescape_reference ('&lt;parameter name=&quot;port&quot;&gt;48677&lt;/parameter&gt;')
FROM   dual

输出结果为:

<parameter name="port">48677</parameter>

1
这取决于您的要求。HTF.ESCAPE_SC 仅转义 & " < >。然而,utl_i18n.unescape_reference 转义更多的字符串(请参阅文档)。因此它不是 HTF.ESCAPE_SC反函数 - Wernfried Domscheit

1
我认为没有内置函数可以做到这一点。您可以编写一个小函数来防止对 replace() 的无法阅读的调用堆栈。
create or replace function unescape_sc(p_str in varchar2)
return varchar2
is
  l_str varchar2(2000) := p_str; -- adjust size as required
begin
  l_str := replace(l_str, '&amp;', '&');
  l_str := replace(l_str, '&gt;', '>');
  l_str := replace(l_str, '&lt;', '<');
  l_str := replace(l_str, '&quot;', '"');
  return l_str;
end unescape_sc;

select unescape_sc('&lt;parameter name=&quot;port&quot;&gt;48677&lt;/parameter&gt;')
from dual;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接