0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么使用OCCI編程?

C語言專家集中營 ? 來源:未知 ? 作者:李倩 ? 2018-11-20 16:24 ? 次閱讀

Oracle給各種編程語言都提供了編程接口,其中C++的編程模塊就是OCCI,通過OCCI我們可以很方便的訪問數(shù)據(jù)的信息,讀取數(shù)據(jù)庫的屬性,下面我們看看怎么使用OCCI編程。本文使用Centos 7.0為例,Oracle的版本是12.2

一,環(huán)境準備

1.1 默認的Oracle安裝中沒有提供OCCI接口的包,需要我們在Oracle官網(wǎng)下載,地址是:https://www.oracle.com/technetwork/topics/linuxsoft-082809.html

需要安裝下面幾個內(nèi)容:

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 安裝完成后需要設(shè)置環(huán)境變量,在~/.bashrc中或者/etc/profile中添加下面的命令設(shè)置環(huán)境變量。

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,使得環(huán)境變量立即生效。

二,OCCI編程

Oracle C++調(diào)用接口(OCCI)是一個易于使用且功能強大的C ++用于訪問Oracle對象關(guān)系數(shù)據(jù)庫的接口。 OCCI對象interface是一種無縫且優(yōu)化的訪問和操作機制來自數(shù)據(jù)庫的持久數(shù)據(jù)作為C ++對象。使用Objects接口和導(dǎo)航訪問范例,有一個單一的對象模型應(yīng)用程序和數(shù)據(jù)庫。開發(fā)人員不需要實現(xiàn)任何用于將數(shù)據(jù)庫對象映射到C ++類對象的附加代碼。這是由OCCI通過編譯時生成的代碼和運行時支持完成。結(jié)合Oracle的對象關(guān)系特性,OCCI和C ++,復(fù)雜和可以開發(fā)強大的面向?qū)ο蟮臄?shù)據(jù)庫應(yīng)用程序。

OCCI為訪問和操作在數(shù)據(jù)庫中的對象提供了2種不同的模型。在導(dǎo)航訪問模型中(使用Fetch操作),引用數(shù)據(jù)庫中的對象到客戶端,如果這些引用被取消或者關(guān)閉時,那么就直接引用客戶端的對象緩存中。使用引用(作為屬性)和對對象之間的關(guān)系進行編程,應(yīng)用程序可以引用和取消引用中的關(guān)聯(lián)對象關(guān)系。在使用導(dǎo)航訪問模型的應(yīng)用程序中數(shù)據(jù)庫變得“不可見”,應(yīng)用程序似乎是“純粹的”C ++程序。

在OCCI的導(dǎo)航訪問模型中,客戶端對象緩存在透明的管理數(shù)據(jù)庫對象(表示為C ++對象)中,應(yīng)用程序可以立即使用/取消引用,創(chuàng)建/更新/刪除對象。如果一個引用m被應(yīng)用程序取消,OCCI會搜索緩存中引用的對象,如果存在則返回緩存的對象;如果在緩存中找不到對象,則從數(shù)據(jù)庫中獲取該對象。這種取消引用過程也被稱為數(shù)據(jù)庫術(shù)語中的混合或固定。提交事務(wù)時通過OCCI應(yīng)用程序,對象緩存刷新所有“臟”(new / updated / deleted)對象到數(shù)據(jù)庫所在的位置,操作反映在持久性存儲中。對象緩存維護指向C ++對象實例的指針表示相應(yīng)的數(shù)據(jù)庫對象。

在關(guān)聯(lián)訪問模型中,SQL查詢和DML語句是執(zhí)行以獲取和更新數(shù)據(jù)庫中的對象。 沒有任何作用關(guān)聯(lián)訪問模型中的對象緩存。

與大多數(shù)C++數(shù)據(jù)庫編程類似,OCCI也提供了基礎(chǔ)的編程接口,主要是Environment,Connection,ConnectionPool,Statement,ResultSet,MetaData等,這些對象的調(diào)用關(guān)系如下:

使用OCCI編程遵循以下幾個基本的操作步驟(不可缺省)

1,初始化環(huán)境Environment。在對象模式下初始化OCCI編程環(huán)境。您的應(yīng)用程序很可能需要在頭文件中包含數(shù)據(jù)庫對象的C ++類表示。

