代码之家  ›  专栏  ›  技术社区  ›  Marco Luzzara

具有XMLSERIALIZE的用户定义函数

  •  0
  • Marco Luzzara  · 技术社区  · 6 年前

    我正在用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:在要求 以下内容:。(,*@%&=-+</>在in处是mod remainst not rem=>>o!=o~=>=<=<>或类似2
    like4 likec从使用| | multiset成员submultiset 函数: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 回复  |  直到 6 年前
        1
  •  1
  •   Alex Poole    6 年前

    XMLSerialize不是本机PL/SQL函数。 Many SQL functions can be called directly in PL/SQL ,例如 to_date() 不幸的是,这不是其中之一。(事实上,我不认为任何与XML相关的函数都可以)。

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

    • XML函数(例如 APPENDCHILDXML EXISTSNODE )

    不能使用直接赋值,因此需要使用查询:

    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)有任何好处。