この章では、一般的に使用される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