fc2ブログ

(元)社内SEの徒然なる日記

OracleのSQLの実行結果が何か変!

■ 機能追加

先日、勤め先の基幹システムに修正を行いました。伝票の明細を抽出する処理があったのですが、抽出する明細を選択できるように修正したのです。

その中で、Oracleに発行しているSQLの条件を追加しました。下記の赤字の部分が追加部分です(生の情報は出せないので、テーブル名、項目名は全て仮のものです)。
select
a.aa
,b.bb
,c.x
,c.y
,c.z
,d.name
from
a
,b
,c
,d
where
a.aa = b.aa
and b.aa = c.aa
and b.bb = c.bb
and b.x = c.x
and c.z <> 0
and (
(c.x = 1 and c.y = 1)
or
(c.x = 2 and c.y = 1)
)

and a.cdname = d.cdname(+)



明細の選択は、cテーブルのxとyの組み合わせで決定されるため、ちょっと嫌らしい条件になってしまいました。しかし、別に書式が間違っている訳ではないし、テスト環境では問題なく動いたので本番環境にリリースすることにしました。

■ 障害発生!

さて、本番環境にリリースして暫くは問題なかったのですが、半日くらい経過した辺りから、ポチポチと「明細を選択しているのに、抽出結果が出ない」と問い合わせが来るようになりました。

しかし、どう考えてもプログラムに問題はないし、発生原因が掴めません。

動作状況から、どうもSQLの抽出結果が取得できていないの原因っぽいのですが、データとSQLを見比べると、どう考えても抽出できる筈なのです。

どうしても原因がわからないので、問題になっているデータを本番環境から引っこ抜いて、開発環境に登録。開発環境で問題のSQLを実行したのですが、同じデータなのに、何故か抽出できてしまいました。

・・・な〜ぜ〜だ〜

さらに分からんのが、外部結合している dテーブルと結合しなかったり、抽出結果に関係ないはずの条件を消してみたら抽出できたりと、妙な動作をしています。

もしかして、Oracleのバグなのかね?

■ 対応

原因は不明でも、発生条件さえ分かればやりようはあります。SQLの修正箇所を消して、プログラム側(Java)で明細を選択する処理を追加して対応することにしました。

一応、これで解決ではあるのですが、どうも気持ち悪いです。今後も同じような問題が発生しては困るので、情報をまとめてサポートに問い合わせることにしました。

さて、どんな返答が返って来るのか楽しみです。

ちなみに、Oracleのバージョンは12c。開発環境はWindows、本番環境はSolarisです。

■ 後書き

現在の基幹システムは、Oracleが9iの時代に作られたものです。私が本格的にOracle(というか、データベース)に関わったのも、その辺りからです。

何が言いたいかっていうと、上記でテーブル結合の条件の書き方が標準SQLと違う(結合条件をWhere句に書いている)のは、当時のOracle独自の方式が体に染み込んでいるからだって事です。

・・・いや、もちろん標準SQLでも書けますよ?どちらかと言うと、そっちの方がスマートだと思います。って言うか、そもそもOracle自体がそっちを推奨し始めているし(・・・Oracleの裏切り者め)。

基幹システムの膨大なSQLを書き換えるのは無理でも、せめて新しく追加する機能については考えた方が良いのかなって思う今日この頃です。

最新の記事:http://harikofu.blog.fc2.com/
投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end —
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する