当前位置: 首页 > news >正文

OCCI使用

文章目录

    • OCCI概述
      • OCCI介绍
      • OCCI优势
      • 特性
      • 相关头文件
      • OCCI库
      • OCCI官方网站
    • OCCI文档介绍和环境配置
    • OCCI中连接Oracle数据库
      • 连接Oracle数据库示例
    • OCCI中执行SQL语句
    • OCCI中事务处理

OCCI概述

OCCI介绍

Oracle C++调用接口 – OCCI 即 Oracle C++ Call Interface

OCCI 是Oracle 的C++ API, 允许你使用面向对象的特性、本地类、C++语言的方法来访问Oracle数据库

OCCI优势

OCCI提供其它访问ORACLE数据库所不具备的重要优势

  1. 基于标准C++和面向对象的设计

  2. 简单易用

  3. 与JDBC比较相近,容易学会

  4. 可以像操作C++实例一样操作用户定义的数据库对象

特性

  • 完整支持SQL/PLSQL
  • 为不断增长的用户和请求提供了弹性选项
  • 为使用用户自定义类型,如C++中的类,提供了无缝接口
  • 支持所有的Oracle数据类型以及LOB types(大对象)
  • 可以访问数据库元数据

相关头文件

#include <occi.h>   -- 程序中只需要包含这一个头文件//以下不需要添加
#include <occiCommon.h>
#include <occiControl.h>
#include <occiData.h>
#include <occiObjects.h>

OCCI库

  • Windows平台
    • oraocci11.lib/ oraocci11d.lib
    • oraocci11.dll/ oraocci11d.dll
  • Linux平台
    • libnnz11.so
    • libocci.so
    • libclntsh.so

OCCI官方网站

oracle官方网站:https://www.oracle.com/index.html

OCCI编程指南

C++参考网址:https://www.oracle.com/database/technologies/appdev/oci.html

OCCI文档介绍和环境配置

Vs2017环境的配置:

第一步: 配置头文件和库目录

在这里插入图片描述

注意: 添加库的时候 先添加oraocci11.lib 然后添加oraocci11d.lib

OCCI中连接Oracle数据库

8.1 初始化 - Environment 类
在这里插入图片描述

OCCI通过创建一个Environment的对象完成初始化工作。

可以通过Environment创建数据库连接,从而进行其它的操作

要创建Environment,应该调用Environment类的静态方法createEnvironment()

// 环境初始化
Environment* env = Environment::createEnvironment();
// 关闭, 释放资源
Environment::terminateEnvironment(env);

8.2 连接数据库 - Connection 类

连接数据库通过Connection类的对象实例实现

调用Environment类的**createConnection()**方法可以创建一个Connection对象;

函数原型

Connection *Environment::createConnection( const string &userName,const string &password, const string &connectString );

函数调用

const string userName = "scott";    // 用户名
const string passwd = "密码";  // 密码
const string connstr = "192.168.247.1:1521/orcl"; // 数据库连接串
Connection* conn = env->createConnection(userName, passwd, connstr);

使用**Environment::terminateConnection()**断开连接

// 断开连接
env->terminateConnection(conn);

连接Oracle数据库示例

#include <iostream>
#include <occi.h>using namespace std;
using namespace oracle::occi;  //命名空间int main(void)
{string name = "scott";string passwd = "11";string connectStr = "192.168.15.33:1521/orcl";//1. 创建OCCI的环境Environment *env = Environment::createEnvironment();if (NULL == env){cout << "createEnvironment failed...." << endl;return 1;}//2. 连接数据库Connection *connect = env->createConnection(name, passwd, connectStr);if (NULL == connect){cout << "CreateConnection failed..." << endl;return 1;}cout << "连接oracle服务端ok ..." << endl;//3. 关闭连接env->terminateConnection(connect);//4. 终止环境Environment::terminateEnvironment(env);return 0;
}

OCCI中执行SQL语句

执行SQL

Statement 类用于执行SQL语句,并获取返回结果。

ResultSet 类用于处理SELECT 查询的结果。

对于所有类型的数据的绑定或者获取,OCCI都提供了统一的方法

  • setXXX 方法用于Statement
  • getXXX 方法用于Statement & ResultSet

OCCI会自动处理类型之间的转换。

使用方法:

