homeup mail to
sub title

SQLを知らないSEたち
( 19990806 )

Japanese/English

みなさん、今日はデータベースのお勉強です。仕事で他人の書いた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の罪だ。

いずれにせよシステム・エンジニアの基本は設計力。設計の悪いシステムは、みんなに迷惑をかけるというお話でした。いつもよりつまらないエッセーでごめんね、歌え〜果実のように、ごめんね....


無断転載禁止

サラリーマンを考える 日本的なるものを考える 日常生活を考える
「おじさん」を考える 映画/音楽/書物を考える 情報システムを考える
愛と苦悩の日記 筆者のYouTubeチャンネル

homeup mail to