福岡 寿和 FUKUOKA, Toshikazu 富士通SSL
|
はじめに |
|---|
図1:Oracle8沿革
オラクル社のRDBMS製品が日本で使われだしたのは,たぶんOracle6が最初でしょう(図1).Oracle6は,Oracle7やOracle8でも採用されているさまざまな技術の元となる製品スペックを持っていました.しかし,スペックを実現する開発品質やハードウェア性能などの影響から,のちの製品に比べて必ずしも安定した製品ではありませんでした.そして今でも,このOracle6で苦労した人の中には,オラクル社の製品を使うのを嫌がる人がいます.しかし,過去の製品が安定していなかったからといって,新しい製品の評価もせずに判定を下してしまうのは早計すぎるでしょう.事実Oracle7やOracle8では,かなり安定したシステムを構築することができます.
|
Oracle8の製品系列 |
|---|
Oracle8の製品系列は一時期非常にわかりにくい状態にありました.それは,Oracle7時代の中心製品であったOracle7 Workgroup Serverが単に「Oracle8」という名前で発売されたからです.しかし,Oracle社もわかりにくいと思ったのか,現在の最新版では図2のような製品体系になっています.
図2:Oracle8製品体系
Oracle8は,Oracle7との互換性を保ちつつ,
などの機能が強化されています.さらに,Oracle8 Enterprise Edition(以下Oracle8 EE),Oracle8 Workgroup Server(以下Oracle8 WGS)そしてOracle8 Personal Edition(以下Oracle8 PE)では,基本的なアーキテクチャも同じになっています.そのため,テーブル定義などを同じにしておけば,Oracle8 PEに接続していたソフトウェアをOracle8 EEに接続して使うことができます.オラクル社には,この他にOracle LiteというRDBMS製品もありますが,図1の系譜から発生したものではなく,まったく別個に作り上げたものです.そのためOracle7やOracle8と互換性はなく,別物のRDBMSといってよいでしょう(表1).そのため,Oracle8シリーズとLiteは図3のような棲み分けになると思います.ここでの注目点は,Oracle8 PEの位置づけがPO7のようにスタンドアロンRDBMSではなく,プロトタイプ確認などの持ち運びできる開発環境用のRDBMSになっている点でしょう.
表1:Oracle8 PEとOracle Liteの相違点
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
図3:製品の位置づけ
|
なお,現在発売されているR8.0.xでは,Oracle8の新機能の目玉といわれているオブジェクト対応が不完全で,メソッドが参照のみ可能だったり,継承がサポートされていなかったりします.この2つの機能はオブジェクト対応の中心的な機能です.なぜなら,メソッドと継承とは次のような機能だからです.
メソッド
メソッドは,オブジェクト指向モデルの基本のひとつで,オブジェクト(テーブル属性やオペレーション情報)ごとに定義したデータへのアクセス方法です.メソッドがあることにより,オブジェクト指向モデルでは,データへの不正なアクセスを防止することができるのです.更新系こそメソッドの威力を発揮する局面なのですが,そこがサポートされていなければ,メソッドが実装されていないのと同じといえるでしょう.
継承
継承がサポートされていないと,既存のオブジェクトの定義を共有して,そこに新しい属性を追加して新しいオブジェクトを定義できるというオブジェクト指向の利点である拡張性が損なわれていることになります.
これらの機能は,Oracle8 R8.1.xでサポートされるといわれていますので,それまではOracle8は高速化されたOracle7といえるでしょう.しかし,このことはOracle7からOracle8に移行しようとしているときには,なんら問題になることではありません.逆に,オブジェクトを使わなくても高速化することができるわけですから,Oracle7で養ったノウハウが有効活用できるのです.
|
Visual Basicから使うには 〜ODBCによる接続〜 |
|---|
Visual Basicなどの言語とRDBMSを接続するソフトウェアを一般的にはミドルウェアと呼びます.ミドルウェアの役目は,TCP/IP,IPX,NetBEUIなどの通信プロトコルの違いをラッピングしたり,RDBMSよりのネイティブインターフェイスを言語から使いやすい形にラッピングしたりすることです.そのため,ミドルウェアのできが,システム全体の機能や安定性,性能,開発時間などを左右します.そして,オラクル社のRDBMS製品を使ったときのシステム全体の安定性を左右するのは,ODBCでいくべきか否かという点なのです.
ODBC経由で接続する上での問題点
Visual BasicからODBCを経由してOracle8に接続するには,図4のような経路を通ります.ここで一番問題になってくるのは,ODBCドライバマネージャが突然バージョンアップされる点でしょう.最近では,Office 97やWindows NT 4.0のSP3でファイルDSNなどに対応したODBCドライバマネージャに変更されました.
図4:ODBC経由の接続図![]() |
この変更により,それまで使われていたOracle用のODBCドライバは使うことができなくなり,新しいODBCドライバが必要になりました.つまり,つい昨日まで動作していたシステムがOffice 97を導入したら動かなくなったり,SP3を当ててOS自体の障害を解消したくてもインストール済みの業務アプリケーションが動作しなくなるので二の足を踏むしかなかったりするわけです.手持ちのODBCドライバのバージョンがV2.xならば,新しいODBCドライバマネージャに対応しています.これは,オラクル社が提供しているものにも,マイクロソフト社が提供しているものにもあてはまります.
さらに注意点として,新しいODBCドライバは,RSF7.3とRSF8.0にしか対応していない点です.このことは,クライアントコンポーネントがOracle7 R7.2以前では,Office 97やNT4.0 SP3をインストールできないということです.幸いにも,Net8やSQL*Net2.3からOracle7 R7.2以前のRDBMSに接続することができるので,クライアントコンポーネントのみのバージョンアップで難を逃れることが可能です.しかし年間保守契約を結んでいる場合,予定外の出費をすることになりますし,インストールなどの手間も生じてしまいます.
この事実だけでも,Oracle8への接続にODBCを使うべきではない十分な根拠になると思います.
[ご注意]
オラクル社によると、Oracle ODBCドライバ8.0.Xは、Oracle7.3.3以降のサーバーからの接続をサポートします。
Oracle7.2以前を使っていたときにODBCドライバマネージャの問題を回避するのは、SQL*Net2.3 Clientの導入を検討した方が得策かもしれません。
ODBCドライバ8.0.3のSQLFetch自体にバグがあるため、Net8 Client R8.0.3からOracle7 Server R7.3.Xに接続したとき、SELECT COUNT(*)の値とSELECTしてFETCHしたレコード件数に差が生じることがSQL*Plusを使って確認されていますが、これは8.0.4で修正されています。
また、オラクル社によると、Oracle ODBCドライバ8.0.Xは、Oracle7.3.3以降のサーバーからの接続をサポートします。Oracle7.2以前を使っていたときにODBCドライバマネージャの問題を回避するのは、SQL*Net2.3 Clientの導入を検討した方が得策かもしれません。
ODBCのバージョン別機能制限
SQL*NetとODBCドライバ,ODBCドライバマネージャのバージョンを一致させただけでは問題はなくなりません.ODBCドライバは,各社からさまざまな製品に添付されていますし,インターネットからもダウンロードできます.どこから入手したODBCドライバを使っているかによって,使える機能に差が生じます.今回は,Oracle8EE R8.0.3に対して
の4つの組み合わせについてRDO2.0での機能チェックを行なってみました.その結果は,表2と表3にあるようにかなりばらつきが目立ちます.ですから,ODBC経由でOracle8を使うときには,ODBCドライバの存在を常に意識して環境を構築しなければなりません.今回は確認していませんが,Oracle8の最新版であるR8.0.4用のOracle ODBC Driver 8.0.4はServerカーソルに対応しているそうなので,入手したらまた同様の確認をして,開発に使えるかを判断しなければなりません.なぜOracle7/8のときは,このようにバージョンにより動作する機能に違いが生じてしまうかといえば,RDO経由のODBC接続がMS SQL Serverへの接続を念頭に置いているからですし,もしかしたら,オラクル社がマイクロソフト社の都合で仕様が変更されるODBCに本気で対応しようとしていないからかもしれません.
表2:ODBCバージョン別機能チェック(Oracle7)
Oracle7.3.3/Sun Solaris2.5
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PK:プライマリキー | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
表3:ODBCバージョン別機能チェック(Oracle8)
Oracle8.0.3/NT4.0SV(SP3)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PK:プライマリキー | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Visual Basicから使うには 〜Oracle Objects for OLEによる接続〜 |
|---|
MS SQL ServerにRDO経由のODBC接続があるように,OracleデータベースにはOracle Objects for OLE(以下oo4o)があります.oo4oは,ActiveX DLLとして供給され,Visual BasicとCOMで接続します.そのインターフェイスは,DAO2.0とほぼ同じで,インターフェイスのみに注目すれば,RDOよりもDAOからの移行が行ないやすい仕様になっています.また,内部的にもODBCなどを使った多段階ミドルウェアではないので,ミドルウェア間のバージョンの整合なども気にする必要がありません.RDOやDAOでよく見かけるオブジェクト構造図(図5)にしてみるとoo4oの構造のシンプルさが分かると思います.ただし,さすがにデータアクセス関係のオブジェクトなので,プロパティやメソッドは多岐に渡ります(別表).しかし,基本的な使い方は簡単です.
図5:oo4oオブジェクト構造図
なおoo4oは,位置づけ的にはRDOやDAOに対応するものなので,oo4oで可能なことがODBC-APIを直接使えば可能だという論議は無意味です.そもそも,このような論議が起こる原因は,RDOやDAOがODBC-APIの持っている機能を上手くラッピングできていない点にあるからです.
Oracleと接続する
Oracleに接続するには
とします.
OpenDatabaseメソッドがエラーなしで終了すれば,Oracleデータベースと正常に接続が完了したことになります.oo4oのエラーはOn Error Gotoでトラップできるので,その飛び先で,OraSessionオブジェクトとOraDatabaseオブジェクトのLastServerErrメソッドの値をチェックして,ゼロ以外ならばLastServerErrTextメソッドからエラーの詳細を取得します(リスト1).
リスト1:エラー処理のサンプル
On Error Goto errClick:
:
exitClick:
On Error Resume Next
:
Exit Sub
errClick:
If oraSess.LastServerErr > 0 Then
strErr = oraSes.LastServerErrText
oraSes.LastServerErrReset
ElseIf oraDb.LastServerErr > 0 Then
strErr = oraDb.LastServerErrText
oraDb.LastServerErrReset
Else
strErr = Error$
End If
Resume exitClick:
End Sub
|
データを取得する
Oracleと接続できたら,CreateDynasetメソッドを使って,SQL SELECT文を実行します.実行が成功すれば,WHERE句で指定した条件に一致したレコードがダイナセットとして取得できます.また,SELECT句で指定したフィールドがOraFieldsコレクションとして生成されます(リスト2・図6).
リスト2:SQL SELECT文の実行(frmSQLView抜粋)
Private Sub subExecute()
Dim strSQL As String 'SQL文
Dim oraDs As OraDynaset 'Oracleダイナセット
Dim ilngCol As Long '列カウンタ
Dim lngCol As Long '列数
Dim aoraFld() As OraField 'フィールドオブジェクト変数
Dim strErrText As String
On Error GoTo errExec:
Me.MousePointer = vbHourglass 'マウスカーソルを変更する
grdResult.Clear
strSQL = txtSQL.Text 'SQL文を取得する
Set oraDs = poraDb.CreateDynaset(strSQL, 4&) …(1)
'列名表示
lngCol = oraDs.Fields.Count …(2)
ReDim aoraFld(lngCol - 1) …(3)
grdResult.Cols = lngCol
grdResult.Row = 0
For ilngCol = 0 To lngCol - 1
Set aoraFld(ilngCol) = oraDs.Fields(ilngCol) …(4)
grdResult.Col = ilngCol
grdResult.Text = aoraFld(ilngCol).Name …(5)
Next
'データ表示
grdResult.Rows = oraDs.RecordCount + 1 …(6)
Do While Not oraDs.EOF …(7)
grdResult.Row = grdResult.Row + 1
For ilngCol = 0 To lngCol - 1
grdResult.Col = ilngCol
grdResult.Text = aoraFld(ilngCol).Value …(8)
Next
oraDs.MoveNext …(9)
Loop
exitExec:
'出口処理
On Error Resume Next
Set oraDs = Nothing …(10)
Me.MousePointer = vbDefault
Exit Sub
errExec:
'エラー処理
strErrText = ""
If pobjSess.LastServerErr = 0 Then
If poraDb.LastServerErr = 0 Then
strErrText = Error$
Else
strErrText = poraDb.LastServerErrText
poraDb.LastServerErrReset
End If
Else
strErrText = pobjSess.LastServerErrText
pobjSess.LastServerErrReset
End If
If strErrText <> "" Then
MsgBox "frmSQLView/exitExec:" & strErrText, vbOKOnly + vbCritical, App.EXEName
End If
Resume exitExec:
Resume Next
End Sub
|
バインド変数(ホスト変数)を使う
Oracleデータベースでは,SGAと呼ばれるメモリ領域にSQL文の解析結果や実行計画と呼ばれる検索方法を格納します(図7).そして,この格納してある情報(図8)を使って,空白の数や大文字小文字まで同一のSQL文を再び実行するときに解析ステップや実行計画ステップをスキップして,実行速度を向上させます.
図7:Oracle8構造図

