网站建设技术质量指标,骄阳房地产网站,动漫设计专业就业前景,苏州代理注册公司来源#xff1a;http://blog.csdn.net/gumingyaotangwei/article/details/7337893 OCCI数据库Oracle编程步骤 1#xff0e; 配置环境 #xff08;1#xff09; Occi访问数据库需要occi.h头文件#xff0c;此文件在oracle安装目录下#xff0c;必须有oracle库的支持。安装…来源http://blog.csdn.net/gumingyaotangwei/article/details/7337893 OCCI数据库Oracle编程步骤 1 配置环境 1 Occi访问数据库需要occi.h头文件此文件在oracle安装目录下必须有oracle库的支持。安装oracle服务端或客户端 2 配置NLS_LANG环境变量必须与数据库的字符编码一致否则可能出现中文乱码 3 配置环境变量使客户端支持中文显示 4 安装C编程工具和g编译工具。 2 编写C程序 1 Environment类创建occi环境变量 2 Environment类下的createConnection方法创建连接数据库的Connection对象 3 Statement类创建对象由数据库连接对象调用createStatement方法创建 4 Statement类创建对象调用setSQL准备SQL语句 5 Statement类创建对象调用execute()或executeUpdate或executeQurey()或executeArrayUpdate方法执行查询如果是查询的创建ResultSet对象接收数据集如果是数据更新回插入Statement:: setAutoCommit (TRUE); 设置自动提交Statement::setAutoCommit(FALSE); 设置手动提交手动提交Connection::commit();Connection::rollback(); 6 Statement类创建对象调用getxxx()方法获取字段数据 7 terminateStatement()终止Statement对象 8 terminateConnection()断开数据库连接 9 Environment::terminateEnvironment()终止环境变量。
#include iostream
#include occi.h//occi头文件
//声明命名空间
using namespace oracle::occi;
using namespace std;int main ()
{Environment *env; Connection *conn; Statement *stmt;ResultSet *rs;string username system;//用户名string password st1234;//密码string connstring orcl;//数据库连接字符串string sql,strname;int isno;env Environment::createEnvironment();//创建环境变量conn env-createConnection(username,password,connstring); //创建数据库连接对象stmt conn-createStatement();//创Statement对象sql SELECT u_id,u_name,to_char(u_date,yyyy-mm-dd hh24:mi:ss) FROM student;stmt-setSQL(sql);//准备SQL语句try{rs stmt-executeQuery();//执行SQL语句返回结果集while (rs-next()) //取数据{isno rs-getInt(1);strnamers-getString(2); cout isno AND strname endl;coutrs-getString(3)endl;}cout SELECT SUCCESS endl;} catch(SQLException ex) //异常处理{cout Error Number ex.getErrorCode() endl;cout ex.getMessage() endl;}conn-terminateStatement(stmt);//终止Statement对象env-terminateConnection(conn);//断开数据库连接Environment::terminateEnvironment(env);// 终止环境变量return 1;
}3 编写makefile文件 Makefile: includepath${ORACLE_HOME}/rdbms/public libpath${ORACLE_HOME}/lib libfile-L ${libpath} -locci -lclntsh /usr/lib/libstdc.so.5 incfile-I ${includepath}
occiselect:select.cpp g -o occiselect select.cpp ${libfile} ${incfile} clean: rm occiselect 4 编译程序 Make occiselect. 1. OCCI编程模式
1.1. 总体流程图 编写OCCI程序的总体流程图如下所示 1.2. 执行SQL语句的流程图
在OCCI中处理SELECT语句跟处理INSERT、UPDATE、CREATE等语句的方法是不一样的其中SELECT语句是有返回结果其它语句没有返回结果所以必须区分SQL语句是否为查询语句然后按照各自的流程处理。流程图如下所示 注标*号的过程为可选项 2. 流程图具体说明
2.1. 创建与终止OCCI环境变量 创建OCCI环境变量
Environment类是OCCI程序的基础类所有的OCCI对象的建立都是依计Environment对象来创建的所以Environment对象的建立必须放在第一位而且也必须是最后一个被终止的。例如首先创建一个Environment对象env然后通过env创建一个Connection对象connconn是连接了数据库的对象终止时却反过来先终止对象conn再终止对象env。具体Environment对象的创建方法如下所示 Environment *env Environment::createEnvironment(); 注意createEnvironment()方法有以下几个参数模式
1 在线程环境中运行分为互斥线程(THREADEC_MUTEXED)、并行线程(THREADEC_UMMUTEXED)。
2 使用对象OBJECT。
3 利用共享数据结构SHARED。 终止OCCI环境变量
Environment对象的终止必须是放在最后一位即等所有其它OCCI对象被终止完后再终止Environment对象。终止Environment对象的方法如下所示 Environment::terminateEnvironment(env);
2.2. 连接与断开数据库 连接数据库
创建完一个Environment对象env后可以调用Environment类下的方法createConnection()来创建一个Connection对象conn通过createConnection()方法我们可以连接到任意一个数据库中。连接数据库的具体方法如下所示 Connection *conn env-createConnection(usename,password,[connectionstring]); 参数说明usename是登录数据库的用户名 password是登录数据库用户的密码 connectstingr是数据库的连接串(可选)。 断开数据库
当对数据库操作完成之后我们必须断开程序与数据库的连接断开数据库的连接方法与创建的方法一样来自Environment类下的terminateConnection()函数。方法如下所示 env-terminateConnection(conn);
2.3. 创建与断开连接池 创建连接池
对于很多共享服务器或中间层应用程序而言数据库的连接必须要能被许多线程所使用如果为每个线程都开一个数据库连接的话当数量一大效率会明显的降低所以我们通过创建连接池来处理这样的情况。创建完一个Environment对象env后可以调用Environment类下的方法createConnectionPool()来创建一个Connection对象connPool通过createConnectionPool()方法我们可以连接到任意一个数据库中。连接池创建的具体方法如下所示 ConnectionPool *connPool env-createConnectionPool(
const string poolUseName,
const string poolPassWord,
const string connectstring,
unsigned int minConn,
unsigned int maxConn,
unsigned int incrConn); 参数说明poolUseName是连接池的用户名 poolPassWord是连接数据库的密码 connectstring是数据库连接串 minConn是最小连接数 maxConn是最大连接数
incrConn是指所有已连接数处于繁忙中且小于最大连接数时每次增加的连接数。 断开连接池
当对数据库操作完成之后我们必须断开程序与数据库的连接断开数据库的连接方法与创建的方法一样来自Environment类下的terminateConnectPool()函数。方法如下所示 env-terminateConnectPool(connPoll);
2.4. 创建与终止Statement对象
2.4.1. 创建Statement对象
Statement类包含了执行SQL语句的所有方法是对数据库操作的具体实现。Statement对象stmt的创建是通过调用Connection类下的createStatement()函数实现所以Statement对象的创建必须是在Connection对象创建之后。createStatement()函数可以带参数或不带参数如果带参数的话参数必须是一个SQL语句如果没有带参数则在后面必须用Statement类下setSQL()函数为Statement对象赋一个SQL语句。Statement对象的创建方法如下所示 Statement *stmt conn-createStatement(); 终止Statement对象
当对数据库的操作完成时我们必须先终止Statement对象再断开Connection对象。终止Statement对象的方法如下所示 Conn-terminateStatement(stmt);
3. 执行SQL语句Statement类
3.1. 执行SQL语句的方法
执行SQL的所有方法都包含在Statement类下。SQL语句按返回结果分可以分为两种一种是有返回值的查询语句另外一种是没有返回值的非查询语句。一般情况下在执行查询SQL语句我们使用executeQurey()函数在执行非查询SQL语句时我们使用executeUpdate()函数。 1 stmt-execute();执行所有非特殊声明的SQL语句。
2 stmt-executeUpdate();执行所有DDL和DML一条记录的SQL语句。
3 stmt-executeQurey();执行所有查询SQL语句。
4 stmt-executeArrayUpdate();执行多记录的DML的SQL语句。
例如 stmt-executeUpdate(“createtable student (sno number(10),sname varchar2)”) stmt-executeUpdate(“insertinto student (sno,sname) values(1,’ZHANGSAN’)”); stmt-executeQurey(“select sno from student ”);
3.2. 执行非查询语句
当我们创建了一个Statement对象stmt后可以通过Statement类下的方法setSQL()为stmt设置不同的SQL语句。 3.2.1. 准备SQL语句
stmt-setSQL(string sql)
例如
stmt-setSQL(“insertinto student (sno,sname) values(:1,:2)”)
其中:1、:2是参数通过给参数赋不同的值来实现。 与之对应的函数getSQL()是取出当前对象对应的SQL语句。 3.2.2. 绑定输入参数值
在Statement类中包含了所有参数的赋值方法赋值方法set×××(unsignedint paramindex,type values),其中paramindex参数是代表所赋值参数在SQL语句中的第几个参数×××与type代表中所赋值的类型values是所赋的值。×××可以是Int、String、Date等等。
例如
stmt-setString(1,’zhangsan’)指把’zhangsan’赋值给第一个参数参数类型为字符串型。
stmt-setInt(2,1009);指把1009赋值给第二个参数参数类型为整型。 3.2.3. 执行非查询语句
当SQL语句准备好后就可以执行SQL语句了方法如下所示 stmt-executeUpdate(); 3.3. 执行查询语句SELECT
在执行查询语句时有返回查询结果可能是一条也可能是多条我们必须创建一个ResultSet对象来处理通过使用ResultSet对象的next()方法我们可以一条一条或批量地处理结果集。具体使用如下所示 3.3.1. 准备SQL语句
详见3.2.1。 3.3.2. 绑定输入参数值
详见3.2.2。 3.3.3. 执行查询语句 ResultSet *rs stmt-executeQuery();
3.3.4. 定义输出变量 根据SELECT语句查询的列的类型定义对应的变量此变量用于存储SELECT查询的结果集。
3.3.5. 推进或处理数据
如果结果集为多条记录我们可以批量或者一条条处理数据使用ResultSet类下的方法next(unsigned int numRows)。
在Statement类中包含了所有参数的取值方法。取值方法get×××unsignedint paramindex其中paramindex参数是代表所取值列在SQL语句中的第几列×××代表该列对应的类型。×××可以是Int、String、Date等等。
例如
rs-next(unsignedint numRows);//其中numRows为批量处理的记录行数。 stmt-getInt(paramindex);获取整型参数值,其中paramindex为参数所在的位置
stmt-getString(paramindex);获取字符型参数值其中paramindex为参数所在的位置
3.4. 输出参数声明
在调用存储过程时有时候有返回参数这些返回参数都必须在调用之前先用Statement类下的registerOutParam()方法声明声明方法的使用如下所示
stmt-registerOutParam(paramName,paramType,paramSize);
其中paramName是参数名或者参数所在位置 paramType是参数类型比如TYPE::OCCIINT paramSize是参数的大小。 3.5. 事务提交
3.5.1. 手动提交
当事务的提交设置为手动时每完成一个事务我们都必须调用Connection类下的commit()或rollback()方法来提交一个事务。使用方法如下所示 手动提交必须调用以下函数
Connection::commit();
Connection::rollback();
3.5.2. 自动提交
在对数据库进行操作的过程中一个事务的提交是用手动还是自动我们可以调用Statement类下的setAutoCommit()方法来设置。使用方法如下所示 设置自动提交
Statement:: setAutoCommit (TRUE);
设置手动提交
Statement::setAutoCommit(FALSE); 4. OCCI常用类简要介绍
4.1. Environment类
Environment类提供了管理OCCI对象的内存及其它资源的一个环境,包含以下方法
1 createConnection(const stringusename,const string password,const string connstring);指与数据库建立一个连接。
2 createConnectionPoll(
const string poolUseName,
const string poolPassWord,
const string connectstring,
unsigned int minConn,
unsigned int maxConn,
unsigned int incrConn); 创建连接池。
参数说明poolUseName是连接池的用户名 poolPassWord是连接数据库的密码 connectstring是数据库连接串 minConn是最小连接数 maxConn是最大连接数
incrConn是指所有已连接数处于繁忙中且小于最大连接数时每次增加的连接数。
3 createEnironment(Mode mode );创建一个环境对象其中mode是模式可选DEFAULT、THREADED_MUTEXED、THREADED_UN-MUTEXED、OBJECT、SHARED值。
4 getCurrentHeapSize();指在同一环境下已经分配的内存数。
5 getOCIEnironment();返回一个OCI环境指针。
6 terminateConnection(Connection*conn);断开与数据库的连接。
7 terminateConnection(ConnectionPool*poolconn);断开与数据库的连接池。
8 terminateEnironment(Einironment *env);终止OCCI环境变量。
4.2. Connection类
Connection类提供了C程序与指定数据库的连接包含以下方法
1 changePassword(const stringuser,const string oldPassword,const string newPassword);改变当前用户的密码。
2 Commit();提交事务。
3 createStatement(const stringsql””);创建一个Statement对象。
4 flushCache();
5 rollback();事务的回滚。
6 terminateStatement(Statement*stmt).终止一个Statement对象并释放它占有的所有资源。
4.3. ConnectionPool类
ConnectionPoll类提供了C程序与指定数据库间的连接池包含以下方法
1 createConnection(const stringusername,const string password);创建一个连接。
2 getBusyConnections();返回连接池中被占用的连接数量。
3 getMaxConnections();返回连接池的最大连接数。
4 getMinConnections();返回连接池的最小连接数。
5 getOpenConnections();返回连接池中已经被打开的连接数。
6 getPollName();返回连接池的名称。
7 getTimeOut();返回连接池的超时时间。
8 setErrorOnBusy();设置异常当连接池处于繁忙或达到最大连接数后。
9 serPoolSize(unsigned intminConn,unsigned int maxConn,unsigned int incrConn);设置连接池的大小其中参数minConn是最小连接数maxConn是最大连接数incrConn是递增连接数。
10 setTimeOut();设置超时时间。
11 terminateConnection(Connection *conn);断开连接。
4.4. Statement类
Statement对象主要被用来执行SQL语句它可以运行一个查询语句返回一个结果集也可以运行UPDATE、DELETE等SQL语句。
1 addIteration();增加一个循环。
2 closeResultSet(ResultSet *rs);关闭一个结果集。
3 closeStream(Stream *stream);关闭一个已定义的流。
4 execute(const string sql “”);执行一个SQL语句如果前面使用的setSQL()方法则参数sql可以为空。
5 executeArrayUpdate(unsigned intarrayLength);同时修改多条记录前面必须使用了setDataBuffer()方法设置一个数量或设置了一个流stream。
6 executeQuery();执行一个查询语句。
7 executeUpdate();执行DDL、DML语句如INSERT、UPDATE、DELETE、CREATE等等。
8 getAutoCommit();返回是否事务自动提交。
9 getDate(unsigned int paramindex);返回DATE型数据。
10 getDouble(unsigned intparamindex);返回DOUBLE型数据。
11 getFloat(unsigned int paramindex);返回FLOAT型数据。
12 getInt(unsigned intparamindex);返回INT型数据。
13 getNumber(unsigned intparamindex);返回NUMBER型数据。
14 getRef(unsigned intparamindex);返回REF参数值。
15 getResultSet();得到一个结果集ResultSet。
16 getSQL();返回当前的SQL语句。
17 getString(unsigned intparamindex);返回STRING型数据。
18 getUpdateCount();返回被更新的数量。
19 isNull(unsigned intparamindex);判断第X个值是否为空。
20 isTruncated(unsigned intparamindex);判断第X个值是否被截取。
21 setAutoCommit(bool autocommit);设置事务是否自动提交。
22 setDouble(unsigned intparamindex,double x);赋一个double型的值。
23 setFloat(unsigned intparamindex,float x);赋一个float型的值。
24 setInt(unsigned intparamindex,int x);赋一个INT型的值。
25 setNull(unsigned intparamindex,TYPE type);某参数设置为空。
26 setNumber(unsigned intparamindex,const number x);赋一个Number型的值。
27 setObject(unsigned intparamindex,PObject *x);赋一个PObject型的值。
28 setString(unsigned intparamindex,const string x);赋一个string型的值。
29 setSQL(const string sql);设置一个SQL语句。
30 Status();返回当前的状态。
4.5. ResultSet类
ResultSet类是查询数据表的结果集它包含以下方法
1 cancel();取消结果集。
2 closeStream(Stream *stream);关闭一个流。
3 getDouble(unsigned intcolIndex);返回double型的值。
4 getFloat(unsigned intcolIndex);返回float型的值。
5 getInt(unsigned int colIndex);返回int型的值。
6 getMaxColumnSize(unsigned intcolIndex);返回某列包含的数据量。
7 getNumber(unsigned intcolIndex);返回number型的数据。
8 getPObject(unsigned intcolIndex);返回PObject型的数据。
9 getRowid(unsigned intcolIndex);返回rowid值。
10 getString(unsigned intcolIndex);返回string型的数据。
11 isNull(unsigned int colIndex);判断值是否为空。
12 isTruncated(unsigned intcolIndex);判断值是否被删。
13 next(unsigned int numRows);取下numRows条记录。
14 status();返回当前状态。
4.6. PObject类
PObject类包含以下方法
1 fush();
2 Connection *getConnection();从一个实例化的永久对象中返回连接。
3 isLocked();判断永久对象是否被锁TRUE或FALSE。
4 isNull();判断永久对象是否为空TRUE或FALSE。
5 Lock(PObject::LockOption lock_option);在数据库中锁住一个对象其中lock_option取值为OCCI_LOCK_WAIT、OCCI_LOCK_NOWAIT。
6 markDelete();删除数据库中的永久对象。
7 markModified();修改永久对象。
8 PObject operator(constPObject obj);赋值对象。
9 operator delete(void*obj,size_t size);删除对象但不能删除数据库中的对象。
10 *operator new(size_t size);创建临时对象。
11 *operator new(size_t size,constConnection *x,const string tablename,const char *type_name);创建永久对象。
12 pin();
13 setNull();设置对象为空。
14 unmark();不标记永久对象为删除或修改。
15 unpin(UnpinOption mode);其中mode的取值为OCCI_PINCOUNT_RESET、OCCI_PINCOUNT_DECR。
4.7. SQLException类
SQLException类提供错误代码及其错误信息包含以下方法
1 getErrorCode();返回数据库中的错误编码。
2 getMessage();返回错误信息没有则为空。
4.8. Date类
Date类包含以下方法
1、 addDays(int i);返回增加i天后的日期。
2、 addMonths(int i);返回增加i个月后的日期。
3、 intervalDS daysBetween(constDate d);返回与d相差的天数。
4、 getDate(int year,unsignedint month,unsigned int day,unsigned int hour,unsigned intminute,unsigned int second );返回分年月日小时分秒格式。
5、 getSystemDate(const Environment*env);返回系统日期。
6、 isNull();判断是否为空
7、 lastDay();返回当月的最后一天日期。
8、 setDate(intyear1,unsigned int month1,unsigned int day1,unsigned inthour0,unsigned int minute0,unsigned int second0);设置日期值。
9、 setNull();设置为空。
4.9. Number类
Number类包含以下常用方法
1、 abs();返回绝对值。
2、 floor();向下取整。
3、 isNull();判断是否为空。
4、 operator(const Numbera,const Number b);两数相加。
5、 operator-( const Numbera,const Number b);两数相减a-b。
6、 operator*(const Numbera,const Number b);两数相乘。
7、 operator/(const Numbera,const Number b);两数相除。
8、 operator%(const Numbera,const Number b);求余。
9、 operator(const Numbera,const Number b);a是否小于b。
10、 operator(const Numbera,const Number b);a是否小于等于b。
11、 operator(const Numbera,const Number b);a是否大于b。
12、 operator(const Numbera,const Number b);a是否大于等于b。
13、 operator(const Numbera,const Number b);a与b是否相等。
14、 operator!(const Numbera,const Number b);判断a是否不等于b。
15、 operator char();将number型转化为char型。
16、 operator signed char();将number型转化为有符号char型。
17、 operator double();将number型转化为double型。
18、 operator float();将number型转化为float型。
19、 operator int();将number型转化为int型。
20、 operator long();将number型转化为long型。
21、 operator short();将number型转化为short int型。
22、 setNull();设置为空。
23、 trunk();取整。
5. 附录代码示例
5.1. 查询流程处理示例
下面给出了一个查询的例子qrystudent.cpp通过使用OCCI接口函数查询数据库表student的信息学号学生姓名。 #include iostream
#include occi.h using namespace oracle::occi;
using namespace std; int main ()
{
Environment *env;
Connection *conn;
Statement *stmt;
ResultSet *rs; string username “ipd”;
string password “ipd”;
string connstring “ora9i”;
string sql,strname;
int isno; env Environment::createEnvironment(); //创建一个环境变量
conn env-createConnection(username,password,connstring);//创建一个数据库连接对象
stmt conn-createStatement(); //创建一个Statement对象 sql “ SELECT sno,sname FROM student “; //拼接一个SQL语句
stmt-setSQL(sql); //设置SQL语句到Statement对象中
try { rs stmt-executeQuery();//执行SQL语句 while(rs-next()) { //用循环一条一条地取得查询的结果记录 isno rs-getInt(1);//取出第一列的值对应为int型 strnamers-getString(2);//取出第二列的值对应为string型 cout isno “ AND “ strname endl; } cout “SELECT ―― SUCCESS” endl;
} catch (SQLException ex) { cout “ Error Number : “ ex.getErrorCode() endl; //取出异常代码 cout ex.getMessage() endl; //取出异常信息
} conn-terminateStatement(stmt); //终止Statement对象
env-terminateConnection(conn); //断开数据库连接
Environment::terminateEnvironment(env); //终止环境变量 return 1;
}
5.2. 非查询流程处理示例
下面给出了一个insert例子inserttab.cpp通过使用OCCI接口函数往数据库表student中插入信息学号学生姓名。 #include iostream
#include occi.h using namespace oracle::occi;
using namespace std; int main ()
{
Environment *env;
Connection *conn;
Statement *stmt; string username “ipd”;
string password “ipd”;
string connstring “ora9i”;
string sql; env Environment::createEnvironment(); //创建一个环境变量
conn env-createConnection(username,password,connstring); //创建一个数据库连接对象
stmt conn-createStatement(); //创建一个Statement对象 sql “ INSERT INTO student(sno,sname) VALUES ( :x,:y) “; //拼接SQL语句
stmt-setSQL(sql); //设置SQL语句到Statement对象中
try { stmt-setInt(1,10001);//给第一个参数x赋值 stmt-setString(2,”zhangsan”);//给第二个参数y赋值 stmt-executeUpdate();//执行SQL语句 cout “INSERT ―― SUCCESS” endl;
} catch (SQLException ex) { cout “ Error Number : “ ex.getErrorCode() endl; //获得异常代码 cout ex.getMessage() endl; //获得异常信息
} conn-terminateStatement(stmt); //终止Statement对象
env-terminateConnection(conn); //断开数据库连接
Environment::terminateEnvironment(env); //终止环境变量 return 1;
}
5.3. 批量处理非查询语句
在批量处理非查询语句时首先必须使用m_stmt-setMaxIterations(unsigned int maxnum)方法设置最大的批处理数然后使用setMaxParamSize(unsignedint paramindex,int paramsize)方法设置对应参数的大小对于有固定长度的参数可以不必重新设置如int,double最后循环绑定参数使用set×××()方法每循环一次必须使用addIteration()方法再进行下一次循环直到最后一次。例子如下所示
#include iostream
#include occi.h using namespace oracle::occi;
using namespace std; int main ()
{ Environment *env; Connection *conn; Statement *stmt; string username bill; string password bill; string connstring jftest; string sql; intisno[2]{21,22},i,iage[2]{18,19};
stringcsname[2]{namea,nameb}; try { env Environment::createEnvironment(); conn env-createConnection(username,password,connstring); stmt conn-createStatement(); stmt-setAutoCommit(false); sql INSERT INTO student (sno,sname,age) VALUES (:x,:y,:z) ; m_stmt-setSQL(sql); m_stmt-setMaxIterations(2); m_stmt-setMaxParamSize(1,sizeof(int)); m_stmt-setMaxParamSize(2,sizeof(string)); m_stmt-setMaxParamSize(3,sizeof(int)); coutsetMaxIterations success !endl; //coutgetMaxIterations m_stmt-getMaxIterations()endl; for (i0;i2;i) { m_stmt-setInt(1,isno[i]); m_stmt-setString(2,csname[i]); m_stmt-setInt(3,iage[i]); //cout isno[i] and csname[i] and iage[i] endl; if (i!1) m_stmt-addIteration(); } coutgetMaxIterations m_stmt-getMaxIterations()endl; coutsetsuccessendl; inum m_stmt-executeUpdate(); m_conn-commit(); cout INSERT ¨D¨DSUCCESS endl; }catch (SQLException ex) { inum m_stmt-getUpdateCount(); cout ON inum1 shi fail ! endl; cout INSERT Error Number: ex.getErrorCode() endl; cout ex.getMessage() endl; m_conn-rollback(); return 0; } conn-terminateStatement(stmt); env-terminateConnection(conn); Environment::terminateEnvironment(env); cout PROGRAM IS END . endl; return 1;
}
5.4. 查询语句中批量取数
在批量取数时使用setDataBuffer方法来设置接收数据缓冲区大小例子如下所示
#include iostream
#include occi.h using namespace oracle::occi;
using namespace std; int main ()
{ Environment *env; Connection *conn; Statement *stmt; ResultSet *rs; string username bill; string password bill; string connstring jftest; string sql; int i,numrows5,isnum,ilnum,ipos0; int isno[5],vsno[20],ii0,x[20]; ub2 isnolen[5],snamelen[5]; char sname[5][20],vsname[20][20]; for (i0;i20;i) { isnolen[i]sizeof(isno[i]);
snamelen[i]strlen(sname[i]1); } cout PROGRAM START ... endl; try { env Environment::createEnvironment(); conn env-createConnection(username,password,connstring); stmt conn-createStatement(); sql SELECT sno,sname FROM student ; stmt-setSQL(sql); rs stmt-executeQuery(); rs-setDataBuffer(1,isno,OCCIINT,sizeof(int)); rs-setDataBuffer(2,sname,OCCI_SQLT_STR,sizeof(sname[0]),snamelen); ilnum rs-getNumArrayRows(); cout ilnum ilnum endl; while (rs-next(numrows)) { isnum rs-getNumArrayRows(); cout isnum isnum endl; for(i0;inumrows;i) { vsno[ipos] isno[i]; vsname[ipos] sname[i]; ipos ipos1; } } ilnum rs-getNumArrayRows(); cout ilnum ilnum endl; for(i0;iilnum-isnum;i) { vsno[ipos] isno[i]; vsname[ipos] sname[i]; ipos ipos1; } cout SELECT RESULT IS ... endl; for(i0;iilnum;i) { coutvsno[i] ANDvsname[i]endl; } cout SELECT RESULT END ! endl; cout SELECT ¨D¨DSUCCESS endl; }catch (SQLException ex) { cout Error Number : ex.getErrorCode() endl; cout ex.getMessage() endl; } conn-terminateStatement(stmt); env-terminateConnection(conn); Environment::terminateEnvironment(env); cout PROGRAM END ! endl; return 1;
}
5.5. MERGE语句的使用
在使用MEGER语句时USING部分的取值应该使用表或者SELECT param1,param2FROM DUAL,其中param1,param2是常量值可以通过数组赋值并且每列值都应该取别名在后面的使用中就只用别名。例子如下所示
#include iostream
#include occi.h using namespace oracle::occi;
using namespace std; int main ()
{ Environment *env; Connection *conn; Statement *stmt; string username bill; string password bill; string connstring jftest; string sql; int isno[2]{21,22},i,iage[2]{18,19}; try { env Environment::createEnvironment(); conn env-createConnection(username,password,connstring); stmt conn-createStatement(); stmt-setAutoCommit(false); sql merge into student a ; sql using (select :xbid,:y bage from dual) b ; sql on (a.sno b.bid) ; sql when matched then; sql update set a.agea.ageb.bage ; sql when not matchedthen ; sql insert(a.sno,a.age) ; sql values(b.bid,b.bage) ; stmt-setSQL(sql); stmt-setMaxIterations(2); stmt-setMaxParamSize(1,sizeof(int)); //stmt-setMaxParamSize(2,sizeof(string)); coutsetMaxIterations success !endl; //coutgetMaxIterations stmt-getMaxIterations()endl; for (i0;i2;i) { stmt-setInt(1,isno[i]); stmt-setInt(2,iage[i]); if (i!1) stmt-addIteration(); } coutgetMaxParamSize stmt-getMaxParamSize(2)endl; coutgetMaxIterations stmt-getMaxIterations()endl; coutsetsuccessendl; stmt-executeUpdate(); //Ö´ÐÐSQLÓï¾ä conn-commit(); cout INSERT ¨D¨DSUCCESS endl; }catch (SQLException ex) { cout Error Number : ex.getErrorCode() endl; cout ex.getMessage() endl; conn-rollback(); } conn-terminateStatement(stmt); env-terminateConnection(conn); Environment::terminateEnvironment(env); cout PROGRAM IS END . endl; return 1;
}