DOBON.NET DOBON.NETプログラミング掲示板過去ログ

目には見えないデータについて

環境/言語:[VB.NET Oracle10g ADO.NET]
分類:[.NET]

使用しているもの
VB.NET
Oracle10g
ADO.NET

はじめまして。早速質問ですが、

SELECT文でデータを取得し、それをそのまま別のテーブルにINSERTします。
その時、NULLでもなく、LENGTHゼロでもない、でも目には見えないデータが
あるようで、そのデータでエラーが出ます。

SqlPlusなどを使用し、[カラム名] is null や [カラム名] = '' などを
WHERE句で指定してみましたが、このエラーデータを取得することができません。

NULLでもなくLENGTHゼロでもないこのデータは、一体何なのでしょうか??
ご存知の方がいましたら、ご教授ください。宜しくお願い致します。
こんにちは、じゃんぬ です。

■No12648に返信(きりんさんの記事)
> SqlPlusなどを使用し、[カラム名] is null や [カラム名] = '' などを
> WHERE句で指定してみましたが、このエラーデータを取得することができません。

Length が 0 でないなら、TRIM しなきゃいけませんよね。

> NULLでもなくLENGTHゼロでもないこのデータは、一体何なのでしょうか??
> ご存知の方がいましたら、ご教授ください。宜しくお願い致します。

大切な情報が抜けてませんか?
データの型は?
じゃんぬねっとさん、お返事ありがとうございます。

> Length が 0 でないなら、TRIM しなきゃいけませんよね。

TRIMも行ってみました。結果は同じでした。

> 大切な情報が抜けてませんか?
> データの型は?

データの方はVARCHAR2です。

投稿したあと、SELECT句にLENGTHB([カラム名])を追加してみました。
すると、何も無いにもかかわらず、LENGTHはそのカラムの最大のLENGTHを
示しました。

もう何がなんだかさっぱりわかりません。
助言宜しくお願い致します。
> データの方はVARCHAR2です。
データ中に、非可読文字が含まれて居ませんか?


> 投稿したあと、SELECT句にLENGTHB([カラム名])を追加してみました。
DUMP関数を使って、内容を調査してみては。

『SELECT DUMP(列) FROM 表 WHERE 〜』
魔界の仮面弁士さん、お返事ありがとうございます。

> 『SELECT DUMP(列) FROM 表 WHERE 〜』

実行してみますと、入ってました。
『Typ=1 Len=1: 0』
空ではありませんでした。

これを簡単に消す(NULLにする)方法を
ご教授頂けるとありがたいです。

重ね重ね申し訳ありません。
■No12657に返信(きりんさんの記事)
> > これを簡単に消す(NULLにする)方法を
> ご教授頂けるとありがたいです。
> > 重ね重ね申し訳ありません。
>
Update文で列名にNULLを設定すれば簡単にNULLになりますよ。

誰がどのように可笑しなデータを入れたのか分からないので、
必要があればデータのバックアップと
プログラムのチェックをしたほうがいいかと思います。
■No12665に返信(封真さんの記事)
> Update文で列名にNULLを設定すれば簡単にNULLになりますよ。
勘違いされる可能性のある文章だったので自己修正(^^;

Update テーブル名 set 列名 = null where 〜
で列の値をNULLに出来ますよ。
■No12666に返信(封真さんの記事)
全てのデータを NULL にしていいなら…だけど、何が入ってるか
分からないデータのみ Where 〜 で限定するだとできないのでは?
>きりんさん
見えないデータを入れた側の情報は全くないんですか?

…最初はフィールドのデータ型を固定長から可変長に変えて空白
が入っているだけかと予想してたけど Trim で取れないなら
誰かがそんなデータを入れたはず…ですよねぇ?
> 全てのデータを NULL にしていいなら…だけど、何が入ってるか
> 分からないデータのみ Where 〜 で限定するだとできないのでは?

「分からないデータ」という曖昧な条件は無理でも、少なくとも、
> 『Typ=1 Len=1: 0』
のレコードの抽出はできますよね。NCHR等で。
効率を無視すれば、DUMP関数等の結果でWHEREする手もありますし。


> 誰かがそんなデータを入れたはず…ですよねぇ?
ですよね。私も、この点をきちんと調査した方が良いと思います。
> >>『SELECT DUMP(列) FROM 表 WHERE 〜』
> > 実行してみますと、入ってました。
> 『Typ=1 Len=1: 0』
> 空ではありませんでした。
と書かれているので、行の特定は出来ているのでは?と
オレ思っていましたが・・・。
出来ていなかったのかな?(^^;

データ追加・更新をするプログラムを動かして確認しないと
潜在バグになりかねないので恐いですね。

テストや開発期間中なら誰かが誤ってSQL*PlusやAccess(ODBC)などで
変なデータを入れてしまった〜なんて事もあるんでしょうけど。(^^;
#やられたことがあったので
こんばんわ。皆さんありがとうございます。
データの特定はできていませんし、
どういうデータかの情報も全くありません。

そのエラーデータはコードに変換すると、
"0"となったので、SELECT時に
DECODE(ASCII([カラム名]),0,NULL,[カラム名])
とし、強制的にNULLに置換しました。

もっと良い方法があったかもしれませんが、
とりあえずはエラーは出なくなりました。

様々な意見ありがとうございました。
解決済み!
追記です。

データはもともと汎用機のもので、
それをORACLEに移しました。

開発者側では、データは私しか取り扱っておらず
そのテーブルに更新、追加をするような処理は、
一切ありません。

データを頂いた方にも確認しましたが、
わからないということでした。

一回きりのPGですので、解決としました。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板