この章では、一般的に使用されるOO4Oオートメーション・オブジェクトを紹介します。
内容は次のとおりです。
OO4Oにおけるオブジェクト操作上の階層は、「持つもの」と「属するもの」との関連を示します。
図8-1に、この操作上の階層を示します。
前述のオートメーション・オブジェクト・ダイアグラムは、この階層を示しています。
OO4Oオートメーション・サーバーのインスタンスが作成されると、OraSessionオブジェクトが戻されます。主としてOracleデータベースへの接続を確立するためのインタフェースを提供します。また、これには、作成したOraDatabaseオブジェクト内の接続についての開始、コミットおよび取消しトランザクションに対するメソッドが含まれています。次のVisual Basicの例では、OO4Oオートメーション・サーバーのインスタンスを作成します。
'OracleInProcServer.XOraSession is the symbolic name for a
'globally unique component identifier.
Set OO4OSession = CreateObject("OracleInProcServer.XOraSession")
OraServerオブジェクトは、Oracle Databaseインスタンスへの物理的な接続を表します。これは、OraDatabaseオブジェクトを表す、ユーザー・セッション作成用のOpenDatabaseメソッドを提供します。これにより、「接続多重化」が可能になります。
OraDatabaseオブジェクトは、Oracleデータベース・インスタンスへのユーザー接続を表し、SQL文とPL/SQLコードを実行するためのメソッドを提供します。OraDatabaseオブジェクトは、OraSessionまたはOraServerオブジェクトのOpenDatabaseメソッドによって戻されます。
次に、OraSessionのOpenDatabaseメソッドの使用例を示します。このメソッドで作成したOraDatabaseオブジェクトには、Oracleデータベースへの個別の物理接続が含まれています。
'Establish a connection to the ExampleDb database Set hrDBSession = OO4OSession.OpenDatabase("ExampleDb", "scott/tiger", 0&)
次の例では、Oracleデータベースへの物理的なネットワークの接続を複数のユーザー・セッションで共有する方法を示します。複数のユーザー・セッションが共有する単一の接続を使用すると、Oracle Databaseのリソース使用量が削減され、拡張性が向上します。
'Create a server connection
Set hrDBServer = CreateObject("OracleInProcServer.XOraServer")
Set hrDBServer = oo4o.Open("ExampleDb")
Set userSession1 = hrDBServer.OpenDatabase("scott/tiger", 0)
'execute queries ...
Set userSession2= hrDBServer.OpenDatabase("scott/tiger", 0)
'execute queries ...
OraDynasetオブジェクトは、SQL SELECT問合せの結果セットまたはストアド・プロシージャやファンクションから戻ったPL/SQLカーソル変数を表します。このオブジェクトは本来、クライアント側でスクロールおよび更新できるカーソルで、実行した問合せで生成された行セットを参照できます。これは、OraDatabaseインタフェースのCreateDynasetメソッドまたはCreateCustomDynasetメソッドで作成されます。
次のVisual Basicの例では、問合せを実行し、結果セット全体をループして戻った列の値を表示します。
Set employees = OraDatabase.CreateDynaset("select empno, ename from emp", 0&)
'While there are more rows
while not employees.EOF
'Display the values of empno and ename column of the current row
msgbox employees("empno") & employees("ename")
'Move to the next row
employees.MoveNext
wend
OraFieldオブジェクトは、OraDynasetオブジェクトの列を抽象化したものです。これには、ダイナセット内の現在の行の列を示す値とメタデータが含まれています。前のOraDynasetオブジェクトの例では、この追加コードを使用して、empnoに対するFieldインタフェースを取得できます。
set empno = employees.Fields("empno")
msgbox "Employee Number: " & empno.Value
OraFieldsは、現在の行にあるすべての列を示すコレクション・オブジェクトです。
OraFieldオブジェクトは、Oracle Databaseがサポートするすべてのデータ型のインスタンスを示すことができます。これには、VARCHAR2、NUMBER、INTおよびFLOATなどの基本的な型に加え、Oracle8iで導入されたすべてのオブジェクト・リレーショナル型も含まれます。
OraParametersオブジェクトは、OraParameterオブジェクトに対するコレクション・コンテナです。OraParameterオブジェクトは、実行時にSQL文またはPL/SQLブロックで使用するプレースホルダに対してデータ値を提供するために使用されます。入力値を提供するため、さらにデータベースからの戻り値を包含するために使用することもできます。次のサンプルでは、2つのパラメータ・オブジェクトを作成して更新問合せで使用します。
OraDatabase.Parameters.Add "SALARY", 4000, ORAPARM_INPUT
OraDatabase.Parameters.Add "ENAME", "JONES", ORAPARM_INPUT
Set updateStmt = OraDatabase.CreateSQL("update emp set sal = :SALARY" & _
"where ename = :ENAME ")
OraParameterオブジェクトには、オブジェクト・リレーショナル・データ型も含めて、Oracle9iがサポートする全データ型の値を含めることができます。これらのデータ型は、PL/SQLのストアド・プロシージャとファンクションに対する入力または出力引数としてパスできます。OraParameterオブジェクトの値は、OraDynasetオブジェクトのフォーム内のPL/SQLカーソルを示すこともできます。
OraParamArrayオブジェクトは、値の配列をバインドおよびフェッチするメカニズムを提供します。通常は、挿入と更新を一括して実行するために使用します。
'Create a table
OraDatabase.ExecuteSQL ("create table part_nos(partno number," & _
"description char(50), primary key(partno))")
'Create two parameter arrays of size 10 to hold values for
'part numbers (size 22 bytes), and their description (50 bytes long).
OraDatabase.Parameters.AddTable "PARTNO", ORAPARM_INPUT, ORATYPE_NUMBER, 10, 22
OraDatabase.Parameters.AddTable "DESCRIPTION", ORAPARM_INPUT, _
ORATYPE_CHAR, 10, 50
'Initialize the arrays
For I = 0 To 10
OraDatabase.Parameters("PARTNO").put_Value = I, I
OraDatabase.Parameters("DESCRIPTION ") = "some description", I
Next I
'Execute the query
Set OraSqlStmt = OraDatabase.CreateSql("insert into " & _
"part_nos(partno, description) values(:PARTNO,:DESCRIPTION)", 0&)
OraSQLStmtオブジェクトは、通常、SELECT以外のSQL問合せやPL/SQLブロックを実行するために使用されます。次のコード例では、更新問合せを実行し、反映された行数を表示します。
Set updateStmt = OraDatabase.CreateSQL("update emp set sal = 3000" & _
"where ename = 'JONES' ")
MsgBox updateStmt.RecordCount
後でOraSQLStmtオブジェクト(updateStmt)を使用することで、:SALARYプレースホルダに別の値を使用して前の問合せを実行できます。次に、例を示します。
OraDatabase.Parameters("SALARY").value = 200000
updateStmt.Parameters("ENAME").value = "KING"
updateStmt.Refresh