Oracle給各種編程語(yǔ)言都提供了編程接口,其中C++的編程模塊就是OCCI,通過(guò)OCCI我們可以很方便的訪問(wèn)數(shù)據(jù)的信息,讀取數(shù)據(jù)庫(kù)的屬性,下面我們看看怎么使用OCCI編程。本文使用Centos 7.0為例,Oracle的版本是12.2
一,環(huán)境準(zhǔn)備
1.1 默認(rèn)的Oracle安裝中沒(méi)有提供OCCI接口的包,需要我們?cè)贠racle官網(wǎng)下載,地址是:https://www.oracle.com/technetwork/topics/linuxsoft-082809.html
需要安裝下面幾個(gè)內(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)
直接運(yùn)行 #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)是一個(gè)易于使用且功能強(qiáng)大的C ++用于訪問(wèn)Oracle對(duì)象關(guān)系數(shù)據(jù)庫(kù)的接口。 OCCI對(duì)象interface是一種無(wú)縫且優(yōu)化的訪問(wèn)和操作機(jī)制來(lái)自數(shù)據(jù)庫(kù)的持久數(shù)據(jù)作為C ++對(duì)象。使用Objects接口和導(dǎo)航訪問(wèn)范例,有一個(gè)單一的對(duì)象模型應(yīng)用程序和數(shù)據(jù)庫(kù)。開發(fā)人員不需要實(shí)現(xiàn)任何用于將數(shù)據(jù)庫(kù)對(duì)象映射到C ++類對(duì)象的附加代碼。這是由OCCI通過(guò)編譯時(shí)生成的代碼和運(yùn)行時(shí)支持完成。結(jié)合Oracle的對(duì)象關(guān)系特性,OCCI和C ++,復(fù)雜和可以開發(fā)強(qiáng)大的面向?qū)ο蟮臄?shù)據(jù)庫(kù)應(yīng)用程序。
OCCI為訪問(wèn)和操作在數(shù)據(jù)庫(kù)中的對(duì)象提供了2種不同的模型。在導(dǎo)航訪問(wèn)模型中(使用Fetch操作),引用數(shù)據(jù)庫(kù)中的對(duì)象到客戶端,如果這些引用被取消或者關(guān)閉時(shí),那么就直接引用客戶端的對(duì)象緩存中。使用引用(作為屬性)和對(duì)對(duì)象之間的關(guān)系進(jìn)行編程,應(yīng)用程序可以引用和取消引用中的關(guān)聯(lián)對(duì)象關(guān)系。在使用導(dǎo)航訪問(wèn)模型的應(yīng)用程序中數(shù)據(jù)庫(kù)變得“不可見(jiàn)”,應(yīng)用程序似乎是“純粹的”C ++程序。
在OCCI的導(dǎo)航訪問(wèn)模型中,客戶端對(duì)象緩存在透明的管理數(shù)據(jù)庫(kù)對(duì)象(表示為C ++對(duì)象)中,應(yīng)用程序可以立即使用/取消引用,創(chuàng)建/更新/刪除對(duì)象。如果一個(gè)引用m被應(yīng)用程序取消,OCCI會(huì)搜索緩存中引用的對(duì)象,如果存在則返回緩存的對(duì)象;如果在緩存中找不到對(duì)象,則從數(shù)據(jù)庫(kù)中獲取該對(duì)象。這種取消引用過(guò)程也被稱為數(shù)據(jù)庫(kù)術(shù)語(yǔ)中的混合或固定。提交事務(wù)時(shí)通過(guò)OCCI應(yīng)用程序,對(duì)象緩存刷新所有“臟”(new / updated / deleted)對(duì)象到數(shù)據(jù)庫(kù)所在的位置,操作反映在持久性存儲(chǔ)中。對(duì)象緩存維護(hù)指向C ++對(duì)象實(shí)例的指針表示相應(yīng)的數(shù)據(jù)庫(kù)對(duì)象。
在關(guān)聯(lián)訪問(wèn)模型中,SQL查詢和DML語(yǔ)句是執(zhí)行以獲取和更新數(shù)據(jù)庫(kù)中的對(duì)象。 沒(méi)有任何作用關(guān)聯(lián)訪問(wèn)模型中的對(duì)象緩存。
與大多數(shù)C++數(shù)據(jù)庫(kù)編程類似,OCCI也提供了基礎(chǔ)的編程接口,主要是Environment,Connection,ConnectionPool,Statement,ResultSet,MetaData等,這些對(duì)象的調(diào)用關(guān)系如下:
使用OCCI編程遵循以下幾個(gè)基本的操作步驟(不可缺省)
1,初始化環(huán)境Environment。在對(duì)象模式下初始化OCCI編程環(huán)境。您的應(yīng)用程序很可能需要在頭文件中包含數(shù)據(jù)庫(kù)對(duì)象的C ++類表示。
2,建立連接Connection。使用環(huán)境句柄建立與數(shù)據(jù)庫(kù)服務(wù)器的連接。
3,準(zhǔn)備SQL語(yǔ)句statement。這是本地(客戶端)步驟,可能包括綁定占位符。在對(duì)象關(guān)系應(yīng)用程序中,此SQL語(yǔ)句應(yīng)該向?qū)ο蠓祷匾茫≧EF)。
4,訪問(wèn)該對(duì)象,將準(zhǔn)備好的語(yǔ)句與數(shù)據(jù)庫(kù)服務(wù)器關(guān)聯(lián),然后執(zhí)行該語(yǔ)句。
5,關(guān)閉對(duì)象,關(guān)閉相關(guān)的ResultSet對(duì)象
6,釋放資源,關(guān)閉statement對(duì)象。
7,斷開鏈接,關(guān)閉Connection
8,封閉環(huán)境,終止Environment對(duì)象。
下面我給大家詳細(xì)介紹這幾個(gè)對(duì)象,以及碰到的注意事項(xiàng)。
2.1.1 Environment對(duì)象
Environment類提供OCCI環(huán)境來(lái)管理OCCI對(duì)象的內(nèi)存和其他資源。應(yīng)用程序可以具有多個(gè)OCCI環(huán)境。每個(gè)環(huán)境都有自己的堆和線程安全互斥體。Environment對(duì)象的方法以及用途如下:
Method | Summary |
createConnection() | 建立與指定數(shù)據(jù)庫(kù)的連接。 |
createConnectionPool() | 創(chuàng)建連接池。 |
createEnvironment() | 創(chuàng)建一個(gè)Environment對(duì)象。 |
createStatelessConnectionPool() | 創(chuàng)建無(wú)狀態(tài)連接池。 |
enableSubscription() | 啟用訂閱通知 |
disableSubscription() | 禁用訂閱通知 |
getCacheMaxSize() | 獲得Cache的最大值。 |
getCacheOptSize() | 獲得緩存最佳堆大小。 |
getCacheSortedFlush() | 獲得緩存排序標(biāo)志的設(shè)置。 |
getClientVersion() | 返回客戶端庫(kù)的版本。 |
getCurrentHeapSize() | 返回分配給當(dāng)前環(huán)境中所有對(duì)象的當(dāng)前內(nèi)存量。 |
getLDAPAdminContext() | 使用LDAP打開通知注冊(cè)時(shí)返回管理上下文。 |
getLDAPAuthentication() | 使用LDAP打開通知注冊(cè)時(shí)返回身份驗(yàn)證模式。 |
getLDAPHost() | 返回運(yùn)行LDAP服務(wù)器的主機(jī)。 |
getLDAPPort() | 返回LDAP服務(wù)器正在偵聽的端口。 |
getMap() | 返回當(dāng)前環(huán)境的Map。 |
getOCIEnvironment() | 返回與當(dāng)前環(huán)境關(guān)聯(lián)的OCI環(huán)境。 |
getXAConnection() | 創(chuàng)建與數(shù)據(jù)庫(kù)的XA連接。 |
getXAEnvironment() | 創(chuàng)建XA Environment對(duì)象。 |
releaseXAConnection() | 釋放由getXAConnection()調(diào)用分配的所有資源。 |
releaseXAEnvironment() | 釋放getXAEnvironment()調(diào)用分配的所有資源。 |
setCacheMaxSize() | 指定客戶端對(duì)象緩存的最大大小,以最佳大小的百分比表示。 |
setCacheOptSize() | 指定客戶端對(duì)象高速緩存的最佳大小(以字節(jié)為單位)。 |
setCacheSortedFlush() | 指定是否在刷新之前按表順序?qū)彺孢M(jìn)行排序。 |
setLDAPAdminContext() | 指定LDAP客戶端的管理上下文。 |
setLDAPAuthentication() | 指定LDAP身份驗(yàn)證模式。 |
setLDAPHostAndPort() | 指定LDAP服務(wù)器主機(jī)和端口。 |
setLDAPLoginNameAndPassword() | 指定連接LDAP服務(wù)器時(shí)的登錄名和密碼。 |
terminateConnection() | 關(guān)閉連接并釋放所有相關(guān)資源。 |
terminateConnectionPool() | 關(guān)閉連接池并釋放所有相關(guān)資源。 |
terminateEnvironment() | 關(guān)閉環(huán)境,釋放所有資源。 |
terminateStatelessConnectionPool() | 關(guān)閉無(wú)狀態(tài)連接池并釋放所有相關(guān)資源。 |
我們用的最多的幾個(gè)Environment方法是:
createEnvironment(),創(chuàng)建鏈接環(huán)境。創(chuàng)建一個(gè)Environment對(duì)象。 它是使用setMemMgrFunctions()方法中指定的指定內(nèi)存管理函數(shù)創(chuàng)建的。 如果未指定內(nèi)存管理器函數(shù),則OCCI使用其自己的默認(rèn)函數(shù)。最終必須關(guān)閉Environment對(duì)象以釋放它已獲取的所有系統(tǒng)資源。如果指定的模式是THREADED_MUTEXED或THREADED_UNMUTEXED,則所有三個(gè)內(nèi)存管理功能必須是線程安全的。
createConnection() 用來(lái)創(chuàng)建一個(gè)指向數(shù)據(jù)庫(kù)的鏈接,其調(diào)用方式是:
Connection * createConnection(
const string&userName,
const string&password,
const string&connectString="")=0;
另外還有幾個(gè)重載的函數(shù),
Connection * createConnection(
const string&userName,
const string&password,
const string&connectString,
const string&connectionClass,
constConnection::Purity &purity)=0;
可以用來(lái)創(chuàng)建一個(gè)駐留在連接池的鏈接。如果指定connectionClass參數(shù),則可以創(chuàng)建UTF16的鏈接池,此時(shí)需要在Environment中設(shè)置OCCIUTIF16模式。
createConnectionPool(),創(chuàng)建連接,可以指定UNICODE和非UNICODE的兩種方式。其實(shí)Oracle數(shù)據(jù)庫(kù)包含一個(gè)名為SYS_DEFAULT_CONNECTION_POOL的默認(rèn)連接池。 默認(rèn)情況下,此池已創(chuàng)建,但尚未啟動(dòng)。 要啟用數(shù)據(jù)庫(kù)駐留連接池,必須顯式啟動(dòng)連接池。
您可以使用DBMS_CONNECTION_POOL包中的過(guò)程根據(jù)您的用法配置連接池。在Oracle Real Application Clusters(RAC)環(huán)境中,配置參數(shù)適用于每個(gè)Oracle RAC實(shí)例。
在SQLPlus命令行中,運(yùn)行EXECUTE DBMS_CONNECTION_POOL.START_POOL(); 就可以啟動(dòng)或一個(gè)連接池。
使用 EXECUTE DBMS_CONNECTION_POOL.ALTER_PARAM ('','MINSIZE','10'); 可以配置連接池的參數(shù)。
使用 EXECUTE DBMS_CONNECTION_POOL.STOPT_POOL(); 可以關(guān)閉連接池。
2.1.2 Connection對(duì)象
Connection類表示與特定數(shù)據(jù)庫(kù)的連接。同時(shí)提供了在連接的上下文中,執(zhí)行SQL語(yǔ)句并返回結(jié)果。其常用的方法有:
Method | Summary |
changePassword() | 更改當(dāng)前用戶的密碼。 |
commit() | 提交自上次提交或回滾以來(lái)所做的更改,并釋放會(huì)話持有的任何數(shù)據(jù)庫(kù)鎖。 |
createStatement() | 創(chuàng)建一個(gè)Statement對(duì)象來(lái)執(zhí)行SQL語(yǔ)句。 |
flushCache() | 刷新與連接關(guān)聯(lián)的對(duì)象緩存。 |
getClientCharSet() | 返回默認(rèn)的客戶端字符集。 |
getClientCharSetUString() | 返回UString中啟用全球化的客戶端字符集(UNICODE)。 |
getClientNCHARCharSet() | 返回默認(rèn)的客戶端NCHAR字符集。 |
getClientNCHARCharSetUString() | 返回UString中啟用全球化的客戶端NCHAR字符集。 |
getClientVersion() | 返回當(dāng)前客戶端的版本。 |
getMetaData() | 返回可從該連接訪問(wèn)的對(duì)象的元數(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)的標(biāo)記。 |
isCached() | statement 是否有緩存 |
pinVectorOfRefs() | 在一次往返中將Ref對(duì)象的整個(gè)向量固定到對(duì)象緩存中; 固定對(duì)象可通過(guò)OUT參數(shù)向量獲得。 |
postToSubscriptions() | 發(fā)布訂閱通知。 |
readVectorOfBfiles() | 在單個(gè)服務(wù)器往返中讀取多個(gè)Bfiles。 |
readVectorOfBlobs() | 在單個(gè)服務(wù)器往返中讀取多個(gè)Blob。 |
readVectorOfClobs() | 在單個(gè)服務(wù)器往返中讀取多個(gè)Clobs。 |
registerSubscriptions() | 注冊(cè)幾個(gè)可以進(jìn)行通知的Subscription |
rollback() | 回滾自上次提交或回滾以來(lái)所做的所有更改,并釋放會(huì)話持有的任何數(shù)據(jù)庫(kù)鎖。 |
setCollectionAccessMode() | 根據(jù)需要禁用或啟用集合緩存。 |
setStmtCacheSize() | 啟用或禁用Statement緩存。 |
setTAFNotify() | 在Connection對(duì)象上注冊(cè)故障轉(zhuǎn)移回調(diào)函數(shù)。 |
terminateStatement() | 關(guān)閉Statement對(duì)象并釋放與其關(guān)聯(lián)的所有資源。 |
unregisterSubscription() | 取消注冊(cè)Subscription,關(guān)閉其通知。 |
writeVectorOfBlobs() | 在單個(gè)服務(wù)器往返中寫入多個(gè)Blob。 |
writeVectorOfClobs() | 在一個(gè)服務(wù)器往返中寫入多個(gè)Clobs。 |
其中Connection對(duì)象中最常用的方法就是Commit,rollback, CreateStatement, ternminateStatement等,這些方法是必要,也是大家經(jīng)常使用到的,其使用方法和其他的標(biāo)準(zhǔn)SQL方法是一致的,我這里不再贅述了。
2.1.3 Statement對(duì)象
Statement對(duì)象用于執(zhí)行SQL語(yǔ)句。 該語(yǔ)句可以是返回結(jié)果集的查詢,也可以是返回更新計(jì)數(shù)的非查詢語(yǔ)句。 非查詢SQL可以是insert,update或delete語(yǔ)句。 非查詢SQL語(yǔ)句也可以是DML語(yǔ)句(例如create,grant等)或存儲(chǔ)過(guò)程調(diào)用。
查詢,插入/更新/刪除或存儲(chǔ)過(guò)程調(diào)用語(yǔ)句可以具有IN綁定參數(shù),而存儲(chǔ)過(guò)程調(diào)用語(yǔ)句可以具有OUT綁定參數(shù)或綁定IN和OUT參數(shù),稱為IN / OUT參數(shù)。
Method | Description |
addIteration() | 添加執(zhí)行的iteration |
closeResultSet() | 立即釋放結(jié)果集的數(shù)據(jù)庫(kù)和OCCI資源,而不是等待自動(dòng)釋放。 |
closeStream() | 關(guān)閉參數(shù)流指定的流。 |
disableCaching() | 禁用Statement緩存。 |
execute() | 運(yùn)行SQL語(yǔ)句。 |
executeArrayUpdate() | 運(yùn)行插入,更新和刪除,僅使用在setDataBuffer()或綁定參數(shù)的流接口的語(yǔ)句。 |
executeQuery() | 運(yùn)行返回單個(gè)ResultSet的SQL語(yǔ)句。 |
executeUpdate() | 運(yùn)行不返回ResultSet的SQL語(yǔ)句。 |
getAutoCommit() | 返回當(dāng)前的自動(dòng)提交狀態(tài)。 |
getBatchErrorMode() | 返回批處理錯(cuò)誤模式的狀態(tài)。 |
getBDouble() | 返回IEEE754標(biāo)準(zhǔn)的OUBLE的值作為Double對(duì)象。 |
getBfile() | 返回BFILE作為Bfile對(duì)象的值。 |
getBFloat() | 返回IEEE754 FLOAT的值作為BFloat對(duì)象。 |
getBlob() | 將BLOB的值作為Blob對(duì)象返回。 |
getBytes() | 以字節(jié)形式返回SQL BINARY或VARBINARY參數(shù)的值。 |
getCharSet() | 以字符串形式返回對(duì)指定參數(shù)有效的字符集。 |
getCharSetUString() | 以UString形式返回對(duì)指定參數(shù)有效的字符集。 |
getClob() | 將CLOB的值作為Clob對(duì)象返回。 |
getConnection() | 返回實(shí)例化Statement對(duì)象的連接。 |
getCurrentIteration() | 返回正在處理的當(dāng)前迭代的迭代次數(shù)。 |
getCurrentStreamIteration() | 返回要讀取或?qū)懭肓鲾?shù)據(jù)的當(dāng)前迭代。 |
getCurrentStreamParam() | 返回必須讀取或?qū)懭氲漠?dāng)前輸出Stream的參數(shù)索引。 |
getCursor() | 返回OUT參數(shù)的REF CURSOR值作為ResultSet。 |
getDatabaseNCHARParam() | 返回?cái)?shù)據(jù)是否為NCHAR字符集。 |
getDate() | 以Date對(duì)象的形式返回參數(shù)的值 |
getBDouble() | 將參數(shù)的值作為IEEE754 double返回。 |
getDouble() | 以C ++ double的形式返回參數(shù)的值。 |
getBFloat() | 以IEEE754 float形式返回參數(shù)的值。 |
getFloat() | 以C ++ float形式返回參數(shù)的值。 |
getInt() | 以C ++ int形式返回參數(shù)的值。 |
getIntervalDS() | 以IntervalDS對(duì)象的形式返回參數(shù)的值。 |
getIntervalYM() | 以IntervalYM對(duì)象的形式返回參數(shù)的值。 |
getMaxIterations() | 返回當(dāng)前限制的最大迭代次數(shù)。 |
getMaxParamSize() | 返回當(dāng)前最大參數(shù)的大小。 |
getNumber() | 以Number對(duì)象的形式返回參數(shù)的值。 |
getObject() | 以PObject的形式返回參數(shù)的值。 |
getOCIStatement() | 返回與Statement關(guān)聯(lián)的OCI語(yǔ)句句柄。 |
getRef() | 以REFAny形式返回REF參數(shù)的值 |
getResultSet() | 以ResultSet的形式返回當(dāng)前結(jié)果。 |
getRowid() | 將行id參數(shù)值作為Bytes對(duì)象返回。 |
getSQL() | 返回與Statement對(duì)象關(guān)聯(lián)的當(dāng)前SQL字符串。 |
getSQLUString() | 返回與Statement對(duì)象關(guān)聯(lián)的當(dāng)前SQL字符串; UNICODE格式的。 |
getStream() | 以流形式返回參數(shù)的值。 |
getString() | 以字符串形式返回參數(shù)的值。 |
getTimestamp() | 以Timestamp對(duì)象的形式返回參數(shù)的值 |
getUInt() | 以C ++ unsigned int的形式返回參數(shù)的值 |
getUpdateCount() | 返回當(dāng)前結(jié)果作為非查詢語(yǔ)句的更新計(jì)數(shù)。 |
getUString() | 返回UString的值。 |
getVector() | 將指定參數(shù)作為向量返回。 |
getVectorOfRefs() | 返回當(dāng)前位置的列作為REF的向量。 |
isNull() | 檢查參數(shù)是否為NULL。 |
isTruncated() | 檢查值是否被截?cái)唷?/td> |
preTruncationLength() | 在截?cái)嘀胺祷貐?shù)的實(shí)際長(zhǎng)度. |
registerOutParam() | 注冊(cè)O(shè)UT參數(shù)的類型和最大大小. |
setAutoCommit() | 指定自動(dòng)提交模式。 |
setBatchErrorMode() | 啟用或禁用批處理錯(cuò)誤處理模式。 |
setBDouble() | 將參數(shù)設(shè)置為IEEE雙精度值。 |
setBfile() | 將參數(shù)設(shè)置為Bfile值。 |
setBFloat() | 將參數(shù)設(shè)置為IEEE浮點(diǎn)值。 |
setBinaryStreamMode() | 指定將列作為二進(jìn)制流返回。 |
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ù)庫(kù)的NCHAR字符集中,則設(shè)置為true; 設(shè)置為false以恢復(fù)默認(rèn)值。 |
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ā)生截?cái)鄷r(shí)啟用或禁用異常。 |
setFloat() | 將參數(shù)設(shè)置為C ++浮點(diǎn)值。 |
setInt() | 將參數(shù)設(shè)置為C ++ int值。 |
setIntervalDS() | 將參數(shù)設(shè)置為IntervalDS值。 |
setIntervalYM() | 將參數(shù)設(shè)置為IntervalYM值。 |
setMaxIterations() | 設(shè)置將為DML語(yǔ)句進(jìn)行的最大調(diào)用次數(shù)。 |
setMaxParamSize() | 設(shè)置可以從參數(shù)發(fā)送或返回的最大數(shù)據(jù)量。 |
setNull() | 將參數(shù)設(shè)置為SQL NULL。 |
setNumber() | 將參數(shù)設(shè)置為Number值。 |
setObject() | 使用對(duì)象設(shè)置參數(shù)的值。 |
setPrefetchMemorySize() | 設(shè)置OCCI將在內(nèi)部使用的內(nèi)存量,以存儲(chǔ)在每次往返服務(wù)器期間獲取的數(shù)據(jù)。 |
setPrefetchRowCount() | 設(shè)置每次往返服務(wù)器時(shí)OCCI將在內(nèi)部獲取的行數(shù)。 |
setRef() | 將參數(shù)的值設(shè)置為引用。 |
setRowid() | 為綁定位置設(shè)置行byte數(shù)組格式的rowId |
setSQL() | 將新的SQL字符串與Statement對(duì)象關(guān)聯(lián)。 |
setSQLUString() | 將新的SQL字符串與Statement對(duì)象關(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的集合時(shí)使用。 |
status() | 返回語(yǔ)句的當(dāng)前狀態(tài)。 當(dāng)要寫入流數(shù)據(jù)時(shí)很有用。 |
每次創(chuàng)建Statement對(duì)象時(shí),都會(huì)有內(nèi)存和資源等資源必須在客戶端和服務(wù)器端分配游標(biāo)才能存儲(chǔ)該對(duì)象及其數(shù)據(jù)。為了節(jié)省內(nèi)存的重新分配,請(qǐng)嘗試重用Statement對(duì)象。創(chuàng)建Statement對(duì)象后,只需使用它們即可重用它們,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ù)化將前三個(gè)SQL語(yǔ)句合并為一個(gè),設(shè)置參數(shù),然后執(zhí)行。但是,更改輸入?yún)?shù)類型,因?yàn)楸仨殘?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();
對(duì)于經(jīng)常分批進(jìn)行的一些操作,浪費(fèi)了很多時(shí)間網(wǎng)絡(luò)往返服務(wù)器的通信時(shí)間。 OCCI提供了一個(gè)在單個(gè)網(wǎng)絡(luò)中發(fā)送多行信息的有效機(jī)制往返。此優(yōu)化適用于INSERT,UPDATE和DELETE。首先,您必須設(shè)置最大迭代次數(shù),然后設(shè)置最大值可變長(zhǎng)度參數(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對(duì)象
ResultSet提供對(duì)通過(guò)執(zhí)行Statement生成的數(shù)據(jù)表的訪問(wèn)。按行順序檢索表行。在一行中,可以按任何順序訪問(wèn)列值。ResultSet維護(hù)指向其當(dāng)前數(shù)據(jù)行的游標(biāo)。最初,光標(biāo)位于第一行之前。下一個(gè)方法將光標(biāo)移動(dòng)到下一行。getxxx()方法檢索當(dāng)前行的列值。您可以使用列的索引號(hào)檢索值。列從1開始編號(hào)。對(duì)于getxxx()方法,OCCI嘗試將基礎(chǔ)數(shù)據(jù)轉(zhuǎn)換為指定的C ++類型并返回C ++值。 SQL類型使用ResultSet ::getxxx()方法映射到C ++類型。ResultSet列的數(shù)量,類型和屬性由getColumnListMetaData()方法返回的MetaData對(duì)象提供。其常用的方法有:
Method | Description |
cancel() | 取消ResultSet. |
closeStream() | 關(guān)閉指定的流對(duì)象。 |
getBDouble() | 以BDouble的形式返回當(dāng)前行中列的值。 |
getBfile() | 以Bfile形式返回當(dāng)前行中列的值. |
getBFloat() | 以BFloat形式返回當(dāng)前行中列的值. |
getBlob() | 以Blob對(duì)象的形式返回當(dāng)前行中列的值. |
getBytes() | 以Bytes數(shù)組的形式返回當(dāng)前行中列的值。 |
getCharSet() | 返回將獲取數(shù)據(jù)的字符集。 |
getCharSetUString() | 返回將數(shù)據(jù)作為UString提取的字符集。 |
getClob() | 以Clob對(duì)象的形式返回當(dāng)前行中列的值。 |
getColumnListMetaData() | 將結(jié)果集列的描述信息作為MetaData對(duì)象返回。 |
getCurrentStreamColumn() | 返回當(dāng)前可讀Stream的列索引. |
getCurrentStreamRow() | 返回正在處理的ResultSet的當(dāng)前行。 |
getCursor() | 獲取ResultSet的嵌套游標(biāo)。 |
getDate() | 以Date對(duì)象的形式返回當(dāng)前行中列的值。 |
getDatabaseNCHARParam() | 返回?cái)?shù)據(jù)是否為NCHAR字符集。 |
getDouble() | 以C ++ double的形式返回當(dāng)前行中列的值。 |
getFloat() | 以C ++ float形式返回當(dāng)前行中列的值. |
getInt() | 以C ++ int的形式返回當(dāng)前行中列的值。 |
getIntervalDS() | 以IntervalDS的形式返回當(dāng)前行中列的值。 |
getIntervalYM() | 以IntervalYM形式返回當(dāng)前行中列的值。 |
getMaxColumnSize() | 返回列的最大值。 |
getNumArrayRows() | 返回上次數(shù)組提取中獲取的實(shí)際行數(shù)。 |
getNumber() | 以Number對(duì)象的形式返回當(dāng)前行中列的值。 |
getObject() | 以PObject的形式返回當(dāng)前行中列的值。 |
getRef() | 返回當(dāng)前行中列的值作為Ref. |
getRowid() | 返回SELECT FOR UPDATE語(yǔ)句的當(dāng)前ROWID。 |
getRowPosition() | 返回當(dāng)前行位置的行id。 |
getStatement() | 返回ResultSet的Statement。 |
getStream() | 以Stream形式返回當(dāng)前行中列的值。 |
getString() | 以字符串形式返回當(dāng)前行中列的值。 |
getTimestamp() | 以Timestamp對(duì)象的形式返回當(dāng)前行中列的值。 |
getUInt() | 以C ++ unsigned int的形式返回當(dāng)前行中列的值 |
getUString() | 以UString形式返回當(dāng)前行中列的值。 |
getVector() | 將指定的collection參數(shù)作為向量返回。 |
getVectorOfRefs() | 返回當(dāng)前位置的列作為Refs的向量。 |
isNull() | 當(dāng)前值是否是空。 |
isTruncated() | 當(dāng)前值是否被切割。 |
next() | 使下一行成為ResultSet中的當(dāng)前行。 |
preTruncationLength() | 在截?cái)嘀胺祷貐?shù)的實(shí)際長(zhǎng)度。 |
setBinaryStreamMode() | 指定將列作為二進(jìn)制流返回。 |
setCharacterStreamMode() | 指定將列作為字符流返回。 |
setCharSet() | 指定要在其中返回?cái)?shù)據(jù)的字符集。 |
setCharSetUString() | 指定要在其中返回?cái)?shù)據(jù)的字符集,UNICODE格式。 |
setDatabaseNCHARParam() | 如果要從包含數(shù)據(jù)庫(kù)的NCHAR字符集中的數(shù)據(jù)的列檢索參數(shù),則必須通過(guò)傳遞true值來(lái)通知OCCI。 |
setDataBuffer() | 指定要將數(shù)據(jù)提取到的數(shù)據(jù)緩沖區(qū),或者收集和分散綁定和定義的數(shù)據(jù)。 |
setErrorOnNull() | 讀取NULL值時(shí)啟用或禁用異常。 |
setErrorOnTruncate() | 發(fā)生截?cái)鄷r(shí)啟用或禁用異常。 |
setMaxColumnSize() | 指定列的最大數(shù)據(jù)量。 |
status() | 返回ResultSet的當(dāng)前狀態(tài)。 |
2.1.5 MetaData對(duì)象
MetaData對(duì)象可用于描述ResultSet中列的類型和屬性,或數(shù)據(jù)庫(kù)中的現(xiàn)有模式對(duì)象。它還提供有關(guān)整個(gè)數(shù)據(jù)庫(kù)的信息。
Method | Description |
getAttributeCount() | 獲取屬性的個(gè)數(shù)作 |
getAttributeId() | 獲取指定屬性的ID |
getAttributeType() | 返回屬性類型。 |
getBoolean() | 以C ++布爾值的形式獲取屬性的值。 |
getInt() | 獲取C++ int的屬性值。 |
getMetaData() | 獲取屬性的MetaData對(duì)象 |
getNumber() | 以Number對(duì)象的形式返回指定的屬性。 |
getRef() |
以Ref |
getString() | 獲取String的屬性值。 |
getTimeStamp() | 獲取Timestamp的屬性值 |
getUInt() | 獲取C ++ unsigned int的屬性值。 |
getUString() | 獲取UString的屬性值。 |
getVector() | 獲取C ++向量的屬性值。 |
operator=() | 將一個(gè)元數(shù)據(jù)對(duì)象分配給另一個(gè)。 |
MetaData類為Oracle提供大量的屬性值說(shuō)明,包括表的屬性,列以及數(shù)據(jù)的屬性,我們可以根據(jù)屬性值來(lái)判斷該數(shù)據(jù)庫(kù)對(duì)象的屬性。常用的有:
屬性種類 | 說(shuō)明 |
PTYPE_ARG | 函數(shù)或者是存儲(chǔ)過(guò)程的參數(shù) |
PTYPE_COL | 表或者視圖的列 |
PTYPE_DATABASE | 數(shù)據(jù)庫(kù) |
PTYPE_FUNC | 函數(shù) |
PTYPE_PKG | 包 |
PTYPE_PROC | 存儲(chǔ)過(guò)程 |
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 | 未知對(duì)象 |
PTYPE_VIEW | 視圖 |
具體的類型值的說(shuō)明可以參考Oracle的官方文檔。
在數(shù)據(jù)庫(kù)編程中,OCCI其實(shí)用的不是非常多,也就造成了在實(shí)際應(yīng)用中可以查詢的資料不多,往往給編程者帶了困難。作者在多次踩坑以后總結(jié)出上述資料,比較詳細(xì)的介紹OCCI編程中常用的對(duì)象。希望可以和大家保持溝通和交流,互相學(xué)習(xí)和提高, 更多的C++知識(shí),請(qǐng)關(guān)注《C語(yǔ)言專家集中營(yíng)》。
-
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3910瀏覽量
65994 -
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1955瀏覽量
36422 -
C++
+關(guān)注
關(guān)注
22文章
2118瀏覽量
75005
原文標(biāo)題:Linux下的Oracle C++編程(OCCI)
文章出處:【微信號(hào):C_Expert,微信公眾號(hào):C語(yǔ)言專家集中營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
PLC編程軟件使用及基本指令編程練習(xí)

編程進(jìn)階
linux-網(wǎng)絡(luò)編程-socket編程
PLC編程是什么?圖解PLC編程入門教程

ABB--codesys軟件編程基礎(chǔ)編程手冊(cè)
單片機(jī)編程技巧—狀態(tài)機(jī)編程

plc編程是什么 plc編程語(yǔ)言
可編程電源如何編程
PLC的編程方式及編程語(yǔ)言
工業(yè)機(jī)器人的四種編程(示教編程、離線編程、自增強(qiáng)現(xiàn)實(shí)編程主編程)剖析!

評(píng)論