このOracleデータベースの機能を有効利用するためには,SQL文のコーディング規約を決めておきます.たとえば,
例) SELECT Empno, Ename
FROM Emp
WHERE Empno > 3400
ORDER BY EmpNo
|
などが考えられます.
Oracleデータベースでは,このSQL文の再利用をさらに有効利用するために,WHERE節の条件値にホスト変数と呼ばれる変数を使うことができます.このホスト変数をVisual Basicから使えるようにしたのが,oo4oのバインド変数になります(リスト3).
リスト3:バインド変数の例
objDb.Parameters.Add "LIMIT", 0, 1 …(1)
objDb.Parameters("LIMIT").Value = 1000 …(2)
strSQL = "SELECT *" & " FROM VbFaqPCDN" & " WHERE FAQID<:LIMIT" …(3)
Set oraDs=oraDb.CreateDynaset(strSQL,0&) …(4)
:
objDb.Parameters.Remove "LIMIT" …(5)
|
バインド変数は,いわゆるセッション単位のグローバル変数になりますので,複数のSQLで同じ変数名を使っていれば,値を変更しない限り同じ値としてSQL文が処理されます.なお,このバインド変数はRDOやDAOからは完全には使うことができません.RDOのパラメタクエリーを使えば,条件値が変数になりますが,その変数名を指定する方法がありませんでした(図9).そのため,oo4oのバインド変数のように明示的に各SQL文で同一のホスト変数を記述することはできません.
図9:RDO使用時の共有プールの内容
バインド配列(PL/SQL表)を使う
V$SQLAREAビューを検索したときのように大量のデータをクライアント側に表示したいとき,レスポンスが問題になるときがあります.時にLANが混雑していたり,ISDNなどの低速回線を使ってWAN接続しているときなどは,ダイナセットで取得したレコード件数に表示レスポンスが大きく左右されると思います.その解決方法のひとつがPL/SQL表(oo4oではバインド配列と呼ぶ)を使う方法です(リスト4・図10).
リスト4:バインド配列の例(frmArray抜粋)
'ストアードパッケージ
poraDb.Parameters.Add "intCnt", 0, 2
poraDb.Parameters.AddTable "astrItem", 2, 1, 1000, 20 …(1)
Set objSpread = poraDb.Parameters("astrItem") …(2)
strSQL = "BEGIN pkgTEST.subTEST1(:astrItem,:intCnt); END;" …(3)
poraDb.DbExecuteSQL (strSQL) …(4)
'データ表示
grdResult.Rows = poraDb.Parameters("intCnt").Value \ 8 …(5)
grdResult.Row = 0
For ilngRow = 1 To grdResult.Rows - 1
grdResult.Row = grdResult.Row + 1
For ilngCol = 0 To grdResult.Cols - 1
grdResult.Col = ilngCol
lngPos = ilngCol + (ilngRow - 1) * 8 + 1 …(6)
grdResult.Text = poraDb.Parameters("astrItem").get_Value(lngPos) …(7)
Next
Next
exitClick:
On Error Resume Next
poraDb.Parameters.Remove "intCnt"
poraDb.Parameters.Remove "astrItem" …(8)
Set objSpread = Nothing …(9)
Exit Sub
|
PL/SQL表でどのくらいのサイズの配列が受け渡せるかは,Oracle Objects for OLE側の制限が上限となります.ServerTypeごとに設定可能なArraySize(配列の要素数)の上限があります.また,ServerTypeをVARCHAR2などの文字列長にしたときにはElementSize×Arraysizeが32KB以内である必要があります.
ストアドパッケージとは
RDBMS側に構造化言語を搭載し,ビジネスロジックをRDBMS上で動作させられるようにしたものを一般的にはストアドプロシージャと呼びます.Oracleでは,もう少し細かく分類して
の3つにわかれます.とくに分類しないときは,ストアド*と記載することもあります.
ストアドファンクションとストアドプロシージャは,Visual BasicのFunctionとSubと同じような関係です.ストアドパッケージは,Visual Basicのクラスモジュールのようなものです.
|
ストアド*を効率よく作成する |
|---|
リスト4で実行するストアドパッケージを始め,ストアド*を作成するときには,2つの障壁があります.
この2つの障壁を乗り越える方法としては,英語圏の開発者は,Oracle Developer/2000のProcedure BuilderのPL/SQLインタプリタを使って,T-SQLデバッガのようにローカル変数の値を調べながら1行ずつステップ実行することができます.しかし,残念ながら日本語版のDeveloer/2000には未だProcedure Builderは含まれていません.もし,他の日本語化したツール群に影響を与えないのならば,英語版のままでよいのでProcedure BuilderをDeveloper/2000に含めて欲しいと思います.
便利なProcedure Builderが使えない状況で,効率よくストアド*を作成してゆくためには,DBMS_OUTPUTパッケージを活用して,デバッグコードをストアド*の中に埋め込んでゆきます.そして,モジュラープログラミングを心がけます.モジュラープログラミングは,PL/SQLだけではなく,Visual Basicなどの他の言語でも有効な考え方です.プログラムをいくつかのモジュール(部分)に分割して,モジュールごとに独立した機能を実装してゆきます.このように分割して作成したプログラムは,小さい部分から順番に開発・テストを行なうことにより障害部分が特定しやすくなります.さらに,PL/SQLは慣れてくるとバグが混入しにくい言語です.これは,SQLという非手続き型言語がベースとなっているために,プログラム時にSQL*Plusなどを使って,選択するレコードや実行するSQL文を確認できるからです.
Procedure Builderは入手できなくても,最近のOracleにはOracle Enterprise ManagerにSchema Managerが含まれているので,ストアド*のコンパイルエラーの除去はかなり楽になりました.しかしOracle Enterprise Managerの一連のプログラムが,Javaで記述されていることから,WindowsのJava仮想マシンとの相性が悪くて正常に動作しないときがあります.私が使っているマシンでもきちんと動作するマシンと,一度フォーカスを外して再びアクティブにすると保護例外で異常修了するマシンの2種類が存在します.安定したPL/SQLエディタを持っていたかったので,Visual Basicで自作してみたいと思います.
リスト5:ストアド*の情報取得例1(frmPLSQLExp抜粋)
Private Sub subObjectSet()
Dim nodObject As Node
Dim oraDs As OraDynaset
Dim strSQL As String
'プロシージャ名を取得
strSQL = "SELECT OBJECT_NAME" & "FROM USER_OBJECTS" & "WHERE OBJECT_TYPE='PROCEDURE'"
Set oraDs = poraDb.CreateDynaset(strSQL, 12&)
Do While Not oraDs.EOF
Set nodObject = tvTreeView.Nodes.Add("Proc", tvwChild, "Proc" & oraDs(0).Value, oraDs(0).Value)
oraDs.MoveNext
Loop
Set oraDs = Nothing
'関数名を取得
strSQL = "SELECT OBJECT_NAME" & "FROM USER_OBJECTS" & "WHERE OBJECT_TYPE='FUNCTION'"
Set oraDs = poraDb.CreateDynaset(strSQL, 12&)
Do While Not oraDs.EOF
Set nodObject = tvTreeView.Nodes.Add("Func", tvwChild, "Func" & oraDs(0).Value, oraDs(0).Value)
oraDs.MoveNext
Loop
Set oraDs = Nothing
'パッケージ名を取得
strSQL = "SELECT OBJECT_NAME" & "FROM USER_OBJECTS" & "WHERE OBJECT_TYPE='PACKAGE'"
Set oraDs = poraDb.CreateDynaset(strSQL, 12&)
Do While Not oraDs.EOF
Set nodObject = tvTreeView.Nodes.Add("PK_H", tvwChild, "PK_H" & oraDs(0).Value, oraDs(0).Value)
oraDs.MoveNext
Loop
Set oraDs = Nothing
'パッケージ本体名を取得
strSQL = "SELECT OBJECT_NAME" & "FROM USER_OBJECTS" & "WHERE OBJECT_TYPE='PACKAGE BODY'"
Set oraDs = poraDb.CreateDynaset(strSQL, 12&)
Do While Not oraDs.EOF
Set nodObject = tvTreeView.Nodes.Add("PK_B", tvwChild, "PK_B" & oraDs(0).Value, oraDs(0).Value)
oraDs.MoveNext
Loop
Set oraDs = Nothing
End Sub
|
リスト6:ストアド*のソースコード取得(frmPLSQLExp抜粋)
Private Sub tvTreeView_NodeClick(ByVal Node As ComctlLib.Node)
Dim strSQL As String
Dim oraDs As OraDynaset
txtSQL = ""
strSQL = "SELECT * FROM User_Source" & "WHERE NAME='" & Node.Text & "'"
Set oraDs = poraDb.CreateDynaset(strSQL, 12&)
Do While Not oraDs.EOF
txtSQL = txtSQL & oraDs("TEXT").Value & vbCrLf
oraDs.MoveNext
Loop
Set oraDs = Nothing
txtSQL.Enabled = True
End Sub
|
リスト7:ストアド*のエラー情報取得(frmPLSQLExp抜粋)
Private Sub tvTreeView_NodeClick(ByVal Node As ComctlLib.Node)
Dim strSQL As String
Dim oraDs As OraDynaset
lstResult.Clear
strSQL = "SELECT * FROM User_Errors" & "WHERE NAME='" & Node.Text & "'"
Set oraDs = poraDb.CreateDynaset(strSQL, 12&)
Do While Not oraDs.EOF
lstResult.AddItem oraDs("LINE").Value & vbTab & oraDs("POSITION").Value & vbTab & oraDs("TEXT").Value
oraDs.MoveNext
Loop
Set oraDs = Nothing
lstResult.Enabled = True
End Sub
|

