OO4O应用
Oracle Object for OLE(OO4O)是一个进程内OLE自动化服务器,它实现了一组用于连接ORACLE数据服务器和执行查询及处理结果的对象和接口。OO4O是特别为与ORACLE数据库协同工作而开发并发展起来的,并且其实现并不依赖于使用ODBC API。这种非依赖性使得OO4O能提供访问ORACLE独有特性的优化的API。当然,如果你想使用OO4O,必须在你的机器里装上ORACLE的net8。
1.应用初步
先来看一下下面的小程序(VB)
Dim OracleDBSession As Object
Dim SecDB As Object
Dim Sec As Object
Dim SecRecord As Object
Set OracleDBSession = CreateObject("OracleInProcServer.XOraSession")
Set SecDB = OracleDBSession.opendatabase("net8_name", "user_name/password", &H0&)
Set Sec = SecDB.createdynaset("select * from user_tables", &H0&)
Set SecRecord = Sec.fields
Do While Not Sec.EOF
Debug.Print SecRecord(0)
Sec.movenext
Loop
要访问自动化服务器所提供的接口,就需要首先创建一个服务器的实例,在VB中,这是通过调用CreateOjbect函数来完成的。这个函数的参数是组件的ID。CreateObject返回一个接口,从此接口可以获得组件的其他接口。OraSession是调用CreateObject时由OO4O返回的接口。
在前面的例子,是通过下面的语句来实现这一点的:
Set OracleDBSession = CreateObject("OracleInProcServer.XOraSession")
OracleInProcServer.XoraSession是用于OO4O的版本独立的程序ID,它由ORACLE客户安装程序在Windows Registry中注册,它是Class ID(CLSID)的符号名,CLSID是标识OO4O组件的全局唯一标识符。OracleDBSession是保存OraSession接口的实例的变量。OraSession主要用来作为创建OraDatabases的工厂对象。
OraSession接口的OpenDatabase方法被用于记录到ORACLE数据库的连接。这个方法还返回到OraDatabase接口的引用。OraDatabase提供了用于执行SQL语句和PL/SQL块的方法。下面一句处理的是连接:
Set SecDB = OracleDBSession.opendatabase("net8_name", "user_name/password", &H0&)
其中net_name,user_name,password等几项替换成实际的名字。
2.执行SQL和PL/SQL程序块
Dynaset创建方法(CreateDynaset,CreatePlsqlset,CreateCustomDynaset和CreateCustomPlsqlset)与ExecuteSQL和CreateSQL一同组成了OraDatabase接口所提供的执行SQL语句和PL/SQL代码的所有方法。
OraDynaset接口代表着SQL SELECT查询或存储过程返回的游标变量的结果集。它本质上是一个可滚动的(向前或向后)客户端游标,用来浏览执行查询所获得的记录行。
CreateDynaset方法执行SQL SELECT,而CreatePlsqlDynaset执行PL/SQL存储过程。
ExecuteSQL和CreateSQL方法执行SQL语句和PL/SQL块。它们都能执行所给的更新语句,不同的是CreateSQL除执行语句外还返回一个指向OraSqlStmt接口的引用。通过Refresh方法可以在以后用该接口执行同一个查询。由于该查询已经被服务器解析,所以对同一查询的执行会更快一些,特别是在使用绑定参数时就更加如此。
3.使用参数
Set OracleDBSession = CreateObject("OracleInProcServer.XOraSession")
Set SecDB = OracleDBSession.opendatabase(txtNet8, txtUser & "/" & txtPassword, &H0&)
SecDB.Parameters.Add "P1", "A1", 2
SecDB.Parameters.Add "P2", "A1", 2
SecDB.Parameters.Add "P3", 0, 1
SecDB.Parameters.Add "P4", 0, 1
SQL="begin update_bv_securities( :P1, :P2, :P3,:P4) ;END;"
Set SecQuery = SecDB.createsql(SQL, &H0&)
上面是我实际使用中的一段例子,用到了一些参数,大家看一下就可以明白他的意思了,最后一句用的是PL/SQL块,把几个参数传给这个块,然后具体的任务可以交给这个存储过程来完成。
当第二次调用的时候,可以重新给这些参数赋值,然后执行Refresh方法,如下:
SecDB.Parameters("P1").Value = V1
SecDB.Parameters("P2").Value = V2
SecDB.Parameters("P3").Value = V3
SecDB.Parameters("P4").Value = V4
SecQuery.Refresh
在频繁执行的SQL语句中与OraSqlStmt一同使用参数是比重复使用ExecuteSQL语句更为优化的方法。当执行OraSqlStmt中的Refresh方法时,该语句不必再被数据库服务器解释。在应用程序服务器上将能显著地节省Oracle数据库服务器的处理时间。使用参数和占位符还可以允许将本地的数据库类型按本地的格式传送到服务器上,因此能够去除转换的步骤并且减少在网格上传输的字节数。
但是在我的实际使用中,发现这个方法在刷新频率太快时很容易出错,而且效率的提高也不明显。
-------------------------
昨天看着书抄了一个晚上,如果错太多请看书吧《Oracle 8i Web开发指南》