Oracle給各種編程語言都提供了編程接口,其中C++的編程模塊就是OCCI,通過OCCI我們可以很方便的訪問數據的信息,讀取數據庫的屬性,下面我們看看怎么使用OCCI編程。本文使用Centos 7.0為例,Oracle的版本是12.2
一,環境準備
1.1 默認的Oracle安裝中沒有提供OCCI接口的包,需要我們在Oracle官網下載,地址是:https://www.oracle.com/technetwork/topics/linuxsoft-082809.html
需要安裝下面幾個內容:
oracle-instantclient12.2-devel-12.2.0.1.0-1.i386.rpm(606,868 bytes) (cksum - 1259587459)
oracle-instantclient12.2-basic-12.2.0.1.0-1.i386.rpm(49,071,616 bytes) (cksum - 2998080493)
oracle-instantclient12.2-odbc-12.2.0.1.0-2.i386.rpm(223,276 bytes) (cksum - 1211395846)
oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.i386.rpm(689,504 bytes) (cksum - 3705787612)
直接運行 #rpm –i 包名.rpm 安裝即可。
1.2 安裝完成后需要設置環境變量,在~/.bashrc中或者/etc/profile中添加下面的命令設置環境變量。
exportORACLE_HOME=/usr/lib/oracle/12.2/client64
exportTNS_ADMIN=${ORACLE_HOME}/network/admin
exportNLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'
# simplifiedchinese_china.UTF8'
exportLD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${ORACLE_HOME}/lib
exportPATH=${ORACLE_HOME}/bin:$PATH
exportHISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
添加完成后記得source~/.bashrc 或者source /etc/profile,使得環境變量立即生效。
二,OCCI編程
Oracle C++調用接口(OCCI)是一個易于使用且功能強大的C ++用于訪問Oracle對象關系數據庫的接口。 OCCI對象interface是一種無縫且優化的訪問和操作機制來自數據庫的持久數據作為C ++對象。使用Objects接口和導航訪問范例,有一個單一的對象模型應用程序和數據庫。開發人員不需要實現任何用于將數據庫對象映射到C ++類對象的附加代碼。這是由OCCI通過編譯時生成的代碼和運行時支持完成。結合Oracle的對象關系特性,OCCI和C ++,復雜和可以開發強大的面向對象的數據庫應用程序。
OCCI為訪問和操作在數據庫中的對象提供了2種不同的模型。在導航訪問模型中(使用Fetch操作),引用數據庫中的對象到客戶端,如果這些引用被取消或者關閉時,那么就直接引用客戶端的對象緩存中。使用引用(作為屬性)和對對象之間的關系進行編程,應用程序可以引用和取消引用中的關聯對象關系。在使用導航訪問模型的應用程序中數據庫變得“不可見”,應用程序似乎是“純粹的”C ++程序。
在OCCI的導航訪問模型中,客戶端對象緩存在透明的管理數據庫對象(表示為C ++對象)中,應用程序可以立即使用/取消引用,創建/更新/刪除對象。如果一個引用m被應用程序取消,OCCI會搜索緩存中引用的對象,如果存在則返回緩存的對象;如果在緩存中找不到對象,則從數據庫中獲取該對象。這種取消引用過程也被稱為數據庫術語中的混合或固定。提交事務時通過OCCI應用程序,對象緩存刷新所有“臟”(new / updated / deleted)對象到數據庫所在的位置,操作反映在持久性存儲中。對象緩存維護指向C ++對象實例的指針表示相應的數據庫對象。
在關聯訪問模型中,SQL查詢和DML語句是執行以獲取和更新數據庫中的對象。 沒有任何作用關聯訪問模型中的對象緩存。
與大多數C++數據庫編程類似,OCCI也提供了基礎的編程接口,主要是Environment,Connection,ConnectionPool,Statement,ResultSet,MetaData等,這些對象的調用關系如下:
使用OCCI編程遵循以下幾個基本的操作步驟(不可缺省)
1,初始化環境Environment。在對象模式下初始化OCCI編程環境。您的應用程序很可能需要在頭文件中包含數據庫對象的C ++類表示。
2,建立連接Connection。使用環境句柄建立與數據庫服務器的連接。
3,準備SQL語句statement。這是本地(客戶端)步驟,可能包括綁定占位符。在對象關系應用程序中,此SQL語句應該向對象返回引用(REF)。
4,訪問該對象,將準備好的語句與數據庫服務器關聯,然后執行該語句。
5,關閉對象,關閉相關的ResultSet對象
6,釋放資源,關閉statement對象。
7,斷開鏈接,關閉Connection
8,封閉環境,終止Environment對象。
下面我給大家詳細介紹這幾個對象,以及碰到的注意事項。
2.1.1 Environment對象
Environment類提供OCCI環境來管理OCCI對象的內存和其他資源。應用程序可以具有多個OCCI環境。每個環境都有自己的堆和線程安全互斥體。Environment對象的方法以及用途如下:
Method | Summary |
createConnection() | 建立與指定數據庫的連接。 |
createConnectionPool() | 創建連接池。 |
createEnvironment() | 創建一個Environment對象。 |
createStatelessConnectionPool() | 創建無狀態連接池。 |
enableSubscription() | 啟用訂閱通知 |
disableSubscription() | 禁用訂閱通知 |
getCacheMaxSize() | 獲得Cache的最大值。 |
getCacheOptSize() | 獲得緩存最佳堆大小。 |
getCacheSortedFlush() | 獲得緩存排序標志的設置。 |
getClientVersion() | 返回客戶端庫的版本。 |
getCurrentHeapSize() | 返回分配給當前環境中所有對象的當前內存量。 |
getLDAPAdminContext() | 使用LDAP打開通知注冊時返回管理上下文。 |
getLDAPAuthentication() | 使用LDAP打開通知注冊時返回身份驗證模式。 |
getLDAPHost() | 返回運行LDAP服務器的主機。 |
getLDAPPort() | 返回LDAP服務器正在偵聽的端口。 |
getMap() | 返回當前環境的Map。 |
getOCIEnvironment() | 返回與當前環境關聯的OCI環境。 |
getXAConnection() | 創建與數據庫的XA連接。 |
getXAEnvironment() | 創建XA Environment對象。 |
releaseXAConnection() | 釋放由getXAConnection()調用分配的所有資源。 |
releaseXAEnvironment() | 釋放getXAEnvironment()調用分配的所有資源。 |
setCacheMaxSize() | 指定客戶端對象緩存的最大大小,以最佳大小的百分比表示。 |
setCacheOptSize() | 指定客戶端對象高速緩存的最佳大小(以字節為單位)。 |
setCacheSortedFlush() | 指定是否在刷新之前按表順序對緩存進行排序。 |
setLDAPAdminContext() | 指定LDAP客戶端的管理上下文。 |
setLDAPAuthentication() | 指定LDAP身份驗證模式。 |
setLDAPHostAndPort() | 指定LDAP服務器主機和端口。 |
setLDAPLoginNameAndPassword() | 指定連接LDAP服務器時的登錄名和密碼。 |
terminateConnection() | 關閉連接并釋放所有相關資源。 |
terminateConnectionPool() | 關閉連接池并釋放所有相關資源。 |
terminateEnvironment() | 關閉環境,釋放所有資源。 |
terminateStatelessConnectionPool() | 關閉無狀態連接池并釋放所有相關資源。 |
我們用的最多的幾個Environment方法是:
createEnvironment(),創建鏈接環境。創建一個Environment對象。 它是使用setMemMgrFunctions()方法中指定的指定內存管理函數創建的。 如果未指定內存管理器函數,則OCCI使用其自己的默認函數。最終必須關閉Environment對象以釋放它已獲取的所有系統資源。如果指定的模式是THREADED_MUTEXED或THREADED_UNMUTEXED,則所有三個內存管理功能必須是線程安全的。
createConnection() 用來創建一個指向數據庫的鏈接,其調用方式是:
Connection * createConnection(
const string&userName,
const string&password,
const string&connectString="")=0;
另外還有幾個重載的函數,
Connection * createConnection(
const string&userName,
const string&password,
const string&connectString,
const string&connectionClass,
constConnection::Purity &purity)=0;
可以用來創建一個駐留在連接池的鏈接。如果指定connectionClass參數,則可以創建UTF16的鏈接池,此時需要在Environment中設置OCCIUTIF16模式。
createConnectionPool(),創建連接,可以指定UNICODE和非UNICODE的兩種方式。其實Oracle數據庫包含一個名為SYS_DEFAULT_CONNECTION_POOL的默認連接池。 默認情況下,此池已創建,但尚未啟動。 要啟用數據庫駐留連接池,必須顯式啟動連接池。
您可以使用DBMS_CONNECTION_POOL包中的過程根據您的用法配置連接池。在Oracle Real Application Clusters(RAC)環境中,配置參數適用于每個Oracle RAC實例。
在SQLPlus命令行中,運行EXECUTE DBMS_CONNECTION_POOL.START_POOL(); 就可以啟動或一個連接池。
使用 EXECUTE DBMS_CONNECTION_POOL.ALTER_PARAM ('','MINSIZE','10'); 可以配置連接池的參數。
使用 EXECUTE DBMS_CONNECTION_POOL.STOPT_POOL(); 可以關閉連接池。
2.1.2 Connection對象
Connection類表示與特定數據庫的連接。同時提供了在連接的上下文中,執行SQL語句并返回結果。其常用的方法有:
Method | Summary |
changePassword() | 更改當前用戶的密碼。 |
commit() | 提交自上次提交或回滾以來所做的更改,并釋放會話持有的任何數據庫鎖。 |
createStatement() | 創建一個Statement對象來執行SQL語句。 |
flushCache() | 刷新與連接關聯的對象緩存。 |
getClientCharSet() | 返回默認的客戶端字符集。 |
getClientCharSetUString() | 返回UString中啟用全球化的客戶端字符集(UNICODE)。 |
getClientNCHARCharSet() | 返回默認的客戶端NCHAR字符集。 |
getClientNCHARCharSetUString() | 返回UString中啟用全球化的客戶端NCHAR字符集。 |
getClientVersion() | 返回當前客戶端的版本。 |
getMetaData() | 返回可從該連接訪問的對象的元數據。 |
getOCIServer() | 返回與連接關聯的OCI服務器信息。 |
getOCIServiceContext() | 返回與連接關聯的OCI服務上下文。 |
getOCISession() | 返回與連接關聯的OCI Session上下文。 |
getServerVersion() | 以字符串形式返回所使用的Oracle服務器的版本。 |
getServerVersionUString() | 返回使用的Oracle服務器的版本,使用Ustring格式。 |
getStmtCacheSize() | 獲取Statement高速緩存的大小。 |
getTag() | 返回與Connection關聯的標記。 |
isCached() | statement 是否有緩存 |
pinVectorOfRefs() | 在一次往返中將Ref對象的整個向量固定到對象緩存中; 固定對象可通過OUT參數向量獲得。 |
postToSubscriptions() | 發布訂閱通知。 |
readVectorOfBfiles() | 在單個服務器往返中讀取多個Bfiles。 |
readVectorOfBlobs() | 在單個服務器往返中讀取多個Blob。 |
readVectorOfClobs() | 在單個服務器往返中讀取多個Clobs。 |
registerSubscriptions() | 注冊幾個可以進行通知的Subscription |
rollback() | 回滾自上次提交或回滾以來所做的所有更改,并釋放會話持有的任何數據庫鎖。 |
setCollectionAccessMode() | 根據需要禁用或啟用集合緩存。 |
setStmtCacheSize() | 啟用或禁用Statement緩存。 |
setTAFNotify() | 在Connection對象上注冊故障轉移回調函數。 |
terminateStatement() | 關閉Statement對象并釋放與其關聯的所有資源。 |
unregisterSubscription() | 取消注冊Subscription,關閉其通知。 |
writeVectorOfBlobs() | 在單個服務器往返中寫入多個Blob。 |
writeVectorOfClobs() | 在一個服務器往返中寫入多個Clobs。 |
其中Connection對象中最常用的方法就是Commit,rollback, CreateStatement, ternminateStatement等,這些方法是必要,也是大家經常使用到的,其使用方法和其他的標準SQL方法是一致的,我這里不再贅述了。
2.1.3 Statement對象
Statement對象用于執行SQL語句。 該語句可以是返回結果集的查詢,也可以是返回更新計數的非查詢語句。 非查詢SQL可以是insert,update或delete語句。 非查詢SQL語句也可以是DML語句(例如create,grant等)或存儲過程調用。
查詢,插入/更新/刪除或存儲過程調用語句可以具有IN綁定參數,而存儲過程調用語句可以具有OUT綁定參數或綁定IN和OUT參數,稱為IN / OUT參數。
Method | Description |
addIteration() | 添加執行的iteration |
closeResultSet() | 立即釋放結果集的數據庫和OCCI資源,而不是等待自動釋放。 |
closeStream() | 關閉參數流指定的流。 |
disableCaching() | 禁用Statement緩存。 |
execute() | 運行SQL語句。 |
executeArrayUpdate() | 運行插入,更新和刪除,僅使用在setDataBuffer()或綁定參數的流接口的語句。 |
executeQuery() | 運行返回單個ResultSet的SQL語句。 |
executeUpdate() | 運行不返回ResultSet的SQL語句。 |
getAutoCommit() | 返回當前的自動提交狀態。 |
getBatchErrorMode() | 返回批處理錯誤模式的狀態。 |
getBDouble() | 返回IEEE754標準的OUBLE的值作為Double對象。 |
getBfile() | 返回BFILE作為Bfile對象的值。 |
getBFloat() | 返回IEEE754 FLOAT的值作為BFloat對象。 |
getBlob() | 將BLOB的值作為Blob對象返回。 |
getBytes() | 以字節形式返回SQL BINARY或VARBINARY參數的值。 |
getCharSet() | 以字符串形式返回對指定參數有效的字符集。 |
getCharSetUString() | 以UString形式返回對指定參數有效的字符集。 |
getClob() | 將CLOB的值作為Clob對象返回。 |
getConnection() | 返回實例化Statement對象的連接。 |
getCurrentIteration() | 返回正在處理的當前迭代的迭代次數。 |
getCurrentStreamIteration() | 返回要讀取或寫入流數據的當前迭代。 |
getCurrentStreamParam() | 返回必須讀取或寫入的當前輸出Stream的參數索引。 |
getCursor() | 返回OUT參數的REF CURSOR值作為ResultSet。 |
getDatabaseNCHARParam() | 返回數據是否為NCHAR字符集。 |
getDate() | 以Date對象的形式返回參數的值 |
getBDouble() | 將參數的值作為IEEE754 double返回。 |
getDouble() | 以C ++ double的形式返回參數的值。 |
getBFloat() | 以IEEE754 float形式返回參數的值。 |
getFloat() | 以C ++ float形式返回參數的值。 |
getInt() | 以C ++ int形式返回參數的值。 |
getIntervalDS() | 以IntervalDS對象的形式返回參數的值。 |
getIntervalYM() | 以IntervalYM對象的形式返回參數的值。 |
getMaxIterations() | 返回當前限制的最大迭代次數。 |
getMaxParamSize() | 返回當前最大參數的大小。 |
getNumber() | 以Number對象的形式返回參數的值。 |
getObject() | 以PObject的形式返回參數的值。 |
getOCIStatement() | 返回與Statement關聯的OCI語句句柄。 |
getRef() | 以REFAny形式返回REF參數的值 |
getResultSet() | 以ResultSet的形式返回當前結果。 |
getRowid() | 將行id參數值作為Bytes對象返回。 |
getSQL() | 返回與Statement對象關聯的當前SQL字符串。 |
getSQLUString() | 返回與Statement對象關聯的當前SQL字符串; UNICODE格式的。 |
getStream() | 以流形式返回參數的值。 |
getString() | 以字符串形式返回參數的值。 |
getTimestamp() | 以Timestamp對象的形式返回參數的值 |
getUInt() | 以C ++ unsigned int的形式返回參數的值 |
getUpdateCount() | 返回當前結果作為非查詢語句的更新計數。 |
getUString() | 返回UString的值。 |
getVector() | 將指定參數作為向量返回。 |
getVectorOfRefs() | 返回當前位置的列作為REF的向量。 |
isNull() | 檢查參數是否為NULL。 |
isTruncated() | 檢查值是否被截斷。 |
preTruncationLength() | 在截斷之前返回參數的實際長度. |
registerOutParam() | 注冊OUT參數的類型和最大大小. |
setAutoCommit() | 指定自動提交模式。 |
setBatchErrorMode() | 啟用或禁用批處理錯誤處理模式。 |
setBDouble() | 將參數設置為IEEE雙精度值。 |
setBfile() | 將參數設置為Bfile值。 |
setBFloat() | 將參數設置為IEEE浮點值。 |
setBinaryStreamMode() | 指定將列作為二進制流返回。 |
setBlob() | 將參數設置為Blob值。 |
setBytes() | 將參數設置為Bytes數組。 |
setCharacterStreamMode() | 指定將列作為字符流返回。 |
setCharSet() | 將字符集設置為字符串指定的值。 |
setCharSetUString() | 將字符集設置為UString指定的值。 |
setClob() | 將參數設置為Clob值。 |
setDate() | 將參數設置為Date值。 |
setDatabaseNCHARParam() | 如果數據位于數據庫的NCHAR字符集中,則設置為true; 設置為false以恢復默認值。 |
setDataBuffer() | 指定數據可用于讀取或寫入的數據緩沖區。 |
setDataBufferArray() | 指定數據緩沖區數組,其中數據可用于讀取或寫入。 |
setDouble() | 將參數設置為C ++ double值。 |
setErrorOnNull() | 啟用或禁用讀取NULL值的異常。 |
setErrorOnTruncate() | 發生截斷時啟用或禁用異常。 |
setFloat() | 將參數設置為C ++浮點值。 |
setInt() | 將參數設置為C ++ int值。 |
setIntervalDS() | 將參數設置為IntervalDS值。 |
setIntervalYM() | 將參數設置為IntervalYM值。 |
setMaxIterations() | 設置將為DML語句進行的最大調用次數。 |
setMaxParamSize() | 設置可以從參數發送或返回的最大數據量。 |
setNull() | 將參數設置為SQL NULL。 |
setNumber() | 將參數設置為Number值。 |
setObject() | 使用對象設置參數的值。 |
setPrefetchMemorySize() | 設置OCCI將在內部使用的內存量,以存儲在每次往返服務器期間獲取的數據。 |
setPrefetchRowCount() | 設置每次往返服務器時OCCI將在內部獲取的行數。 |
setRef() | 將參數的值設置為引用。 |
setRowid() | 為綁定位置設置行byte數組格式的rowId |
setSQL() | 將新的SQL字符串與Statement對象關聯。 |
setSQLUString() | 將新的SQL字符串與Statement對象關聯; UNICODE格式。 |
setString() | 設置指定索引的參數。 |
setTimestamp() | 將參數設置為Timestamp值。 |
setUInt() | 將參數設置為C ++ unsigned int值。 |
setUString() | 設置指定索引的參數,UNICODE格式。 |
setVector() | 將參數設置為unsigned int的向量。 |
setVectorOfRefs() | 將參數設置為矢量,如果類型是REF的集合時使用。 |
status() | 返回語句的當前狀態。 當要寫入流數據時很有用。 |
每次創建Statement對象時,都會有內存和資源等資源必須在客戶端和服務器端分配游標才能存儲該對象及其數據。為了節省內存的重新分配,請嘗試重用Statement對象。創建Statement對象后,只需使用它們即可重用它們,setSQL方法,如下例所示
Connection* conn = env->createConnection();
Statement* stmt = conn->createStatement();
stmt->setSQL(“INSERT INTO fruit_basket_tab VALUES(‘Apples’,3)”);
stmt->executeUpdate();
stmt->setSQL(“INSERT INTO fruit_basket_tabVALUES(‘Oranges’, 4)”);
stmt->executeUpdate();
stmt->setSQL(“INSERT INTO fruit_basket_tabVALUES(‘Bananas’, 1)”);
stmt->executeUpdate();'
stmt->setSQL(“SELECT * FROM fruit_basket_tab WHEREquantity > 2”);
為了節省更多的內存重新分配,可以參數化將前三個SQL語句合并為一個,設置參數,然后執行。但是,更改輸入參數類型,因為必須執行重新綁定每次類型改變。以下示例演示了參數化:
stmt->setSQL(“INSERT INTOfruit_basket_tab VALUES(:1, :2)”);
stmt->setString( 1, “Apples” );
stmt->setInt( 2, 3 );
stmt->executeUpdate();
stmt->setString( 1, “Oranges” );
stmt->setInt( 2, 4 );
stmt->executeUpdate();
stmt->setString( 1, “Bananas” );
stmt->setInt( 2, 1 );
stmt->executeUpdate();
對于經常分批進行的一些操作,浪費了很多時間網絡往返服務器的通信時間。 OCCI提供了一個在單個網絡中發送多行信息的有效機制往返。此優化適用于INSERT,UPDATE和DELETE。首先,您必須設置最大迭代次數,然后設置最大值可變長度參數的參數大小。參數不能更改類型迭代操作。以下是上述INSERT的優化形式:
//prepare the batching process
stmt->setMaxIterations( 3 );
stmt->setMaxParamSize( 1, 8 );
//”Bananas” is longest param
//批處理操作開始。
stmt->setSQL(“INSERT INTOfruit_basket_tab VALUES(:1, :2)”);
stmt->setString( 1, “Apples” );
stmt->setInt( 2, 3 );
stmt->addIteration(); // 添加迭代子。
stmt->setString( 1, “Oranges” );
stmt->setInt( 2, 4 );
stmt->addIteration();
stmt->setString( 1, “Bananas” );
stmt->setInt( 2, 1 );
//execute the statements
stmt->executeUpdate();
2.1.4 ResultSet對象
ResultSet提供對通過執行Statement生成的數據表的訪問。按行順序檢索表行。在一行中,可以按任何順序訪問列值。ResultSet維護指向其當前數據行的游標。最初,光標位于第一行之前。下一個方法將光標移動到下一行。getxxx()方法檢索當前行的列值。您可以使用列的索引號檢索值。列從1開始編號。對于getxxx()方法,OCCI嘗試將基礎數據轉換為指定的C ++類型并返回C ++值。 SQL類型使用ResultSet ::getxxx()方法映射到C ++類型。ResultSet列的數量,類型和屬性由getColumnListMetaData()方法返回的MetaData對象提供。其常用的方法有:
Method | Description |
cancel() | 取消ResultSet. |
closeStream() | 關閉指定的流對象。 |
getBDouble() | 以BDouble的形式返回當前行中列的值。 |
getBfile() | 以Bfile形式返回當前行中列的值. |
getBFloat() | 以BFloat形式返回當前行中列的值. |
getBlob() | 以Blob對象的形式返回當前行中列的值. |
getBytes() | 以Bytes數組的形式返回當前行中列的值。 |
getCharSet() | 返回將獲取數據的字符集。 |
getCharSetUString() | 返回將數據作為UString提取的字符集。 |
getClob() | 以Clob對象的形式返回當前行中列的值。 |
getColumnListMetaData() | 將結果集列的描述信息作為MetaData對象返回。 |
getCurrentStreamColumn() | 返回當前可讀Stream的列索引. |
getCurrentStreamRow() | 返回正在處理的ResultSet的當前行。 |
getCursor() | 獲取ResultSet的嵌套游標。 |
getDate() | 以Date對象的形式返回當前行中列的值。 |
getDatabaseNCHARParam() | 返回數據是否為NCHAR字符集。 |
getDouble() | 以C ++ double的形式返回當前行中列的值。 |
getFloat() | 以C ++ float形式返回當前行中列的值. |
getInt() | 以C ++ int的形式返回當前行中列的值。 |
getIntervalDS() | 以IntervalDS的形式返回當前行中列的值。 |
getIntervalYM() | 以IntervalYM形式返回當前行中列的值。 |
getMaxColumnSize() | 返回列的最大值。 |
getNumArrayRows() | 返回上次數組提取中獲取的實際行數。 |
getNumber() | 以Number對象的形式返回當前行中列的值。 |
getObject() | 以PObject的形式返回當前行中列的值。 |
getRef() | 返回當前行中列的值作為Ref. |
getRowid() | 返回SELECT FOR UPDATE語句的當前ROWID。 |
getRowPosition() | 返回當前行位置的行id。 |
getStatement() | 返回ResultSet的Statement。 |
getStream() | 以Stream形式返回當前行中列的值。 |
getString() | 以字符串形式返回當前行中列的值。 |
getTimestamp() | 以Timestamp對象的形式返回當前行中列的值。 |
getUInt() | 以C ++ unsigned int的形式返回當前行中列的值 |
getUString() | 以UString形式返回當前行中列的值。 |
getVector() | 將指定的collection參數作為向量返回。 |
getVectorOfRefs() | 返回當前位置的列作為Refs的向量。 |
isNull() | 當前值是否是空。 |
isTruncated() | 當前值是否被切割。 |
next() | 使下一行成為ResultSet中的當前行。 |
preTruncationLength() | 在截斷之前返回參數的實際長度。 |
setBinaryStreamMode() | 指定將列作為二進制流返回。 |
setCharacterStreamMode() | 指定將列作為字符流返回。 |
setCharSet() | 指定要在其中返回數據的字符集。 |
setCharSetUString() | 指定要在其中返回數據的字符集,UNICODE格式。 |
setDatabaseNCHARParam() | 如果要從包含數據庫的NCHAR字符集中的數據的列檢索參數,則必須通過傳遞true值來通知OCCI。 |
setDataBuffer() | 指定要將數據提取到的數據緩沖區,或者收集和分散綁定和定義的數據。 |
setErrorOnNull() | 讀取NULL值時啟用或禁用異常。 |
setErrorOnTruncate() | 發生截斷時啟用或禁用異常。 |
setMaxColumnSize() | 指定列的最大數據量。 |
status() | 返回ResultSet的當前狀態。 |
2.1.5 MetaData對象
MetaData對象可用于描述ResultSet中列的類型和屬性,或數據庫中的現有模式對象。它還提供有關整個數據庫的信息。
Method | Description |
getAttributeCount() | 獲取屬性的個數作 |
getAttributeId() | 獲取指定屬性的ID |
getAttributeType() | 返回屬性類型。 |
getBoolean() | 以C ++布爾值的形式獲取屬性的值。 |
getInt() | 獲取C++ int的屬性值。 |
getMetaData() | 獲取屬性的MetaData對象 |
getNumber() | 以Number對象的形式返回指定的屬性。 |
getRef() |
以Ref |
getString() | 獲取String的屬性值。 |
getTimeStamp() | 獲取Timestamp的屬性值 |
getUInt() | 獲取C ++ unsigned int的屬性值。 |
getUString() | 獲取UString的屬性值。 |
getVector() | 獲取C ++向量的屬性值。 |
operator=() | 將一個元數據對象分配給另一個。 |
MetaData類為Oracle提供大量的屬性值說明,包括表的屬性,列以及數據的屬性,我們可以根據屬性值來判斷該數據庫對象的屬性。常用的有:
屬性種類 | 說明 |
PTYPE_ARG | 函數或者是存儲過程的參數 |
PTYPE_COL | 表或者視圖的列 |
PTYPE_DATABASE | 數據庫 |
PTYPE_FUNC | 函數 |
PTYPE_PKG | 包 |
PTYPE_PROC | 存儲過程 |
PTYPE_SCHEMA | SCHEMA |
PTYPE_SEQ | SEQUENCE |
PTYPE_SYN | SYNONYM |
PTYPE_TABLE | 表 |
PTYPE_TYPE | 類型 |
PTYPE_TYPE_ARG | 類型參數 |
PTYPE_TYPE_ATTR | 類型屬性 |
PTYPE_TYPE_COLL | 類型集合 |
PTYPE_TYPE_METHOD | 類型方法 |
PTYPE_TYPE_RESULT | 類型結果 |
PTYPE_UNK | 未知對象 |
PTYPE_VIEW | 視圖 |
具體的類型值的說明可以參考Oracle的官方文檔。
在數據庫編程中,OCCI其實用的不是非常多,也就造成了在實際應用中可以查詢的資料不多,往往給編程者帶了困難。作者在多次踩坑以后總結出上述資料,比較詳細的介紹OCCI編程中常用的對象。希望可以和大家保持溝通和交流,互相學習和提高, 更多的C++知識,請關注《C語言專家集中營》。
-
數據庫
+關注
關注
7文章
3840瀏覽量
64544 -
編程語言
+關注
關注
10文章
1949瀏覽量
34850 -
C++
+關注
關注
22文章
2113瀏覽量
73742
原文標題:Linux下的Oracle C++編程(OCCI)
文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論