2010年9月5日日曜日

昨日よりはマシな夜のOracle

長さ0の文字列('')はNULLとして扱われる

「フィールドの値がスペースのみのデータを抽出」という仕様を実現するのに「TRIM( [フィールド名] ) = ''」と組んだが、期待した結果とならず。TRIM( [フィールド名] )をSELECTして戻り値を見てみると、値がスペースのみの場合は何とNULLが返ってきている。あれっ!?空文字とNULLは別物の筈だが…何とも不可解であるが、ゴーイングマイウェイなOracleならあり得るかと、素直に抽出条件を「TRIM( [フィールド名] ) IS NULL」と修正した。

後で調べてみたら、やはりOracleの独自仕様らしい。DB界の泰斗であらせられるミックさんの記事で知った。 上記記事によると、これに関してはOracleも反省しているのか知らんが、将来修正されるかもしれないとのこと。マジかよ。そうなったら上記みたいなSQLは修正しなきゃいけないじゃないか…

ANSI SQLの外部結合構文(OUTER JOIN)を使用時のバグが盛りだくさん

バージョン9i,10gにて、SQLの結合構文にANSI SQLのOUTER JOINを使用すると、エラーや結果不正が発生することがあるらしい。まあ、結構有名な話ですが。

ちなみに、具体的なバグの発生条件・内容や修正パッチは、サポート契約しないと入手できない(ケッ!)。
ネットに転がってないか散策していたら、以下のページを発見。何かのグループウェアのページのようだ。
上記ページの「Oracle9i,10gにおける不具合事項」の節に
「問題を修正した9.2.0.8,10.1.0.5,10.2.0.2のPSRが提供されています」
とあるが…本家発の情報じゃないので、何とも言えないな…

余程複雑なSQLでなければ、まあ大丈夫だというような意見をどこかで聞いたが…発生条件が不明である以上、あの忌まわしき(+)を使わざるを得ない。はぁ~…

複合主キーにまつわる幻?

ここで今から述べることは、夢幻の可能性大。

Oracleのバージョンは9i、複合主キーを使用したテーブルに、キーの一部がNULLのレコードを登録できてしまった…気がする。
例えば、複合主キーが3項目からなる場合、以下のようなレコードが登録できてしまった…気がする。
INSERT INTO table VALUES ('pk1', 'pk2', NULL, …)

しかも、複合主キーの一部がNULLのレコードは、幾つでも登録できてしまった…気がする。NULLはどの値とも等しくはならない(例え比較対象がNULLであっても)からだろう。

しかし、ネットで調べてみると、「複合主キーの一部にはNULLをセットできる」なんて誰も言ってない。自宅PCのMySqlで試したら、見事にはじかれたし。Oracleで試せって話だが、重たいし汚れるから自宅PCに入れたくない。

うーむ、俺、疲れてたのかな…

0 件のコメント: