【问题标题】:User defined function with XMLSERIALIZE使用 XMLSERIALIZE 的用户定义函数
【发布时间】:2019-01-08 16:55:35
【问题描述】:

我正在 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” 下列的: 。 ( ) , * @ % & = - + at in is mod 余数 not rem => o != o ~= >= and or like 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";

这表示语法是正确的,它在抱怨什么?

【问题讨论】:

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


    【解决方案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 的缩进选项,这样你就可以在一个地方全部更改它们,我不确定这比仅仅调用有什么好处XMLSerialize 直接在您要调用此 UDF 的任何位置。

    【讨论】:

    • 非常感谢。我不得不创建这个函数来专门化一个 linq 查询(我在 SQL Server 中创建了这个函数的相同版本),所以情况实际上更复杂。我决定使用XMLSERIALIZE,因为我必须从 xml 中删除缩进和换行。我看到我可以使用getclobval(),但我只能删除缩进,并最终替换换行符。你知道其他方法可以做我想做的事吗?
    • @MarcoLuzzara - 我认为使用 XMLSerialize 很好,我只是在质疑你为什么将它包装在你自己的函数中。也许Linq不理解那个功能?你也可以做xmlquery('/*' passing xmlField returning content).getclobval(),这应该去掉两者,但使用 XMLSerialize 可能更明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多