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语言专家集中营》。
全部0条评论
快来发表一下你的评论吧 !