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類型的成員變量。