用户定义的带有XMLSERIALIZE的函数

时间:2018-08-01 07:40:24

标签: sql xml oracle plsql user-defined-functions

我正在用pl / sql为Oracle数据库编写一个用户定义的函数。该功能的目的是将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”   以下:。 (),* @%&=-+ / / in in是mod余数   rem => <> o!= o〜=> = <= <>或类似like2
  使用||之间的like4 likec多集成员子多集   函数: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";

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

1 个答案:

答案 0 :(得分:1)

XMLSerialize不是本机PL / SQL函数。 Many SQL functions can be called directly in 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的缩进选项,以便可以在一处更改它们,否则我不确定这是否会因调用而获得任何好处无论您要在哪里调用此UDF,都可以直接使用XMLSerialize。