2,建立連接Connection。使用環(huán)境句柄建立與數(shù)據(jù)庫服務(wù)器的連接。

3,準備SQL語句statement。這是本地(客戶端)步驟,可能包括綁定占位符。在對象關(guān)系應(yīng)用程序中,此SQL語句應(yīng)該向?qū)ο蠓祷匾茫≧EF)。

4,訪問該對象,將準備好的語句與數(shù)據(jù)庫服務(wù)器關(guān)聯(lián),然后執(zhí)行該語句。

5,關(guān)閉對象,關(guān)閉相關(guān)的ResultSet對象

6,釋放資源,關(guān)閉statement對象。

7,斷開鏈接,關(guān)閉Connection

8,封閉環(huán)境,終止Environment對象。

下面我給大家詳細介紹這幾個對象,以及碰到的注意事項。

2.1.1 Environment對象

Environment類提供OCCI環(huán)境來管理OCCI對象的內(nèi)存和其他資源。應(yīng)用程序可以具有多個OCCI環(huán)境。每個環(huán)境都有自己的堆和線程安全互斥體。Environment對象的方法以及用途如下:

Method Summary
createConnection() 建立與指定數(shù)據(jù)庫的連接。
createConnectionPool() 創(chuàng)建連接池。
createEnvironment() 創(chuàng)建一個Environment對象。
createStatelessConnectionPool() 創(chuàng)建無狀態(tài)連接池。
enableSubscription() 啟用訂閱通知
disableSubscription() 禁用訂閱通知
getCacheMaxSize() 獲得Cache的最大值。
getCacheOptSize() 獲得緩存最佳堆大小。
getCacheSortedFlush() 獲得緩存排序標志的設(shè)置。
getClientVersion() 返回客戶端庫的版本。
getCurrentHeapSize() 返回分配給當前環(huán)境中所有對象的當前內(nèi)存量。
getLDAPAdminContext() 使用LDAP打開通知注冊時返回管理上下文。
getLDAPAuthentication() 使用LDAP打開通知注冊時返回身份驗證模式。
getLDAPHost() 返回運行LDAP服務(wù)器的主機。
getLDAPPort() 返回LDAP服務(wù)器正在偵聽的端口。
getMap() 返回當前環(huán)境的Map。
getOCIEnvironment() 返回與當前環(huán)境關(guān)聯(lián)的OCI環(huán)境。
getXAConnection() 創(chuàng)建與數(shù)據(jù)庫的XA連接。
getXAEnvironment() 創(chuàng)建XA Environment對象。
releaseXAConnection() 釋放由getXAConnection()調(diào)用分配的所有資源。
releaseXAEnvironment() 釋放getXAEnvironment()調(diào)用分配的所有資源。
setCacheMaxSize() 指定客戶端對象緩存的最大大小,以最佳大小的百分比表示。
setCacheOptSize() 指定客戶端對象高速緩存的最佳大小(以字節(jié)為單位)。
setCacheSortedFlush() 指定是否在刷新之前按表順序?qū)彺孢M行排序。
setLDAPAdminContext() 指定LDAP客戶端的管理上下文。
setLDAPAuthentication() 指定LDAP身份驗證模式。
setLDAPHostAndPort() 指定LDAP服務(wù)器主機和端口。
setLDAPLoginNameAndPassword() 指定連接LDAP服務(wù)器時的登錄名和密碼。
terminateConnection() 關(guān)閉連接并釋放所有相關(guān)資源。
terminateConnectionPool() 關(guān)閉連接池并釋放所有相關(guān)資源。
terminateEnvironment() 關(guān)閉環(huán)境,釋放所有資源。
terminateStatelessConnectionPool() 關(guān)閉無狀態(tài)連接池并釋放所有相關(guān)資源。

我們用的最多的幾個Environment方法是:

createEnvironment(),創(chuàng)建鏈接環(huán)境。創(chuàng)建一個Environment對象。 它是使用setMemMgrFunctions()方法中指定的指定內(nèi)存管理函數(shù)創(chuàng)建的。 如果未指定內(nèi)存管理器函數(shù),則OCCI使用其自己的默認函數(shù)。最終必須關(guān)閉Environment對象以釋放它已獲取的所有系統(tǒng)資源。如果指定的模式是THREADED_MUTEXED或THREADED_UNMUTEXED,則所有三個內(nèi)存管理功能必須是線程安全的。

createConnection() 用來創(chuàng)建一個指向數(shù)據(jù)庫的鏈接,其調(diào)用方式是:

Connection * createConnection(

const string&userName,

const string&password,

const string&connectString="")=0;

另外還有幾個重載的函數(shù),

Connection * createConnection(

const string&userName,

const string&password,

const string&connectString,

const string&connectionClass,

constConnection::Purity &purity)=0;

可以用來創(chuàng)建一個駐留在連接池的鏈接。如果指定connectionClass參數(shù),則可以創(chuàng)建UTF16的鏈接池,此時需要在Environment中設(shè)置OCCIUTIF16模式。

createConnectionPool(),創(chuàng)建連接,可以指定UNICODE和非UNICODE的兩種方式。其實Oracle數(shù)據(jù)庫包含一個名為SYS_DEFAULT_CONNECTION_POOL的默認連接池。 默認情況下,此池已創(chuàng)建,但尚未啟動。 要啟用數(shù)據(jù)庫駐留連接池,必須顯式啟動連接池。

您可以使用DBMS_CONNECTION_POOL包中的過程根據(jù)您的用法配置連接池。在Oracle Real Application Clusters(RAC)環(huán)境中,配置參數(shù)適用于每個Oracle RAC實例。

在SQLPlus命令行中,運行EXECUTE DBMS_CONNECTION_POOL.START_POOL(); 就可以啟動或一個連接池。

使用 EXECUTE DBMS_CONNECTION_POOL.ALTER_PARAM ('','MINSIZE','10'); 可以配置連接池的參數(shù)。

使用 EXECUTE DBMS_CONNECTION_POOL.STOPT_POOL(); 可以關(guān)閉連接池。

2.1.2 Connection對象

Connection類表示與特定數(shù)據(jù)庫的連接。同時提供了在連接的上下文中,執(zhí)行SQL語句并返回結(jié)果。其常用的方法有:

Method Summary
changePassword() 更改當前用戶的密碼。
commit() 提交自上次提交或回滾以來所做的更改,并釋放會話持有的任何數(shù)據(jù)庫鎖。
createStatement() 創(chuàng)建一個Statement對象來執(zhí)行SQL語句。
flushCache() 刷新與連接關(guān)聯(lián)的對象緩存。
getClientCharSet() 返回默認的客戶端字符集。
getClientCharSetUString() 返回UString中啟用全球化的客戶端字符集(UNICODE)。
getClientNCHARCharSet() 返回默認的客戶端NCHAR字符集。
getClientNCHARCharSetUString() 返回UString中啟用全球化的客戶端NCHAR字符集。
getClientVersion() 返回當前客戶端的版本。
getMetaData() 返回可從該連接訪問的對象的元數(shù)據(jù)。
getOCIServer() 返回與連接關(guān)聯(lián)的OCI服務(wù)器信息。
getOCIServiceContext() 返回與連接關(guān)聯(lián)的OCI服務(wù)上下文。
getOCISession() 返回與連接關(guān)聯(lián)的OCI Session上下文。
getServerVersion() 以字符串形式返回所使用的Oracle服務(wù)器的版本。
getServerVersionUString() 返回使用的Oracle服務(wù)器的版本,使用Ustring格式。
getStmtCacheSize() 獲取Statement高速緩存的大小。
getTag() 返回與Connection關(guān)聯(lián)的標記。
isCached() statement 是否有緩存
pinVectorOfRefs() 在一次往返中將Ref對象的整個向量固定到對象緩存中; 固定對象可通過OUT參數(shù)向量獲得。
postToSubscriptions() 發(fā)布訂閱通知。
readVectorOfBfiles() 在單個服務(wù)器往返中讀取多個Bfiles。
readVectorOfBlobs() 在單個服務(wù)器往返中讀取多個Blob。
readVectorOfClobs() 在單個服務(wù)器往返中讀取多個Clobs。
registerSubscriptions() 注冊幾個可以進行通知的Subscription
rollback() 回滾自上次提交或回滾以來所做的所有更改,并釋放會話持有的任何數(shù)據(jù)庫鎖。
setCollectionAccessMode() 根據(jù)需要禁用或啟用集合緩存。
setStmtCacheSize() 啟用或禁用Statement緩存。
setTAFNotify() 在Connection對象上注冊故障轉(zhuǎn)移回調(diào)函數(shù)。
terminateStatement() 關(guān)閉Statement對象并釋放與其關(guān)聯(lián)的所有資源。
unregisterSubscription() 取消注冊Subscription,關(guān)閉其通知。
writeVectorOfBlobs() 在單個服務(wù)器往返中寫入多個Blob。
writeVectorOfClobs() 在一個服務(wù)器往返中寫入多個Clobs。

