linux下c/c++连接oracle可以使用oci、occi、Pro*C/C++几种方法
oci
Oracle Call Interface (OCI) 是 Oracle Database 的全面、高性能、原生 C 语言接口,可用于开发自定义或打包数据库应用。OCI 具有高可靠性。SQL*Plus、Real Application Testing (RAT)、SQL*Loader 和 Data-Pump 等 Oracle 工具都使用 OCI。OCI 为其他语言特定接口提供了基础,例如 Oracle JDBC-OCI、Oracle Data Provider for Net (ODP.Net)、Oracle Precompilers、Oracle ODBC 和 Oracle C++ Call Interface (OCCI) 驱动程序都基于 OCI 构建。OCI 还被一些主要的脚本语言驱动程序所使用,例如用于 Node.js 的 node-oracledb、PHP OCI8、ruby-oci8、Perl DBD::Oracle、Python cx_Oracle 以及统计编程语言 R 的 ROracle 驱动程序。,
occi
OCCI 基于标准 C++ 和面向对象的模式,旨在提高 Oracle 数据库应用的开发效率和质量。OCCI 正在成功地用于客户端-服务器架构、中间层和复杂对象建模应用。OCCI 是访问 Oracle 关系对象特性(如对象类型、继承、关系和集合)的自然接口。对象在 OCCI 中表示为 C++ 类实例,从而实现应用和数据库之间的无缝集成。具有客户端对象缓存的导航访问方法提供了全面的数据库透明性。
Pro*C/C++
Oracle Pro*C/C++预编译器允许您在应用程序中使用 SQL 的电源和灵活性。方便、易用的界面可让您的应用程序直接访问 Oracle。与许多应用程序开发工具不同,Pro*C/C++允许您创建高度自定义的应用程序。例如,您可以创建包含最新窗口和鼠标技术的用户界面。您还可以创建在后台运行的应用程序,而无需用户交互。pro*c/c++是嵌入到c/c++里面的方式。需要先把proc文件转换成c/c++语法后,再用c/c++编译。(https://docs.oracle.com/cd/E11882_01/appdev.112/e10825/toc.htm)
本文主要介绍c/c++通过occi操作oracle数据库。
安装 linux下的oracle客户端
rpm 安装文件,将以下四个文件拷至 linux中, 下载网址:https://www.oracle.com/technetwork/cn/database/occidownloads-083553-zhs.html
oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-odbc-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm
使用命令安装:rpm -ivh *.rpm
成功之后,出现以下文件:
注:如果没有上面指明的路径,则需要重装安装,使用命令: rpm -ivh --force *.rpm
tnsnames.ora文件
手动添加tnsnames.ora文件
/usr/lib/oracle/11.2/client64/ 下,创建文件 ./network/admin/tnsnames.ora
tnsnames.ora:
注: ip和端口按各数据库参数而定
测试程序
在一个目录下,新建his.cpp文件,文件内容如下:
#include
#define LINUXOCCI
#include
using namespace std;
using namespace oracle::occi;
int main()
{
Environment *env = Environment::createEnvironment(Environment::DEFAULT);
cout << "success" << endl;
string name = "build";
string pwd = "123456";
string sid = "90.0.10.140/orcl";// 此处根据各个数据库参数而定
string date;
try
{
Connection *conn = env->createConnection(name, pwd, sid);
if(conn) cout << "connect success" << endl;
else cout << "connect fail" << endl;
Statement *stmt = conn->createStatement();
string sSQL = "select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual";
stmt->setSQL(sSQL);
ResultSet *rs = stmt->executeQuery();
if(rs->next())
{
date = rs->getString(1);
}
cout<< "now time:" << date << endl;
env->terminateConnection(conn);
}
catch(SQLException e)
{
cout << e.what() << endl;
return -1;
}
Environment::terminateEnvironment(env);
cout << "end!" << endl;
return 0;
}
环境变量配置
1.手动在linux 中执行,但是重启后就无效了;先测试环境可先这样执行
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/oracle/11.2/client64/
export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/oracle/11.2/client64/lib/
export NLS_LANG=AMERICAN_AMERICA.UTF8
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:/$LD_LIBRARY_PATH
export ORACLE_SID=orcl
(一定要加 NLS_LANG的变量,字符集要和数据库相同,否则实际操作数据库的时候很可能处理不了)
2.若要使重启仍生效,需更改文件 bashrc,添加下面加粗部分并保存
vi ~/.bashrc
# .bashrc
# Source global definitions
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/oracle/11.2/client64/
export NLS_LANG=AMERICAN_AMERICA.UTF8
export PATH=$PATH:/sbin:/usr/sbin:$ORACLE_HOME/bin
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
编译脚本
使用下列命令编译出测试程序,编译无误后,可以运行程序查看结果
g++ his.cpp -o his -I/usr/include/oracle/11.2/client64/ -L/usr/lib/oracle/11.2/client64/lib -locci -lnnz11 -lclntsh
编译完,在编译目录下直接执行./his 可以查看结果。