簡體   English   中英

在XMLTYPE列中插入子節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM