


SQLを知らないSEたち
(
19990806
)
みなさん、今日はデータベースのお勉強です。仕事で他人の書いたMS-Access95のコードを読んでいて相当頭にきたのでここに書くことにした。お題は社員データベース。毎月ホストコンピュータにある名簿データをテキスト形式でダウンロードし、サーバのオラクルにある社員名簿を更新する。
単に更新するだけでなく、ホスト側で新規に追加されたデータは「新規」フラグ、氏名が変更されたデータは「更新」フラグを立て、削除されたデータは、サーバ側では削除せずに残して「削除」フラグだけ立てる。
| 「社員名簿」表 | | 社員番号 | 氏名 | フラグ | | 1999001 | 青木健 | NULL | | 1999002 | 伊藤学 | NULL | | : | : | : |
|
主キーは社員番号。最初はフラグ列はすべてNULL(空文字)とする。さて、みなさんならどうする?情報処理技術者試験のデータベース・スペシャリスト午後の部の問題よりかなりカンタン。僕なら次のようにする。
|
・オラクル内に「社員名簿」表と同形の「旧社員名簿」表を作成する
(旧社員名簿をきれいに)
(現在のデータを旧社員名簿に退避)
・ダウンロードした名簿ファイルをSQL*Loaderで「社員名簿」表へ読みこむ
(もちろんTRUNCATEオプション付きで)
(これで新規フラグがセットされる)
WHERE M1.社員番号=M2.社員番号
AND M1.氏名<>M2.氏名);
(これで更新フラグがセットされる)
(旧社員名簿側でフラグを立てておいて....)
・INSERT INTO 社員名簿
(社員名簿へ削除データをもどす)
以上、6つのSQLで事が済む。SQL*Loaderのオプションを使えばもっとうまくできるかもしれない。さて、最後に今日僕が読んでいた他人のプログラムをご紹介する。以上と全く同じ処理を実行するものだ。
・MS-Accessにオラクルの「社員名簿」表をリンクする。
・MS-Access内に同形の「A社員名簿」表を作成する。
(オラクルと区別するために「A社員名簿」表と呼ぶ)
・「A社員名簿」を全件削除する。
・「A社員名簿」表にオラクルの「社員名簿」表をインポートする。
・MS-Access内に同形の「A一時社員名簿」表を作成する。
・「A一時社員名簿」表に名簿ファイルを上書きでインポートする。
これでAccess内に新旧の社員名簿がそろった。
・「新規データ」クエリーを作成し、「A一時社員名簿」に社員番号が存在するが、「A社員名簿」には存在しない社員だけの一時表とする。
・「削除データ」クエリーを作成し、「A社員名簿」に社員番号が存在するが、「A一時社員名簿」には存在しない社員だけの一時表とする。
・MS-Access内にVisual Basicで以下のようなプログラムを書く。
・まず「新規データ」処理関数
・「新規データ」クエリーのデータセットと、「A一時社員名簿」のデータセットと、オラクルの「社員名簿」テーブルのデータセットの3つを開く。
・「新規データ」クエリーのデータセットを1件ずつ読みながら、「A一時社員名簿」の中で社員番号が一致するレコードを拾い、そのデータでオラクルの「社員名簿」データセットを更新する。そのとき、オラクル「社員名簿」のフラグに新規フラグをセットする。これをレコード数分繰り返す。
・次に「更新データ」処理関数
・「A一時社員名簿」のデータセットと、オラクルの「社員名簿」テーブルのデータセットの2つを開く。
・「A一時社員名簿」のデータセットを1件ずつ読みながら、オラクルの「社員名簿」の中で社員番号が一致するレコードを拾い、氏名が異なる場合のみオラクルを更新する。そのときフラグに更新フラグをセットする。これをレコード数分繰り返す。
・最後に「削除データ」処理関数
・「削除データ」クエリーのデータセットと、オラクルの「社員名簿」テーブルのデータセットの3つを開く。
・「削除データ」クエリーのデータセットを1件ずつ読みながら、オラクル「社員名簿」の中で社員番号が一致するレコードを拾い、削除フラグをセットする。これをレコード数分繰り返す。
同じ仕事を頼まれたら僕はこの人の10倍早く片付けただろう。どんなプログラムを書こうと個人の勝手だけれど、そのために人事部門にMS-Accessのプログラムを実行するというルーチン業務が発生し、人事制度の改訂のたびに迷路のようなVisual Basicのプログラムを僕が読まなきゃいけないハメになる。
概してオラクルの更新にMS-Accessを使いたがるシステム・エンジニアはこういうひどいプログラムを書いて、ものすごいものを作った気になるらしい。もちろんSQLなして関係データベースを更新できるような製品を作ってしまったベンダーの責任でもあるが。
『ノーツ・マガジン』という雑誌の巻末近くの連載で、ロータス・ノーツとオラクルの連携システムを作ろうとしたSEがAccessのパススルー・クエリーでオラクルを更新しようと悪戦苦闘するくだりで、列名をテーブル名で修飾する書式について、「SCOTT.社員名簿」というオラクルの書式が「方言」で、「SCOTT_社員名簿」というAccessの書式が「ODBCの標準」だととんでもない勘違いをしている部分があった。これもAccessの罪だ。
いずれにせよシステム・エンジニアの基本は設計力。設計の悪いシステムは、みんなに迷惑をかけるというお話でした。いつもよりつまらないエッセーでごめんね、歌え〜果実のように、ごめんね....


|