2017-11-08 15 views
0

XML-styleデータを含むCLOB列がありますが、親子ノードの関係はありません。それは次のようになります。Oracle Clobのノード値の抽出

<servicePointExternalId>8629391888</servicePointExternalId><externalSPType>E-M-COM</externalSPType><faType>M-STARTS</faType><requesterUserId>E05920</requesterUserId><replyToExternalSystem>D1YS</replyToExternalSystem><externalReferenceId>47676141503102</externalReferenceId><retryDetails><numberOfRetries>0</numberOfRetries><isToDoEntrySuppressed>false</isToDoEntrySuppressed><retryDateTime>2017-04-28-18.16.53</retryDateTime><currentErrorState>VALERROR</currentErrorState></retryDetails><contactDetails><customerName>Hofstader, Leonard</customerName><contactName>Hofstader, Leonard</contactName><accountId>5669202300</accountId><personId>9538791588</personId></contactDetails><saList><eventType>D1ST</eventType><saId>5668577181</saId></saList> 

私はちょうどこのフィールドから(E05920なければなりません)requesteruserID値を抽出しようとしていますし、私はこのエラーメッセージを取得しています:私は間違って

ORA-31011: XML parsing failed 
ORA-19213: error occurred in XML processing at lines 1 
LPX-00245: extra data after end of document 
ORA-06512: at "SYS.XMLTYPE", line 272 
ORA-06512: at line 1 
31011. 00000 - "XML parsing failed" 
*Cause: XML parser returned an error while trying to parse the document. 
*Action: Check if the document to be parsed is valid. 

何をしています?

答えて

0

サンプルは完全なXMLドキュメントではありません。親ノードはなく、隣接する子ノードだけです。

XMLとして扱いたい場合は、それをダミーのルートノードにラップする必要があります。

xmltype(to_clob('<root>') || clob_col || '</root>') 

をあなたはあなたがして行うことができますしたい特定のノードの値を取得するには:

select xmlquery(
    '/root/requesterUserId/text()' 
    passing xmltype(to_clob('<root>') || clob_col || '</root>') 
    returning content) as result 
from your_table; 

RESULT                   
-------------------------------------------------------------------------------- 
E05920 

それともきたテーブルと列名を持つあなたのCLOBはclob_colあなたが行うことができますと呼ばれる列である場合

select xmlquery(
    '/root/requesterUserId/text()' 
    passing xmltype(to_clob('<root>') || A.BO_DATA_AREA || '</root>') 
    returning content) as result 
from CISADM.D1_ACTIVITY A 

か、単に

select xmlquery(
    '/root/requesterUserId/text()' 
    passing xmltype('<root>' || A.BO_DATA_AREA || '</root>') 
    returning content) as result 
from CISADM.D1_ACTIVITY A 
:コメントとして追加

select cast(
    xmlquery('/root/requesterUserId/text()' 
    passing xmltype(to_clob('<root>') || A.BO_DATA_AREA|| '</root>') 
    returning content) 
    as varchar2(8)) as requesterUserId 
from CISADM.D1_ACTIVITY A; 

または代替として、あなたはXMLTable代わりのXMLQuery使用することができます:プレーン文字列値を与える

select x.requesterUserId 
from CISADM.D1_ACTIVITY A 
cross join xmltable(
    '/root' 
    passing xmltype('<root>' || A.BO_DATA_AREA || '</root>') 
    columns requesterUserId varchar2(8) path 'requesterUserId' 
) x; 

いずれかが

あなたは別のデータ型に戻り、XMLフラグメントをキャストすることができます:

REQUESTE 
-------- 
E05920 

Read more about XML processing

+0

あなたの答えに基づいて、お返事をいただきありがとうございます。私のコードはこのようになります。 セレクトXMLQUERY( '/ルート/ requesterUserId /テキスト()' 通過のXMLType(A.BO_DATA_AREA( ' ')|| A.BO_DATA_AREA ||'') 復帰コンテンツ)CISADM.D1_ACTIVITY Aから結果として ; ORA-00904: "A"。 "BO_DATA_AREA":無効な識別子 00904. 00000 - "%s:無効な識別子" *原因: –

+0

これは、 ; 'A.BO_DATA_AREA( '')'はto_clob( '') 'にする必要があります。 ( 'to_clob()'は、連結演算子の最初の引数が 'clob'であることを確認することです(実際は必要ありません)(https://docs.oracle.com/cloud/latest/db112/ SQLRF/operators003.htm#SQLRF51158)。 –

+0

ああ、シュート、申し訳ありません。私はあなたが実際の列のプレースホルダとしてTO_CLOBを意味していたと思っていました。間違いの申し訳ありません。関係なく、 ORA-00904、同じエラーが発生しているようだ: "TO_CLOB":無効な識別子 00904. 00000 - "%sの:無効な識別子" *原因: *アクション: はその列または何かを考えですか?途中で迅速な回答をいただきありがとうございます。本当に助けてくれてありがとう! –

関連する問題