こんにちは。プリーストです。
今担当しているお仕事では、開発言語にVB6、DBにOracleを使用しています。
VB6!?と思っていましたが、やってみるとこれが割と綺麗に書けたので思考の流れとアーキテクチャ設計指針をここにまとめておこうかなと思いました。
VB6は1998年リリースとのことですが、その時代としてはかなり先進的で画期的な言語だったのではないでしょうか。Windows95、98といいその頃のMicrosoftはすごかったんですね~。
長くなるのでとりあえず、第一回目では概要と方針を書いてみます。
何か参考になれば嬉しいです。
まずは、求められる非機能要件の整理からです。
・現行システムはVB6で作成したクライアントプログラムとOracleのストアドプロシージャで構成される2階層C/Sシステム
・開発するのは割と小規模のサブシステム
・DB操作はほとんどOracleのストアドプロシージャで行うが、保守時のデバッグが難しいことが課題
・使用するのはイントラネット内部のみで通信資源は潤沢
・将来的に.Net等のオブジェクト指向言語でリプレースする可能性がある
お客様に相談して頂いたのがやはり保守時のデバッグ。これがストアドプロシージャで記述してあるとやりづらいとのこと。
VB6のソースコードも読みづらく、保守効率が悪いというよくある相談をされました。
そして、将来的には.Netでのリプレースも考えているとのこと。
続きを読む…
Oracle, VB, Windows, 社員:プリースト
VB6, アーキテクチャ, オブジェクト指向
こんにちは、モンクです。
仕事をしていて、お客様からいただいたデータを、当方のDBに展開する作業を頼まれました。
幸いOracleには明るいので引き受けました。
しかし、、、Oracle DataPumpというユーティリティでエクスポートされたdmpファイルなので、使い慣れたimpコマンドは使えません。
お客様からオペログ(操作ログ)とインポートコマンドの例をいただいたので、それらを手がかりに作業をしました。
〜〜ここからオペログ
--ディレクトリオブジェクトをマシンのディレクトリに関連づけ、Oracleからアクセスできるようにする
--sqlplusから
create directory DB_DUMP as ‘c:¥DB_DUMP’; grant read, write on directory DB_PUMP to user1;
//上で関連づけたディレクトリにdmpファイルをエクスポートする
//コンソールから
expdp ¥”sys/sys@dbsvr as sysdba¥” directory=DB_DUMP schemas=user1 dumpfile=user1.dmp logfie=exp.log
〜〜ここから復元作業(当方のDBでの作業)
--インポート先のユーザ(エクスポート元のユーザと同名)を作る(インポート先のユーザ既にあれば、テーブルをカラにしておく)
--sqlplusから
create user user1
identified by password
default tablespace users
quota unlimited on users;
--当方の環境も同様にディレクトリオブジェクトをつくる
--sqlplusから
create directory DB_DUMP as ‘c:¥DB_DUMP’;
grant read, write on directory DB_PUMP to user1;
//インポート(コンソールから)
impdp ¥”sys/sys@dbsvr as sysdba¥” schemas=user1 directory=DB_DUMP dumpfile=user1.dmp logfie=imp.log ignore=y
*インポート先にユーザ(スキーマ)が存在していることと、インポート対象のテーブルがない、若しくはデータがないことが前提です。
Oracle, OS, Windows, データベース, 社員:モンク, 雑記
こんにちは、モンクです。
.NETとは全然関係のないことを書いてしまいます。
以下のような表があるとします。
<br />
SQL> select * from tab_x;</p>
<p> COLX1<br />
----------<br />
2<br />
4<br />
6</p>
<p>SQL> select * from tab_y</p>
<p> COLY1 COLY2<br />
---------- ----------<br />
2 20<br />
4 40<br />
6 60</p>
<p>
例題
TAB_Xの行全部とTAB_YのCOLY1が2である行を検索したいとします。
ところがCOLY1が2のデータはありませんので、COLX1の全行のみ返されることを期待するわけです。
期待どおりの結果をもどすSELECT分は以下のどちらでしょうか。
A.
SELECT X.COLX1,
Y.COLY1,
Y.COLY2
FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1
WHERE Y.COLY2 = 1;
B.
SELECT X.COLX1,
Y.COLY1,
Y.COLY2
FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1 AND Y.COLY2 = 1;
正当はBです。
<br />
SQL> SELECT X.COLX1,<br />
2 Y.COLY1,<br />
3 Y.COLY2<br />
4 FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1<br />
5 WHERE Y.COLY2 = 1;</p>
<p>レコードが選択されませんでした。</p>
<p>SQL> SELECT X.COLX1,<br />
2 Y.COLY1,<br />
3 Y.COLY2<br />
4 FROM TAB_X X LEFT JOIN TAB_Y Y ON Y.COLY1 = X.COLX1 AND Y.COLY2 = 1;</p>
<p> COLX1 COLY1 COLY2<br />
---------- ---------- ----------<br />
6<br />
4<br />
2<br />
上記Aの場合
「TAB_YにあるCOLY2=2の行だけに絞った後、外部結合をしろ」という解釈のようです。
上記Bの場合
「TAB_YにあるCOLY2=2の行を外部結合をしろ」という解釈のようです。
一見すると、どう解釈が違うのかわからないですが、JOIN句とWHERE句を理解し、目的に応じて使い分けましょう。
Oracle, データベース, 社員:モンク, 開発言語, 雑記
最近のコメント