7

いくつかのコンテキスト:DBはOracleです。テーブルの行ごとに1つの区切られた文字列を作成しようとしています。区切られた文字列の値の一部は、CLOB(XMLを含む)から取得する必要があります。一部の行ではCLOBがnullになる可能性があり、これが問題の原因です。

たとえば、次の行を持つテーブル'Item'があります:'Item_ID'、'Item_CD'、'Item_TXT'(CLOB)。テーブルには2つの行があります。一方の行には「Item_TXT」内に次のXMLが格納されており、もう一方の行の「Item_TXT」はnullです。

<OuterTag>      
    <InnerTag>test</InnerTag>   
</OuterTag>     

区切られた文字列の最初の3つの要素を返すために、次のSQLを作成しました。

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD 
FROM Item; 

これは正常に機能しました:

アイテム%#12345%#A

アイテム%#123456%#A

次に、4番目の要素(CLOBからの値)を追加しようとしました。

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item; 

これは次のエラーで失敗しました:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1

この問題を、Item_TXTがnullであり、XMLTYPE()がこれを処理できない場合があることに絞り込みました。これを証明するために、私は以下を実行しました:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item
WHERE Item_TXT IS NOT NULL; 

これは正常に機能しました:

アイテム%#12345%#A%#test

テーブル全体を処理し、可能な場合はclobから値を抽出する方法はありますか?それ以外の場合は、区切られた文字列にnull / noneを追加しますか?

4

2 に答える 2

9

ちなみに、エラーの理由は、xmltypeコンストラクターにnulllobが含まれているためです。個人的にはいつもxmltype.createxml(item_txt)代わりに使っています。nvlあなたはそれが等を心配する必要なしに同様に働くのを見つけるでしょう。

于 2013-03-01T10:57:19.953 に答える
3

nvlを使用してみてください:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD ||'%#'|| 
EXTRACT(XMLTYPE(nvl(Item_TXT, '<OuterTag><InnerTag/></OuterTag>')), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item;

これがsqlfiddleのデモです

または、 CASEステートメントを使用できます。

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_CD||'%#'||
case when Item_TXT is not null then
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal() end
FROM Item;
于 2013-02-28T15:32:32.360 に答える