Oracle Database/Oracle C++ Call Interface(OCCI)
OCCI是一套用於訪問Oracle資料庫的C++ API。設計目的是提供一個小的良好封裝的類與界面的集合,易於使用。大量特性服務於關係訪問(類似於JDBC)、對象關係訪問與伸縮性。完全支持SQL/PLSQL執行。支持所有Oracle數據類型與大對象(LOB)類型。支持資料庫的元數據訪問。
API需要包含的頭文件與庫文件
編輯頭文件occi.h(以及隱式使用occiCommon.h,occiControl.h,occiData.h,occiObjects.h)。庫文件oraocci12.lib或oraocci12d.lib,必須對應Release與Debug版本。使用的dll包括oci.dll、oraocci12d.dll、oraociei12.dll、oraons.dll。
以上均包含在Oracle Instant Client中。
Environment類
編輯Environment實例指出:
- 應用程式模式:OBJECT/THREADED/MUTEXED
- 對象cache設置
- OCCI類的內存堆
可以創建「連接池」: createConnectionPoll 示例:
Environment *env;
env = Environment::createEnvironment(Environment::DEFAULT);
//查看客户端版本号:
int majorVersion, minorVersion,updateNum,patchNum,portUpdateNum;
Environment::getClientVersion(majorVersion, minorVersion, updateNum, patchNum, portUpdateNum);
數據類
編輯OCCI定義了一些數據類,如Number,Date,IntervalYM,Timestamp,Bytes,以方便對Oracle數據類型的支持。為支持大對象,定義了類Bfile,Clob,Blob。
PObject類
編輯PObject類包含以下方法:
- fush();
- Connection *getConnection();從一個實例化的永久對象中返回連接。
- isLocked();判斷永久對象是否被鎖(TRUE或FALSE)。
- isNull();判斷永久對象是否為空(TRUE或FALSE)。
- Lock(PObject::LockOption lock_option);在資料庫中鎖住一個對象,其中lock_option取值為OCCI_LOCK_WAIT、OCCI_LOCK_NOWAIT。
- markDelete();刪除資料庫中的永久對象。
- markModified();修改永久對象。
- PObject &operator(constPObject &obj);賦值(對象)。
- operator delete(void*obj,size_t size);刪除對象,但不能刪除資料庫中的對象。
- *operator new(size_t size);創建臨時對象。
- *operator new(size_t size,constConnection *x,const string &tablename,const char *type_name);創建永久對象。
- pin();
- setNull();設置對象為空。
- unmark();不標記永久對象為刪除或修改。
- unpin(UnpinOption mode);其中,mode的取值為OCCI_PINCOUNT_RESET、OCCI_PINCOUNT_DECR。
SQLException類
編輯SQLException類提供錯誤代碼及其錯誤信息,包含以下方法: getErrorCode();返回資料庫中的錯誤編碼。 getMessage();返回錯誤信息,沒有則為空。
Connection類
編輯- Commit();提交事務。
- createStatement
- flushCache();
- rollback();事務的回滾。
- terminateStatement
示例:
Connection *conn;
//char connstr[256]=R"(//Server_IP_Addr:1521/Database_Name)";
conn = env->createConnection(UserName, Password, connstr);
//查看服务器版本:
std::string serverVer = conn->getServerVersion();
ConnectionPool類
編輯- ConnectionPoll類提供了C++程序與指定資料庫間的連接池,包含以下方法:
- createConnection(const string&username,const string &password);創建一個連接。
- getBusyConnections();返回連接池中被占用的連接數量。
- getMaxConnections();返回連接池的最大連接數。
- getMinConnections();返回連接池的最小連接數。
- getOpenConnections();返回連接池中已經被打開的連接數。
- getPollName();返回連接池的名稱。
- getTimeOut();返回連接池的超時時間。
- setErrorOnBusy();設置異常,當連接池處於繁忙或達到最大連接數後。
- serPoolSize(unsigned intminConn,unsigned int maxConn,unsigned int incrConn);設置連接池的大小,其中參數minConn是最小連接數,maxConn是最大連接數,incrConn是遞增連接數。
- setTimeOut();設置超時時間。
- terminateConnection(Connection *conn);斷開連接。
Statement類
編輯Statement對象
- execute:執行任何SQL語句,返回狀態
- executeUpdate:返回Insert/Update/Delete的行數
- executeQuery:返回ResultSet
- executeArrayUpdate(unsigned intarrayLength);同時修改多條記錄,前面必須使用了setDataBuffer()方法設置一個數量或設置了一個流(stream)。
可以使用形如:1、:2這樣的占位符,用setXXX成員函數綁定參數。用getXXX成員函數返回參數。isNull判斷第X個值是否為空。isTruncated判斷第X個值是否被截取。
對DML(INSERT/UPDATE/DELETE),可以一次操作多行:
- SetMaxIterations:設置最多的行數
- SetMaxParamSize:設置某個字符串參數的長度上限
- addIteration:增加一行數據的綁定
執行PL/SQL的函數/過程/block時,用setXXX綁定參數,setNull某參數設置為空。用registerOutParam指出輸出參數並用setMaxParamSize指出尺寸,用getXXX獲取輸出參數的值。執行execute。
批量處理非查詢語句時,首先必須使用stmt->setMaxIterations(unsigned int maxnum)方法設置最大的批處理數;然後使用setMaxParamSize(unsignedint paramindex,int paramsize)方法設置對應參數的大小,對於有固定長度的參數可以不必重新設置,如int,double;然後綁定參數使用setXXX()方法,每循環一次必須使用stmt->addIteration()方法,再進行下一次循環,直到最後一次。
其它函數:
- addIteration();增加一個循環。
- closeResultSet(ResultSet *rs);關閉一個結果集。
- closeStream(Stream *stream);關閉一個已定義的流。
- getAutoCommit();返回是否事務自動提交。
- getResultSet();得到一個結果集(ResultSet)。
- getSQL();返回當前的SQL語句。
- getUpdateCount();返回被更新的數量。
- setAutoCommit(bool autocommit);設置事務是否自動提交。
- setSQL(const string &sql);設置一個SQL語句。
- Status();返回當前的狀態。
ResultSet類
編輯ResultSet對象:
屬性Status:取值為DATA_AVAILABLE、STREAM_DATA_AVAILABLE、END_OF_FETCH
對所有類型獲取/設置值的統一方法:
- setXXX:Statement對象
- getXXX:Statement對象與ResultSet對象
也可以使用流方式綁定/獲取數據:
- setCharacterStreamMode:結果集中設定流模式
- getStream:結果集的當前行建立一個流對象
- readBuffer: 流對象拷貝數據到緩衝區
用戶數據緩衝區可以極小化數據拷貝。
- -數組DML:Statement:executeArrayUpdate(int nRows), Statement::setDataBuffer
- -數組獲取:ResultSet::next(int nRows), ResultSet::setDataBuffer
其他函數:
- cancel();取消結果集。
- closeStream(Stream *stream);關閉一個流。
- getMaxColumnSize(unsigned intcolIndex);返回某列包含的數據量。
- getRowid(unsigned intcolIndex);返回rowid值。
- isNull(unsigned int colIndex);判斷值是否為空。
- isTruncated(unsigned intcolIndex);判斷值是否被刪
對象-關係資料庫特性
編輯支持Oracle對象-關係資料庫特性。包括對象表(Object table)或對象類型列(object type columns)。OTT可支持生成相應的C++類的源文件。
支持Oracle的VARRAY與Nested Table數據類型
MetaData
編輯通過MetaData對象,對資料庫對象(表、過程、類型等)與查詢結果的MetaData訪問。
Oracle Advanced Queue
編輯國際化
編輯國際化支持方面,Environment::createEnvironment(string charset, string ncharset);client characterset用於CHAR類型。National characterset用於NCHAR類型。
查詢資料庫CHAR類型與NCHAR類型的具體定義:
SELECT
*
FROM
nls_database_parameters
WHERE
PARAMETER IN(
'NLS_CHARACTERSET',
'NLS_NCHAR_CHARACTERSET'
);
例如,
Environment::createEnvironment("ZHS16GBK", "OCCIUTF16");//"AL16UTF16"
應通過setDatabaseNCHARParam()先把Statement實例的某個參數設為NCHAR/NVARCHAR類型,然後setUString()綁定參數。
UString數據類型表示UCS-2編碼字符串。所有成員函數都有UString的重載版本。在Windows平台,UString等價於std::wstring數據類型。對於Unicode應用程式,OTT產生的CHAR/VARCHAR屬性為UString類型的成員變量。