|
Visual Basicから使うには 〜Oracleデータコントロール〜 |
|---|
当初からoo4oには,データコントロールが添付される予定でした.しかし最初に添付されたのは,Personal Oracle R7.3 for NT/95からでした.しょせんデータコントロールなのでシビアな業務には使えませんが,適材適所に活用すれば,開発期間の短縮につながります(リスト8・図14).
oo4oデータコントロール独自のプロパティ,メソッド,イベントを表4にまとめました.このなかでも重要なのがRecordsetプロパティです.このプロパティを経由することにより,oo4oデータコントロールに対して,ダイナセットに対するメソッドなどがそのまま使うことができます.この方法によりかなり柔軟なプログラムになります.たとえば,oo4oデータコントロールを非表示にして,コマンドボタンで現在行の移動を行なうなどのGUI向上の常套手段が使えるわけです.
リスト8:oo4oデータコントロールの使用例(frmDataGrid抜粋)
VERSION 5.00
Object = _
"{00028C01-0000-0000-0000-000000000046}#1.0#0"; "DBGRID32.OCX"
Object = _
"{92096210-97DF-11CF-9F27-02608C4BF3B5}#1.0#0"; "ORADC.OCX"
Begin VB.Form frmDataGrid
ClientHeight = 4590
ClientLeft = 4875
ClientTop = 2550
ClientWidth = 6150
LinkTopic = "Form1"
Picture = "DataGrid.frx":0000
ScaleHeight = 4590
ScaleMode = 0 'ユーザー
ScaleWidth = 6150
Begin ORADCLibCtl.ORADC oraDataCtl
Height = 255
Left = 480
TabIndex = 6
TabStop = 0 'False
Top = 4080
Visible = 0 'False
Width = 735
_Version = 65536
_ExtentX = 1296
_ExtentY = 450
_StockProps = 207
BeginProperty Font _
{0BE35203-8F91-11CE-9DE3-00AA004BB851}
Name = "MS Pゴシック"
Size = 9.01
Charset = 128
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
DatabaseName = ""
Connect = ""
RecordSource = ""
End
Begin MSDBGrid.DBGrid grdDataGrid
Align = 1 '上揃え
Bindings = "DataGrid.frx":0342
Height = 3648
Left = 0
OleObjectBlob = "DataGrid.frx":0415
TabIndex = 0
Top = 336
Width = 6144
End
End
Attribute VB_Name = "frmDataGrid"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Form_Load()
oraDataCtl.DatabaseName = "semi"
oraDataCtl.Connect = "scott/tiger"
oraDataCtl.RecordSource = "SELECT * FROM Emp"
oraDataCtl.Options = 0
oraDataCtl.Refresh
End Sub
|
表5:oo4oデータコントロールのプロパティ・メソッド・イベント
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Visual Basicで Oracleの状態を監視する |
|---|
Oracleのチューニングでは,SGA内の
のサイズを適切に設定することが重要です.しかし,これらの値は,業務形態やクライアント数によっても変化するものなので,実運用の段階で実測して最終調整を行なう必要があります.Oracleでは,実測に必要なビューが用意されているので,そのビューを使い,Visual Basicで自動測定してグラフ化することで,Oracleの健康状態を監視できます.今回は,この3つの中でもとくに重要な共有プールの状態を監視します.
共有プールの監視項目(リスト9)
リスト9:ヒット率測定用SQL文
SELECT (1-(SUM(Reloads)/
(SUM(Pins)+SUM(Reloads))))*100 AS LibHitRate
FROM V$LIBRARYCACHE
SELECT (1-(SUM(Getmisses)/
(SUM(Gets)+SUM(Getmisses))))*100 AS DicHitRate
FROM V$ROWCACHE
|
測定値をそのまま表示してもいいのですが,なかなか使う機会がないMSChartを使ってグラフ表示してみます(リスト10・図15).
リスト10:ヒット率測定サンプル(frmPerform抜粋)
Private Sub tmrPerform_Timer()
Dim iintLoop As Integer '測定項目数
Dim oraDs As OraDynaset '測定結果
tmrPerform.Enabled = False
Me.MousePointer = vbHourglass
Me.Refresh
grhPerform.RowCount = grhPerform.RowCount + 1 …(1)
grhPerform.Row = grhPerform.RowCount …(2)
Set oraDs = poraDb.CreateDynaset(mastrSQL(0), 12&) …(3)
grhPerform.Column = 1 …(4)
grhPerform.Data = oraDs.Fields(0).Value …(5)
Set oraDs = Nothing …(6)
Set oraDs = poraDb.CreateDynaset(mastrSQL(1), 12&)
grhPerform.Column = 2
grhPerform.Data = oraDs.Fields(0).Value
Set oraDs = Nothing
exitTimer:
On Error Resume Next
Set oraDs = Nothing
Me.MousePointer = vbDefault
tmrPerform.Enabled = True
Exit Sub
End Sub
|
|
最後に 〜Oracle8のこれから〜 |
|---|
オラクル社のRDBMS製品では,R8.0.3のように3組の数字でリリース番号を表しています.図1にあるように最初の番号の変更は,4〜5年に一度の行なわれています.この番号が変更されるときは,かなりの機能追加が行なわれるときで,次は2002年ころにOracle9となることが予想されます.2番目の番号は,Oracle7になってからは,1年に一度の割合で変更されていて,リリースノートに書かれているような機能制限が取り払われたり,速度が向上したりすることが多いようです.つまり,今年はR8.1.xが発売されるかもしれません.でも,どうして1年に一度なのでしょうか.これは,年間保守契約が1年単位であったり,Oracle Open Worldが毎年開催されていることに起因しているのかもしれません.今年のOracle Open Worldは,12月16日〜17日に開催されますから,来年早々にはR8.1.xが手に入るかもしれません.R8.1.xが発売されれば,Oracle8の目玉であるオブジェクト対応が拡充されて,機能制限中のいろいろな機能が使えるようになることが予想されます.また,同時にOracle Objects for OLEもオブジェクト対応になり,ODBCとの機能差は広がると思います.使いやすい形でoo4oが拡張されることを期待しています.なぜなら,対抗馬であるADOネイティブ,ADO/ODBC,RDO/ODBCがオブジェクト対応になるには,SQL Serverオブジェクト対応版(SQL Server8.0?)が発売されるまで待つ必要があると思われるからです.
サンプルプログラムのダウンロード --- visual.lzh(150KB)