其中Connection對象中最常用的方法就是Commit,rollback, CreateStatement, ternminateStatement等,這些方法是必要,也是大家經(jīng)常使用到的,其使用方法和其他的標準SQL方法是一致的,我這里不再贅述了。

2.1.3 Statement對象

Statement對象用于執(zhí)行SQL語句。 該語句可以是返回結(jié)果集的查詢,也可以是返回更新計數(shù)的非查詢語句。 非查詢SQL可以是insert,update或delete語句。 非查詢SQL語句也可以是DML語句(例如create,grant等)或存儲過程調(diào)用。

查詢,插入/更新/刪除或存儲過程調(diào)用語句可以具有IN綁定參數(shù),而存儲過程調(diào)用語句可以具有OUT綁定參數(shù)或綁定IN和OUT參數(shù),稱為IN / OUT參數(shù)。

Method Description
addIteration() 添加執(zhí)行的iteration
closeResultSet() 立即釋放結(jié)果集的數(shù)據(jù)庫和OCCI資源,而不是等待自動釋放。
closeStream() 關(guān)閉參數(shù)流指定的流。
disableCaching() 禁用Statement緩存。
execute() 運行SQL語句。
executeArrayUpdate() 運行插入,更新和刪除,僅使用在setDataBuffer()或綁定參數(shù)的流接口的語句。
executeQuery() 運行返回單個ResultSet的SQL語句。
executeUpdate() 運行不返回ResultSet的SQL語句。
getAutoCommit() 返回當前的自動提交狀態(tài)。
getBatchErrorMode() 返回批處理錯誤模式的狀態(tài)。
getBDouble() 返回IEEE754標準的OUBLE的值作為Double對象。
getBfile() 返回BFILE作為Bfile對象的值。
getBFloat() 返回IEEE754 FLOAT的值作為BFloat對象。
getBlob() 將BLOB的值作為Blob對象返回。
getBytes() 以字節(jié)形式返回SQL BINARY或VARBINARY參數(shù)的值。
getCharSet() 以字符串形式返回對指定參數(shù)有效的字符集。
getCharSetUString() 以UString形式返回對指定參數(shù)有效的字符集。
getClob() 將CLOB的值作為Clob對象返回。
getConnection() 返回實例化Statement對象的連接。
getCurrentIteration() 返回正在處理的當前迭代的迭代次數(shù)。
getCurrentStreamIteration() 返回要讀取或?qū)懭肓鲾?shù)據(jù)的當前迭代。
getCurrentStreamParam() 返回必須讀取或?qū)懭氲漠斍拜敵鯯tream的參數(shù)索引。
getCursor() 返回OUT參數(shù)的REF CURSOR值作為ResultSet。
getDatabaseNCHARParam() 返回數(shù)據(jù)是否為NCHAR字符集。
getDate() 以Date對象的形式返回參數(shù)的值
getBDouble() 將參數(shù)的值作為IEEE754 double返回。
getDouble() 以C ++ double的形式返回參數(shù)的值。
getBFloat() 以IEEE754 float形式返回參數(shù)的值。
getFloat() 以C ++ float形式返回參數(shù)的值。
getInt() 以C ++ int形式返回參數(shù)的值。
getIntervalDS() 以IntervalDS對象的形式返回參數(shù)的值。
getIntervalYM() 以IntervalYM對象的形式返回參數(shù)的值。
getMaxIterations() 返回當前限制的最大迭代次數(shù)。
getMaxParamSize() 返回當前最大參數(shù)的大小。
getNumber() 以Number對象的形式返回參數(shù)的值。
getObject() 以PObject的形式返回參數(shù)的值。
getOCIStatement() 返回與Statement關(guān)聯(lián)的OCI語句句柄。
getRef() 以REFAny形式返回REF參數(shù)的值
getResultSet() 以ResultSet的形式返回當前結(jié)果。
getRowid() 將行id參數(shù)值作為Bytes對象返回。
getSQL() 返回與Statement對象關(guān)聯(lián)的當前SQL字符串。
getSQLUString() 返回與Statement對象關(guān)聯(lián)的當前SQL字符串; UNICODE格式的。
getStream() 以流形式返回參數(shù)的值。
getString() 以字符串形式返回參數(shù)的值。
getTimestamp() 以Timestamp對象的形式返回參數(shù)的值
getUInt() 以C ++ unsigned int的形式返回參數(shù)的值
getUpdateCount() 返回當前結(jié)果作為非查詢語句的更新計數(shù)。
getUString() 返回UString的值。
getVector() 將指定參數(shù)作為向量返回。
getVectorOfRefs() 返回當前位置的列作為REF的向量。
isNull() 檢查參數(shù)是否為NULL。
isTruncated() 檢查值是否被截斷。
preTruncationLength() 在截斷之前返回參數(shù)的實際長度.
registerOutParam() 注冊O(shè)UT參數(shù)的類型和最大大小.
setAutoCommit() 指定自動提交模式。
setBatchErrorMode() 啟用或禁用批處理錯誤處理模式。
setBDouble() 將參數(shù)設(shè)置為IEEE雙精度值。
setBfile() 將參數(shù)設(shè)置為Bfile值。
setBFloat() 將參數(shù)設(shè)置為IEEE浮點值。
setBinaryStreamMode() 指定將列作為二進制流返回。
setBlob() 將參數(shù)設(shè)置為Blob值。
setBytes() 將參數(shù)設(shè)置為Bytes數(shù)組。
setCharacterStreamMode() 指定將列作為字符流返回。
setCharSet() 將字符集設(shè)置為字符串指定的值。
setCharSetUString() 將字符集設(shè)置為UString指定的值。
setClob() 將參數(shù)設(shè)置為Clob值。
setDate() 將參數(shù)設(shè)置為Date值。
setDatabaseNCHARParam() 如果數(shù)據(jù)位于數(shù)據(jù)庫的NCHAR字符集中,則設(shè)置為true; 設(shè)置為false以恢復(fù)默認值。
setDataBuffer() 指定數(shù)據(jù)可用于讀取或?qū)懭氲臄?shù)據(jù)緩沖區(qū)。
setDataBufferArray() 指定數(shù)據(jù)緩沖區(qū)數(shù)組,其中數(shù)據(jù)可用于讀取或?qū)懭搿?/td>
setDouble() 將參數(shù)設(shè)置為C ++ double值。
setErrorOnNull() 啟用或禁用讀取NULL值的異常。
setErrorOnTruncate() 發(fā)生截斷時啟用或禁用異常。
setFloat() 將參數(shù)設(shè)置為C ++浮點值。
setInt() 將參數(shù)設(shè)置為C ++ int值。
setIntervalDS() 將參數(shù)設(shè)置為IntervalDS值。
setIntervalYM() 將參數(shù)設(shè)置為IntervalYM值。
setMaxIterations() 設(shè)置將為DML語句進行的最大調(diào)用次數(shù)。
setMaxParamSize() 設(shè)置可以從參數(shù)發(fā)送或返回的最大數(shù)據(jù)量。
setNull() 將參數(shù)設(shè)置為SQL NULL。
setNumber() 將參數(shù)設(shè)置為Number值。
setObject() 使用對象設(shè)置參數(shù)的值。
setPrefetchMemorySize() 設(shè)置OCCI將在內(nèi)部使用的內(nèi)存量,以存儲在每次往返服務(wù)器期間獲取的數(shù)據(jù)。
setPrefetchRowCount() 設(shè)置每次往返服務(wù)器時OCCI將在內(nèi)部獲取的行數(shù)。
setRef() 將參數(shù)的值設(shè)置為引用。
setRowid() 為綁定位置設(shè)置行byte數(shù)組格式的rowId
setSQL() 將新的SQL字符串與Statement對象關(guān)聯(lián)。
setSQLUString() 將新的SQL字符串與Statement對象關(guān)聯(lián); UNICODE格式。
setString() 設(shè)置指定索引的參數(shù)。
setTimestamp() 將參數(shù)設(shè)置為Timestamp值。
setUInt() 將參數(shù)設(shè)置為C ++ unsigned int值。
setUString() 設(shè)置指定索引的參數(shù),UNICODE格式。
setVector() 將參數(shù)設(shè)置為unsigned int的向量。
setVectorOfRefs() 將參數(shù)設(shè)置為矢量,如果類型是REF的集合時使用。
status() 返回語句的當前狀態(tài)。 當要寫入流數(shù)據(jù)時很有用。

每次創(chuàng)建Statement對象時,都會有內(nèi)存和資源等資源必須在客戶端和服務(wù)器端分配游標才能存儲該對象及其數(shù)據(jù)。為了節(jié)省內(nèi)存的重新分配,請嘗試重用Statement對象。創(chuàng)建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”);

為了節(jié)省更多的內(nèi)存重新分配,可以參數(shù)化將前三個SQL語句合并為一個,設(shè)置參數(shù),然后執(zhí)行。但是,更改輸入?yún)?shù)類型,因為必須執(zhí)行重新綁定每次類型改變。以下示例演示了參數(shù)化:

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();

對于經(jīng)常分批進行的一些操作,浪費了很多時間網(wǎng)絡(luò)往返服務(wù)器的通信時間。 OCCI提供了一個在單個網(wǎng)絡(luò)中發(fā)送多行信息的有效機制往返。此優(yōu)化適用于INSERT,UPDATE和DELETE。首先,您必須設(shè)置最大迭代次數(shù),然后設(shè)置最大值可變長度參數(shù)的參數(shù)大小。參數(shù)不能更改類型迭代操作。以下是上述INSERT的優(yōu)化形式:

//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提供對通過執(zhí)行Statement生成的數(shù)據(jù)表的訪問。按行順序檢索表行。在一行中,可以按任何順序訪問列值。ResultSet維護指向其當前數(shù)據(jù)行的游標。最初,光標位于第一行之前。下一個方法將光標移動到下一行。getxxx()方法檢索當前行的列值。您可以使用列的索引號檢索值。列從1開始編號。對于getxxx()方法,OCCI嘗試將基礎(chǔ)數(shù)據(jù)轉(zhuǎn)換為指定的C ++類型并返回C ++值。 SQL類型使用ResultSet ::getxxx()方法映射到C ++類型。ResultSet列的數(shù)量,類型和屬性由getColumnListMetaData()方法返回的MetaData對象提供。其常用的方法有:

