9

簡単なクエリがあります:

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>後にノードを挿入することですが、Oracle 12c はこのエラーをスローしています:<b><a>

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その例に従ってみましたが、エラーが発生しただけです。

私はそれが非常に基本的であることを知っており、明らかな何かが欠けています。助けてください。

4

2 に答える 2

2

古いバージョンと現在のデータベース バージョンで正しく機能する SQL クエリを 1 つだけ使用する、醜いが可能な方法の 1 つは、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 が生成されます。しかし、今のところは、適切なバージョンで適切な方法を使用することで問題ありません。

于 2014-07-28T15:10:56.823 に答える