我有一个简单的查询:
WITH xtbl AS (
SELECT XMLTYPE ('<a><b>1</b></a>') AS xcol
FROM DUAL
)
SELECT XMLQUERY ('copy $tmp := .
modify
insert node <c>2</c>
into $tmp/a/b
return $tmp'
PASSING xcol
RETURNING CONTENT) AS newxcol
FROM xtbl;
我尝试做的是在<c>
之后在节点<b>
中插入节点<a>
,但Oracle 12c会抛出此错误:
ORA-19114: XPST0003 - error during parsing the XQuery expression:
LPX-00801: XQuery syntax error at 'EOF'
5 -
- ^
我希望输出为:
NEWXCOL
-------------
<a>
<b>1</b>
<c>2</c/>
</a>
我已尝试查找Oracle Docs替换appendChildXML
并按照该示例进行操作,但只收到错误。
我知道这是非常基本的,我错过了一些明显的东西。请帮忙。
答案 0 :(得分:4)
以下代码应适用于11和12(不建议使用):
SELECT insertXMLafter(XMLType('<a><b>1</b><c>3</c></a>'),
'/a/b', XmlType('<c>2</c>'))
FROM dual;
使用新XMLQuery语法的相同代码:
SELECT XMLQuery('copy $tmp := . modify insert node
<c>2</c>
after $tmp/a/b
return $tmp'
PASSING XmlType('<a><b>1</b><c>3</c></a>') RETURNING CONTENT)
FROM dual;
有关XMLQuery以及旧的已弃用函数的更多详细信息,请访问: http://docs.oracle.com/database/121/ADXDB/app_depr_upd.htm#ADXDB6160
答案 1 :(得分:2)
只使用一个在旧版本和当前数据库版本上正常工作的SQL查询的一种丑陋但可能的方法是在SQL中使用CASE方法:
WITH tbl AS
(SELECT SUBSTR(MAX(version),1,2) as ver, XMLType('<a><b>1</b><c>3</c></a>') as xcol
FROM v$instance)
SELECT
CASE WHEN ver < '12' THEN
insertXMLafter(xcol,
'/a/b', XmlType('<c>2</c>'))
ELSE
XMLQuery('copy $tmp := . modify insert node
<c>2</c>
after $tmp/a/b
return $tmp'
PASSING xcol RETURNING CONTENT)
END
FROM tbl;
当然,如果在将来的数据库版本中删除insertXMLafter方法,那将无法帮助您。这会产生无效的SQL。但是现在你会很好并且在正确的版本上使用正确的方法。