Method Description
cancel() 取消ResultSet.
closeStream() 關(guān)閉指定的流對象。
getBDouble() 以BDouble的形式返回當前行中列的值。
getBfile() 以Bfile形式返回當前行中列的值.
getBFloat() 以BFloat形式返回當前行中列的值.
getBlob() 以Blob對象的形式返回當前行中列的值.
getBytes() 以Bytes數(shù)組的形式返回當前行中列的值。
getCharSet() 返回將獲取數(shù)據(jù)的字符集。
getCharSetUString() 返回將數(shù)據(jù)作為UString提取的字符集。
getClob() 以Clob對象的形式返回當前行中列的值。
getColumnListMetaData() 將結(jié)果集列的描述信息作為MetaData對象返回。
getCurrentStreamColumn() 返回當前可讀Stream的列索引.
getCurrentStreamRow() 返回正在處理的ResultSet的當前行。
getCursor() 獲取ResultSet的嵌套游標。
getDate() 以Date對象的形式返回當前行中列的值。
getDatabaseNCHARParam() 返回數(shù)據(jù)是否為NCHAR字符集。
getDouble() 以C ++ double的形式返回當前行中列的值。
getFloat() 以C ++ float形式返回當前行中列的值.
getInt() 以C ++ int的形式返回當前行中列的值。
getIntervalDS() 以IntervalDS的形式返回當前行中列的值。
getIntervalYM() 以IntervalYM形式返回當前行中列的值。
getMaxColumnSize() 返回列的最大值。
getNumArrayRows() 返回上次數(shù)組提取中獲取的實際行數(shù)。
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參數(shù)作為向量返回。
getVectorOfRefs() 返回當前位置的列作為Refs的向量。
isNull() 當前值是否是空。
isTruncated() 當前值是否被切割。
next() 使下一行成為ResultSet中的當前行。
preTruncationLength() 在截斷之前返回參數(shù)的實際長度。
setBinaryStreamMode() 指定將列作為二進制流返回。
setCharacterStreamMode() 指定將列作為字符流返回。
setCharSet() 指定要在其中返回數(shù)據(jù)的字符集。
setCharSetUString() 指定要在其中返回數(shù)據(jù)的字符集,UNICODE格式。
setDatabaseNCHARParam() 如果要從包含數(shù)據(jù)庫的NCHAR字符集中的數(shù)據(jù)的列檢索參數(shù),則必須通過傳遞true值來通知OCCI。
setDataBuffer() 指定要將數(shù)據(jù)提取到的數(shù)據(jù)緩沖區(qū),或者收集和分散綁定和定義的數(shù)據(jù)。
setErrorOnNull() 讀取NULL值時啟用或禁用異常。
setErrorOnTruncate() 發(fā)生截斷時啟用或禁用異常。
setMaxColumnSize() 指定列的最大數(shù)據(jù)量。
status() 返回ResultSet的當前狀態(tài)。

