C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Oracle11gR2環境でのDECODE関数について


(過去ログ 101 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■59850 / inTopicNo.1)  Oracle11gR2環境でのDECODE関数について
  
□投稿者/ M.U (1回)-(2011/06/09(Thu) 10:51:05)

分類:[データベース全般] 

環境
 Oracle11g Database Release 2 (11.2.0.1.0) for Microsoft Windows x64
データベースキャラクタセット:JA16SJISTILDE
 各国語キャラクタセット:AL16UTF16


上記環境でDECODE関数を使用するとエラーになることがあります。

エラーになる記述例
SELECT DECODE(Column1,NULL,NULL,Column2) FROM TABLE_1

ここでColumn2が返される場合に、以下のエラーが発生します。
エラー内容「SP2-0784: 0x97で始まる無効または不完全な文字が戻されました」
エラーが発生しない場合もありますが、文字化けした状態になります。

「SELECT DUMP(DECODE(Column1,NULL,NULL,Column2),1016)」を実行すると、
CharacterSetが「US7ASCII」になっています。

Oracle11gR1にて同様の記述をしても、エラーも文字化けも発生しなかったのですが、
R2になって仕様が変わったのでしょうか?
ちなみにR1環境でDUMPを実行すると、CharacterSetは「JA16SJISTILDE」になります。

原因のわかる方がいらっしゃれば教えてください。

ちなみに以下のいずれかの記述に修正しようと考えていますが、
修正方法に問題がある、もしくはこの修正方法がよいなどありましたら併せて教えてください。
 1.NVL2関数を使用する
    SELECT NVL2(Column1,Column2,NULL) FROM TABLE_1
 2.TO_CHAR関数を使用する
    SELECT DECODE(Column1,NULL,TO_CHAR(NULL),Column2) FROM TABLE_1
 3.CASE式を使用する
    SELECT CASE WHEN Column1 IS NULL THEN NULL ELSE Column2 END FROM TABLE_1

よろしくお願いします。
引用返信 編集キー/
■59853 / inTopicNo.2)  Re[1]: Oracle11gR2環境でのDECODE関数について
□投稿者/ shu (769回)-(2011/06/09(Thu) 11:32:36)
2011/06/09(Thu) 11:33:11 編集(投稿者)

No59850 (M.U さん) に返信

> 原因のわかる方がいらっしゃれば教えてください。
環境がないので分かりませんが、Decodeの戻り型が3番目の引数で決まるからではないでしょうか?


>
> ちなみに以下のいずれかの記述に修正しようと考えていますが、
> 修正方法に問題がある、もしくはこの修正方法がよいなどありましたら併せて教えてください。
>  1.NVL2関数を使用する
>     SELECT NVL2(Column1,Column2,NULL) FROM TABLE_1
>  2.TO_CHAR関数を使用する
>     SELECT DECODE(Column1,NULL,TO_CHAR(NULL),Column2) FROM TABLE_1
>  3.CASE式を使用する
>     SELECT CASE WHEN Column1 IS NULL THEN NULL ELSE Column2 END FROM TABLE_1
1.がすっきりしてて良いように思います。

Column1がNullのときの判断でColumn1=Column1とならないのであれば
DECODE(Column1,Column1,Column2,Null)
ということも出来るかも?

今回は違いますが、
Column1,Column2が数値ならColumn2+Column1-Column1とかも可能かも。



引用返信 編集キー/
■59856 / inTopicNo.3)  Re[1]: Oracle11gR2環境でのDECODE関数について
□投稿者/ やじゅ (1916回)-(2011/06/09(Thu) 12:23:16)
やじゅ さんの Web サイト
No59850 (M.U さん) に返信
> Oracle11gR1にて同様の記述をしても、エラーも文字化けも発生しなかったのですが、
> R2になって仕様が変わったのでしょうか?

「始まる無効または不完全な文字が戻されました」で検索したけど、
下記サイトの内容が関係してそうですかね。
http://benzaiten.dyndns.org/roller/ugya/entry/ora_29275_partial_multibyte_character

漢字の1バイト目がCHAR型カラムの最終バイトになった場合、10gR1ではブランクパディングになっていたが
11gR2ではゼロパディングされ結果的にカラム長に対して文字列が足りない不正状態になり
ORA-29275やSP2-0784を起こす。
引用返信 編集キー/
■59859 / inTopicNo.4)  Re[2]: Oracle11gR2環境でのDECODE関数について
□投稿者/ M.U (3回)-(2011/06/09(Thu) 13:22:58)
No59853 (shu さん) に返信

> 環境がないので分かりませんが、Decodeの戻り型が3番目の引数で決まるからではないでしょうか?
返信ありがとうございます。
確かに、NULLの返却位置を変えた場合はエラーは発生しません。R1とはNULLの型が異なるということでしょうか?
ちなみにR1でキャラクタセットに「AL32UTF8」を使用しているデータベースで同じように確認したところ、
返されるCharacterSetは「AL32UTF8」になりました。

回避策はあるので、R1とR2で仕様が変わったという公式文書などがあればすっきりするのですが・・・
Oracleのアップグレードガイドには該当しそうな記述が見つかりませんでした。
http://download.oracle.com/docs/cd/E16338_01/server.112/b56310/toc.htm

>>ちなみに以下のいずれかの記述に修正しようと考えていますが、
>>修正方法に問題がある、もしくはこの修正方法がよいなどありましたら併せて教えてください。
>> 1.NVL2関数を使用する
>>    SELECT NVL2(Column1,Column2,NULL) FROM TABLE_1
>> 2.TO_CHAR関数を使用する
>>    SELECT DECODE(Column1,NULL,TO_CHAR(NULL),Column2) FROM TABLE_1
>> 3.CASE式を使用する
>>    SELECT CASE WHEN Column1 IS NULL THEN NULL ELSE Column2 END FROM TABLE_1
> 1.がすっきりしてて良いように思います。
アドバイスありがとうございます。修正文字数も少なくて済むので、NVL2関数を使ってみようと思います。


No59856 (やじゅ さん) に返信
> 「始まる無効または不完全な文字が戻されました」で検索したけど、
> 下記サイトの内容が関係してそうですかね。
> http://benzaiten.dyndns.org/roller/ugya/entry/ora_29275_partial_multibyte_character
返信ありがとうございます。
今回エラーとなる列の型はNVARCHAR2を使用しています。(情報不足ですみません。)
リンク先はCHARでの問題みたいですね。違う現象かもしれませんが、参考にしてみます。


引用返信 編集キー/
■59927 / inTopicNo.5)  Re[2]: Oracle11gR2環境でのDECODE関数について
□投稿者/ M.U (4回)-(2011/06/13(Mon) 09:30:07)
Oracleの掲示板などで検索したところ、Oracleのバグである可能性が高いことが分かりました。
パッチ適用で現象は発生しなくなりましたので、解決済みとさせていただきます。
shuさん、やじゅさん、アドバイスありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -