首页 > 解决方案 > 使用 XMLSERIALIZE 的用户定义函数

问题描述

我正在为 Oracle 数据库在 pl/sql 中编写用户定义的函数。该函数的目的是将 xml 字段转换为 clob。这是代码:

CREATE OR REPLACE FUNCTION IDS_ORA.castField_xml_to_clob (xmlField IN XMLTYPE)
  RETURN CLOB
AS
BEGIN
  RETURN XMLSERIALIZE(CONTENT xmlField AS CLOB NO INDENT)
END;
/

编译失败并出现以下错误:

PLS-00103:在预期以下情况之一时遇到符号“XMLFIELD”:。( ) , * @ % & = - + < / > at 是 mod 余数 not rem => <> o != o ~= >= <= <> and or like2
like4 likec as between from using || 多集成员子多集函数:IDS_ORA.CASTFIELD_XML_TO_NVARCHAR(IDS_ORA@172.25.1.134:1522:sviluppo) 5 31

这对我来说似乎是一个通用错误,所以我尝试XMLSERIALIZE直接在查询中使用它并且它有效。

SELECT XMLSERIALIZE(CONTENT "AttributesValue" AS CLOB no INDENT)
FROM IDS_ORA."Job";

这意味着语法是正确的,它在抱怨什么?

标签: sqlxmloracleplsqluser-defined-functions

解决方案


XMLSerialize 不是本机 PL/SQL 函数。很多 SQL 函数可以在 PL/SQL 中直接调用,例如to_date(); 不幸的是,这不是其中之一。(事实上​​,我不认为任何与 XML 相关的函数都可以)。

在 PL/SQL 表达式中,您可以使用所有 SQL 函数,除了:
...

  • XML 函数(例如APPENDCHILDXMLEXISTSNODE

不能使用直接赋值,所以需要使用查询:

CREATE OR REPLACE FUNCTION castField_xml_to_clob (xmlField IN XMLTYPE)
  RETURN CLOB
AS
  result CLOB;
BEGIN
  SELECT XMLSERIALIZE(CONTENT xmlField AS CLOB NO INDENT)
  INTO result
  FROM dual;

  RETURN result;
END;
/

Function CASTFIELD_XML_TO_CLOB compiled

这增加了另一个上下文切换,所以除非你试图有一个共同的地方来控制所有格式化的 XML 的缩进选项,以便你可以在一个地方全部更改它们,我不确定这是否比直接调用 XMLSerialize 在任何地方都有什么好处您将调用此 UDF。


推荐阅读