使用Connection:😗*createStatement()**创建Statement对象, 指定 SQL 命令(DDL/DML/query)作为参数

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>#include <occi.h>using namespace std;
using namespace oracle::occi;int main()
{string dbUser = "scott";string dbPwd = "11";string connStr = "192.168.16.47:1521/orcl";//1. 创建OCCI环境Environment *env = Environment::createEnvironment();if (NULL == env){cout << "createEnvironment failed.." << endl;return 1;}cout << "创建一个环境ok" << endl;{//2. 连接到数据库Connection *conn = env->createConnection(dbUser, dbPwd, connStr);if (NULL == env){cout << "createConnection failed.." << endl;return 1;}cout << "连接Oracle ok" << endl;//创建语句对象Statement *stmt = conn->createStatement();//执行select语句//stmt->executeUpdate("insert into dept values(9, '9name', '9loc')");//执行delete语句//stmt->executeUpdate("delete from dept where deptno = 9");//执行Update语句stmt->executeUpdate("update dept set dname = '8AAA', loc='8LOC' where deptno = 8");#if 0//使用预处理语句stmt->setSQL("insert into dept values(:1, :2, :3)");stmt->setInt(1, 9);stmt->setString(2, "9Name");stmt->setString(3, "9Loc");stmt->executeUpdate();
#endif//查询ResultSet *rs = stmt->executeQuery("select deptno, dname from dept");int id = -1;string name;//获取结果while (rs->next()){id = rs->getInt(1);name = rs->getString(2);cout << id << endl;}stmt->closeResultSet(rs);//终止语句对象conn->terminateStatement(stmt);//3. 终止连接env->terminateConnection(conn);}//4. 终止一个环境Environment::terminateEnvironment(env);cout << "hello itcast" << endl;system("pause");return 0;
}

OCCI中事务处理

#include <iostream>
#include <occi.h>
#include <string>
using namespace std;
using namespace oracle::occi;int main()
{// 1. 初始化连接环境Environment* env = Environment::createEnvironment();// 2. 创建连接string userName = "scott";string passwd = "tiger";string connstr = "192.168.247.129:1521/orcl";// conn是建立连接之后得到的对象Connection* conn = env->createConnection(userName, passwd, connstr);if (conn == NULL){cout << "连接失败..." << endl;return -1;}cout << "数据库连接成功..." << endl;// 3. 创建一个用户操作sql的对象// key给这个函数指定sql语句也可以不指定Statement* stat = conn->createStatement();// 如果没有指定执行的sql可以通过set方法指定string sql = "select * from dept";// stat->setSQL(sql);// 执行sql语句ResultSet* resSet = stat->executeQuery(sql);// 取出所有的记录while (resSet->next()){// 每循环一次读一条记录// 读出这条记录的三个字段int no = resSet->getInt(1); // 1 - 第一个字段string str1 = resSet->getString(2);string str2 = resSet->getString(3);cout << "no: " << no << endl;cout << "name" << str1 << endl;cout << "loc" << str2 << endl;}// 关闭结果集stat->closeResultSet(resSet);// 插入语句// 设置sql语句// occi dml 会自动打开一个事务sql = "insert into dept values(:1, :2, :3)";stat->setSQL(sql);stat->setInt(1, 66);stat->setString(2, "itcast");stat->setString(3, "china");// 执行sql语句
#if 0int ret = stat->executeUpdate();if (ret == 0){cout << "insert fail..." << endl;// 失败状态回滚conn->rollback();return -1;}conn->commit();
#else// 设置事务的自动处理stat->setAutoCommit(true);int ret = stat->executeUpdate();if (ret == 0){cout << "insert fail..." << endl;// 失败状态回滚return -1;}
#endifconn->terminateStatement(stat);env->terminateConnection(conn);// 释放资源Environment::terminateEnvironment(env);return 0;
}
http://www.dtcms.com/a/389705.html

相关文章:

  • 如何在命令列将.brd转成.siw
  • 贪心算法应用:欧拉路径(Fleury算法)详解
  • 第13章 时间处理
  • Python 抓包工具有哪些,抓包失败怎么办?(Python 抓包工具清单 + 常见失败原因与逐步排查)
  • 数据库模式演进的利器:Alembic 深度解析
  • 用 JMeter 打通“异步入队 + 网关限流”的高并发压测实践
  • Linux服务器从零开始-服务器安装配置
  • Python第三节基本数据类型详解与使用指南
  • 【indextts2】之四:ubuntu24.04 经常跑满12G 显存、音色与录制关系很大
  • 【学习笔记】稳定币的技术原理与信任逻辑
  • 为 Elasticsearch Ruby Client 引入 ES|QL 查询生成器
  • 平安养老险陕西分公司积极开展“保障金融权益,助力美好生活”金融教育宣传周活动
  • 多线程的特点与同步、互斥锁
  • 将npm run dev 冷启动从 90s 优化到 8.5s的实践
  • 【附源码】基于SSM的小型银行贷款系统设计与实现
  • X-Forwarded-For
  • 中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
  • GitHub 上 Star 数量前 10 的开源项目管理工具
  • axios函数封装
  • NewSQL——核心原理与内部机制
  • 《从 0 到 1 打通网络服务任督二脉:域名、服务器与多站点配置全攻略》​
  • vue3学习日记(十七):动态路由使用解析
  • SpringBoot 启动流程
  • .NET驾驭Word之力:结构化文档元素操作
  • 解密F5负载均衡:优化网络性能的关键
  • 使用 .NET Core 6 Web API 的 RabbitMQ 消息队列
  • 时空预测论文分享:图时空注意力网络 ConvLSTM 时空演变
  • 千问大模型部署笔记
  • 网络:开源网络协议栈介绍
  • 设计模式(C++)详解—装饰器模式(3)