2.1.5 MetaData對象

MetaData對象可用于描述ResultSet中列的類型和屬性,或數(shù)據(jù)庫中的現(xiàn)有模式對象。它還提供有關(guān)整個數(shù)據(jù)庫的信息。

Method Description
getAttributeCount() 獲取屬性的個數(shù)作
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=() 將一個元數(shù)據(jù)對象分配給另一個。

MetaData類為Oracle提供大量的屬性值說明,包括表的屬性,列以及數(shù)據(jù)的屬性,我們可以根據(jù)屬性值來判斷該數(shù)據(jù)庫對象的屬性。常用的有:

屬性種類 說明
PTYPE_ARG 函數(shù)或者是存儲過程的參數(shù)
PTYPE_COL 表或者視圖的列
PTYPE_DATABASE 數(shù)據(jù)庫
PTYPE_FUNC 函數(shù)
PTYPE_PKG
PTYPE_PROC 存儲過程
PTYPE_SCHEMA SCHEMA
PTYPE_SEQ SEQUENCE
PTYPE_SYN SYNONYM
PTYPE_TABLE
PTYPE_TYPE 類型
PTYPE_TYPE_ARG 類型參數(shù)
PTYPE_TYPE_ATTR 類型屬性
PTYPE_TYPE_COLL 類型集合
PTYPE_TYPE_METHOD 類型方法
PTYPE_TYPE_RESULT 類型結(jié)果
PTYPE_UNK 未知對象
PTYPE_VIEW 視圖

具體的類型值的說明可以參考Oracle的官方文檔。

在數(shù)據(jù)庫編程中,OCCI其實用的不是非常多,也就造成了在實際應(yīng)用中可以查詢的資料不多,往往給編程者帶了困難。作者在多次踩坑以后總結(jié)出上述資料,比較詳細的介紹OCCI編程中常用的對象。希望可以和大家保持溝通和交流,互相學(xué)習(xí)和提高, 更多的C++知識,請關(guān)注《C語言專家集中營》。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3845

    瀏覽量

    64619
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1950

    瀏覽量

    34923
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2114

    瀏覽量

    73813

原文標題:Linux下的Oracle C++編程(OCCI)

