FC2ブログ

やっと仕事が終わりました

やっと仕事がひと段落しました。
去年から進めていたDBサーバのリプレース作業。
いや~、長かった。
大きなトラブルもなく終わったので一安心です。

しかしOracleを9i→11gに変えると色々違いが出てきますね。

・パスワードの有効期限があるので、ほっとくと
 半年後にパスワードロックされて使えなくなる
・データの並び順が変わる
・今まで曖昧だったPL/SQLの記述がより厳密になる
などありました。

でもこれでまた数年は心配しなくて良いので安心です。
来年はAPサーバの切り替え作業です。

ふぅ・・・
スポンサーサイト



テーマ : 小さなしあわせ
ジャンル : 日記

BETWEENって?

3/31に妙な現象がおきました。
あるシステムからマスタデータをもらって、バッチで登録したのですが、
あるデータだけ登録されませんでした。

登録の条件として、マスタデータの有効期限を見ているのですが、
その登録されなかったデータの有効期限は2011/03/31だったんですね。

ORACLEの条件文で、BETWEENを使っていて、有効期限終了日が当日の日付
以内であれば取り込むようにしているのですが、結果的に取り込まれて
いませんでした。

ORACLE関連書籍でBETWEENの仕様を調べてみたら、
BETWEEN A AND Bというのは、A>=比較対象 B<=比較対象と書いてあったので、
じゃあ、2011/03/31も含まれるはずだと思ったのですが、現実としては
ダメでした。

もしかして、A>=比較対象 B<比較対象なんですかね?
でもどこにもそんなこと書いてないんですよ。
それとも何か条件の指定の仕方が悪いのかな?

ちょっと気持ち悪い現象でした。

テーマ : コンピュータ
ジャンル : コンピュータ

Windows7先行予約開始

6月26日にWindows 7のアップグレード版を約半額に割り引く先行予約キャンペーン「Windowsありがとうキャンペーン」が開始されましたが、まだ買う気にはなれませんねぇ。

職業柄どうしても枯れた技術のほうが安心感があるので、つぎあてがいっぱい
当たってから買うことにしています。

今は自宅でVistaを使ってますが、まだXPのほうが使いやすいですね。

Windows7は自分の中では当分先の話です。

テーマ : Windows 全般
ジャンル : コンピュータ

参照整合性制約

データベースで参照整合性制約というものがありますが、
私が受け持っているシステムでも使用しています。

今、そのシステムの改修作業をしているのですが、この
参照整合性制約が邪魔して、データの更新ができないので
悩んでいました。

親表と子表を同時に更新する方法がないかどうか調べてみたのですが、
どうやらオラクルにはその機能はないらしく、どうやって実装しようか
ずっと考えていました。

調べた記事の中には、参照整合性制約をシステムで使うなんて
意味がないというような記述もありました。
私のシステムで使っているから弁護するわけではないのですが、
実際に使うことで整合性がとれるわけだし、必要な機能だと思います。
もちろん短所もありますが、それは使い方の問題でしょう。

それは置いといて、なぜ困っているかと言うと、
親表(A表)、子表(B表)があり、A表に更新掛けようとすると、B表と
食い違ってしまうからエラーとなるわけです。

この現象に対して、どのように対処したかと言うと、まず、
更新対象のA表のデータを更新データを含めてコピー(INSERT)します。

A表にはB表にデータを作成するINSERTトリガーが張ってあるので、
B表にも整合性のとれたデータを作成します。

その後、A表の元データを削除します。
参照整合性制約には、ON DELETE CASCADEオプションを付けているので
B表のデータも同時に削除されます。

もっといい方法もあるかもしれませんが、とりあえずこれで対応できました。
考えれば何かと思いつくものですね。

テーマ : プログラミング
ジャンル : コンピュータ

UPDATE文の妙技

先日、ORACLEのあるテーブルの更新をすることになって、何とかPL/SQLで組まずに
SQL一発で更新できないものか考えていました。

どんな内容かと言うと、

テーブル1

AB
111あああ
222いいい
333ううう

テーブル2

AB
111かかか
222ききき
444くくく

という2つのテーブルがあって(どちらもA列に主キーがはっています)、
テーブル1、2のA列が共通のデータについてテーブル1のB列のデータを
更新するという内容です。

つまり、結果として、テーブル1が

AB
111かかか
222ききき
333ううう

となればOK(333は更新されない)。



家のパソコンにはORACLEが入ってないのでちょっと試してないのですが、
以下のようなUPDATE文でうまくいきました。

UPDATE テーブル1 T1 SET
B = (
SELECT B FROM テーブル2 T2
WHERE T1.A=T2.A
)
WHERE EXISTS (
SELECT * FROM テーブル2 T2
WHERE T1.A=T2.A
)

こうやって狙ったデータだけ一括更新できると便利ですね。
SQLは覚えれば覚えるほど色々なことができると改めて感じました。

テーマ : データベース
ジャンル : コンピュータ

プロフィール

やまやま

Author:やまやま
40代の♂です。

IT業界で仕事してます。

趣味はマンガと英語学習。
あと科学、環境問題を扱った
雑誌を読むこと。

FC2カウンター
リンク
最近の記事
カテゴリー
最近のコメント
ブログランキング
ブロとも申請フォーム

この人とブロともになる

最近のトラックバック
ブログ内検索
月別アーカイブ
RSSフィード