いくつかのコンテキスト: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を追加しますか?