2016-10-20 13 views
1

Oracle 11gデータベースのXML型列から値を抽出するためにEXTRACTメソッドを使用していました。私のテーブルには10行、私はoracle XMLTABLEが正常に動作していません

返された行で
'/Items/OperatingSystem/@Version[contains(.,"4.04")]' 

ようXPATHで、いくつかの条件を置くときEXTRACTとして は、select句で使用されている場合はXPath式がある場合

は、それはNULLを示し一致しませんが、10行すべてが表示されます。

私はXMLTABLEに移動しようとしましたが、これは最新のものです(EXTRACTは非推奨です)。わかっているように、FROM節で使用されています。私はいくつかの基本的なクエリを試して、それがXPATH式と一致する行を返すだけであることを発見しました(EXTRACTの場合に返されるNULL行をスキップします)

XMLTABLEを使用して見つかった1つの奇妙な問題は - 私のローカル環境では、

'/Items/OperatingSystem/@Version[contains(.,"4.04")]' 

結果として、「Dee」を含む名前の行だけが選択されます。

しかし、私は私たちのテスト環境

に対して同じクエリを実行するときには、代わりにのみ「ディー」を含む名前を持つ選択のすべての行を選択します。 これはなぜ起こっているかのヒントが見つかりませんでした。私はAgeなどのような他のフィールドに条件を置くクエリをいくつか試してみましたが、結果は同じです。すべての行を戻しています。ここで

は、バージョンの詳細は - ローカルOracleバージョン -

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 
PL/SQL Release 11.2.0.2.0 - Production 
"CORE 11.2.0.2.0 Production" 
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production 
NLSRTL Version 11.2.0.2.0 - Production 

テスト環境のOracleバージョン -

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 
PL/SQL Release 11.2.0.3.0 - Production 
"CORE 11.2.0.3.0 Production" 
TNS for HPUX: Version 11.2.0.3.0 - Production 
NLSRTL Version 11.2.0.3.0 - Production 

これらのバージョンではXMLTABLEに関連するすべての変更があります。

サンプルデータ

私は次の表

NAME | XMLDATA  | CRT_TS 
Ubuntu | UbuntuXMLDATA | 20-OCT-2016 
Windows | WindowsXMLDATA| 20-OCT-2016 

があるとしUbuntuXMLDATA

<Items> 
<OperatingSystem Name="Ubuntu 12.04" Version="12.04" /> 
<OperatingSystem Name="Ubuntu 14.04" Version="14.04" /> 
<OperatingSystem Name="Ubuntu 16.04" Version="16.04" /> 
</Items> 

WindowsXMLDATA

<Items> 
<OperatingSystem Name="Windows" Version="8" /> 
<OperatingSystem Name="Windows" Version="7" /> 
</Items> 

表のxmlはXMLDATA列にあります。

クエリ

select Name,rx.COLUMN_VALUE as XPATH_OUTPUT from Operating_System, XMLTABLE('/Items/OperatingSystem/@Version[contains(.,"4.04")]' PASSING XMLTYPE(XMLDATA)) rx where CRT_TS = 20-OCT-2016; 

期待される結果

Name | XPATH_OUTPUT 
Ubuntu | 14.04 

の実績

Name | XPATH_OUTPUT 
Ubuntu | 12.04 
Ubuntu | 14.04 
Ubuntu | 16.04 

問題私はfacinていますgは上記のクエリがローカルデータベースで正常に動作しています。 しかし、テスト環境に対しては、1行ではなく3行が返されます。なぜ私は理解できませんか? Oracleバージョン(私は上記の詳細を与えている)の不一致によるものですか?

+1

サンプルデータ、クエリ、予期しない結果があります。 – Aleksej

+0

@Aleksejサンプルデータを提供しました。あなたが助けることができる場合は参照してください –

答えて

0

同様の問題に直面している人は、XPATH式を変更することで問題を解決できます。 XPath式を

に変更しました
/Items/OperatingSystem[contains(@Version,"4.04")]/@Version 

ドット(。)演算子を使用して現在の属性の値を取得する代わりに、@Version自体を指定します。

1

バグかどうかわかりません。 xmlを渡すためにエイリアスを使用していない場合、xmltableにあります。 "。 XMLのルートです。

このXPathを試してみてください。

'/Items/OperatingSystem/@Version[contains(.,"4.04")]' '/Items/OperatingSystem/@Version[contains(.,"OperatingSystem")]' '/Items/OperatingSystem/@Version[contains(.,"Ubuntu")]'

結果は常になります。3行。

が含まれています(。、 "XXXX")]全体かどうかをチェック文書には文字列が含まれています

解決策1

xqueryを変更します。

'/Items/OperatingSystem[contains(@Version,"14.04")]/@Version'

ソリューション2

は、XMLのエイリアスを追加します。 XMLTABLE('$doc/Items/OperatingSystem/@Version[contains(.,"4.04")]' PASSING XMLTYPE(XMLDATA) as "doc")

+0

説明ありがとう非常にありがとう。 –

関連する問題