sql - 使用 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";
这意味着语法是正确的,它在抱怨什么?
解决方案
XMLSerialize 不是本机 PL/SQL 函数。很多 SQL 函数可以在 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。
推荐阅读
- java - java.lang.IllegalArgumentException:插件已经初始化
- macos - 除了 AppleScript 之外,还有其他方法可以在 macOS 中获取前景窗口标题吗
- lua - 脚本不工作,声音不播放,砖不变色
- java - java中.toObject()方法的工作原理是什么?如何使用它将documentsnapshot转换为POJO对象?解释
- angular - 如何在 Github 上的服务器上部署 Angular 7 应用程序?
- javascript - 在 VueJS 中的数据库中发送图像
- testing - 在页面模型中将参数传递给 TestCafe 选择器
- java - 在全屏启动器应用程序来自后台后,Android NFC 读取失败
- python - 将文件从一个文件夹复制到另一个在 .txt 文件中具有匹配名称的文件夹
- intellij-idea - 是否可以防止 Intellij 自动导入整个类包?