文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    PLC編程軟件使用及基本指令編程練習(xí)

    實驗  編程軟件使用及基本指令編程練習(xí) 一、 實驗?zāi)康?、 熟悉PLC實驗裝置。2、 練習(xí)并掌握編程軟件的使用。
    發(fā)表于 09-29 14:01 ?1w次閱讀
    PLC<b class='flag-5'>編程</b>軟件使用及基本指令<b class='flag-5'>編程</b>練習(xí)

    用S7-200編程的幾個實例的編程技巧解析

    PLC編程技巧編程技巧編程技巧編程技巧編程技巧編程技巧
    發(fā)表于 11-19 13:46 ?0次下載

    LabVIEW編程技巧

    LabVIEW編程技巧LabVIEW編程技巧LabVIEW編程技巧
    發(fā)表于 02-23 16:59 ?151次下載

    編程進階

    關(guān)于keil的編程中,所遇到的相關(guān)問題及優(yōu)化,可以在今后的編程中潤色自己的編程,優(yōu)化自己的編程風(fēng)格
    發(fā)表于 05-16 14:31 ?2次下載

    linux-網(wǎng)絡(luò)編程-socket編程

    linux開發(fā)編程教程資料——linux-網(wǎng)絡(luò)編程-socket編程,感興趣的小伙伴們可以看一看。
    發(fā)表于 08-23 16:23 ?0次下載

    使用CCS進行DSP編程CCS編程入門

    使用CCS進行DSP編程CCS編程入門
    發(fā)表于 10-19 09:23 ?36次下載
    使用CCS進行DSP<b class='flag-5'>編程</b>CCS<b class='flag-5'>編程</b>入門

    PLC編程是什么?圖解PLC編程入門教程

    本文開始介紹了PLC編程的概念和PLC編程的七大特點,其次闡述了PLC編程工作原理與PLC的五種標準編程語言,最后介紹了PLC編程入門教程。
    發(fā)表于 04-19 08:42 ?7w次閱讀
    PLC<b class='flag-5'>編程</b>是什么?圖解PLC<b class='flag-5'>編程</b>入門教程

    ABB--codesys軟件編程基礎(chǔ)編程手冊

    ABB--codesys軟件編程基礎(chǔ)編程手冊免費下載。
    發(fā)表于 05-14 09:46 ?42次下載

    單片機編程技巧—狀態(tài)機編程

    學(xué)會一種好的編程框架或者一種編程思想,可能會受用終生!比如模塊化編程,框架式編程,狀態(tài)機編程等等,都是一種好的框架。
    發(fā)表于 02-08 16:08 ?12次下載
    單片機<b class='flag-5'>編程</b>技巧—狀態(tài)機<b class='flag-5'>編程</b>

    plc編程是什么 plc編程語言

    PLC編程是指通過PLC編程軟件,使用PLC編程語言(如Ladder Diagram、Function Block Diagram、Structured Text等)對PLC進行程序設(shè)計的過程
    發(fā)表于 04-14 15:44 ?7115次閱讀

    fpga編程與單片機編程的區(qū)別

    FPGA編程與單片機編程的主要區(qū)別體現(xiàn)在以下幾個方面。
    的頭像 發(fā)表于 03-14 17:16 ?1099次閱讀

    編程電源如何編程

    編程電源如何編程? 可編程電源是一種可以調(diào)節(jié)輸出電壓和電流的電源設(shè)備,廣泛應(yīng)用于電子設(shè)備測試、研發(fā)和生產(chǎn)等領(lǐng)域。通過編程,用戶可以根據(jù)需要設(shè)置電源的輸出參數(shù),實現(xiàn)自動化測試和控制。本
    的頭像 發(fā)表于 06-10 15:24 ?1505次閱讀

    PLC的編程方式及編程語言

    在工業(yè)自動化領(lǐng)域,PLC(Programmable Logic Controller,可編程邏輯控制器)因其強大的控制功能和靈活的編程方式而得到了廣泛應(yīng)用。PLC的編程方式和編程語言是
    的頭像 發(fā)表于 06-27 14:08 ?904次閱讀

    工業(yè)機器人的四種編程(示教編程、離線編程、自增強現(xiàn)實編程編程)剖析!

    當前機器人廣泛應(yīng)用于焊接、裝配、搬運、噴漆及打磨等領(lǐng)域,任務(wù)的復(fù)雜程度不斷增加,而用戶對產(chǎn)品的質(zhì)量、效率的追求越來越高。在這種形式下,機器人的編程方式、編程效率和質(zhì)量顯得越來越重要。降低編程的難度
    的頭像 發(fā)表于 08-30 12:14 ?3085次閱讀
    工業(yè)機器人的四種<b class='flag-5'>編程</b>(示教<b class='flag-5'>編程</b>、離線<b class='flag-5'>編程</b>、自增強現(xiàn)實<b class='flag-5'>編程</b>主<b class='flag-5'>編程</b>)剖析!

    plc編程語言編程相關(guān)技巧有哪些

    PLC(可編程邏輯控制器)編程語言及相關(guān)編程技巧是工業(yè)自動化領(lǐng)域中不可或缺的知識。 一、PLC編程語言概述 PLC編程語言主要包括梯形圖(L
    的頭像 發(fā)表于 10-21 16:56 ?427次閱讀