OO40編程教程
2024-07-21 02:35:59
供稿:網友
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開發指南》