![](/img/trans.png)
[英]How to extract value of all the child nodes of a specific node (provided through input parameter) from XMLType Column in Oracle
[英]Inserting a child node in an XMLTYPE column
我有一個簡單的查詢:
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;
我想要做的是在節點<a>
<b>
之后插入節點<c>
但是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
的替代品並遵循該示例但只得到了錯誤。
我知道這是非常基本的,我錯過了一些明顯的東西。 請幫忙。
以下代碼應適用於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
一種丑陋但可能的方法是只使用一個在舊版和當前數據庫版本上正常工作的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。 但是現在你會很好並且在正確的版本上使用正確的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.