linux_occi连接oracle数据库前的配置和程序示例_oracle数据库连接实例
linux_occi连接oracle数据库前的配置和程序示例由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“oracle数据库连接实例”。
Linux 下occi编程问题总结: 操作系统linux centOS4.5 数据库
Oracle10g Release 10.2.0.1.0 1)首先在oracle管网下载:
oracle-instantclient-basic-10.2.0.3-1.i386.rpm oracle-instantclient-devel-10.2.0.3-1.i386.rpm 使用root用户进入linux将上面的basic和devel放入在/root/oracle10g_package/oracle_occipk目录下
执行rpm –ivh * 进行安装,安装好的文件被生成到目录下: /usr/lib/oracle/10.2.0.3/client/lib 存放库文件 其中libclntsh.so 是oracle提供给c语言调用的动态库 /usr/include/oracle/10.2.0.3/client 存放occi头文件
2)将/usr/include/oracle/10.2.0.3/client 存放occi头文件copy到/usr/include目录下
先查看
[root@mylinux /]# ldd which /u01/oracle/bin/sysresv which: ldd:./which: No such file or directory /u01/oracle/bin/sysresv:
libclntsh.so.10.1 => /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1(0x00b46000)
libnnz10.so => /usr/lib/oracle/10.2.0.3/client/lib/libnnz10.so(0x0021d000)
libdl.so.2 => /lib/libdl.so.2(0x00111000)
libm.so.6 => /lib/tls/libm.so.6(0x00115000)
libpthread.so.0 => /lib/tls/libpthread.so.0(0x00138000)
libnsl.so.1 => /lib/libnsl.so.1(0x001b6000)
libc.so.6 => /lib/tls/libc.so.6(0x00423000)
/lib/ld-linux.so.2(0x00b2e000)libclntsh.so.10.1 => 是否存在,不存在要在 $ vi etc/ld.so.conf中增加一行/usr/lib/oracle/10.2.0.3/client/lib 然后执行ldconfig命令使etc/ld.so.conf生效.再次使用
$ ldd which /u01/oracle/bin/sysresv 查看
libclntsh.so.10.1 => /usr/lib/oracle/10.2.0.3/client/lib/libclntsh.so.10.1(0x00b46000)3)编写测试代码:connclient.cpp #include
#include
#include
#include
using namespace oracle::occi;using namespace std;
int main(){ Environment *env;Connection *conn;Statement *stmt;ResultSet *rset;
string struser=“system”;string strpwd=“oracle”;string strconn_string=“ori”;// oracle的SID env = Environment::createEnvironment(Environment::OBJECT);conn = env->createConnection(struser,strpwd,strconn_string);if(NULL!= conn)
cout
cout
string strsql=“select id,name from table1”;stmt=conn->createStatement();stmt->setSQL(strsql);try{ rset=stmt->executeQuery();while(rset->next()){
int id=rset->getInt(1);
string strname=rset->getString(2);
cout
rset=NULL;
cout
stmt->closeResultSet(rset);conn->terminateStatement(stmt);env->terminateConnection(conn);Environment::terminateEnvironment(env);return 0;} 4)编译程序connclient.cpp
这里g++有几个参数说明下: -o:要生成的目标文件或可执行文件
-I:用#include“file”的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.。对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找。-L 查找你指定的库文件路径 增加libocci.so和libclntsh.so指定编译-lclntsh这是连接oracle的动态库
-locci 连接libocci.so文件 使用g++编译时出现错误:
g++-o conncl connclient.cpp-I/usr/include-L/usr/lib/oracle/10.2.0.3/client/lib 命令执行后出现
/tmp/cckQbf4h.o(.text+0x24e): In function `main'::undefined reference to `oracle::occi::Environment::createEnvironment(oracle::occi::Environment::Mode, void*, void*(*)(void*, unsigned int), void*(*)(void*, void*, unsigned int), void(*)(void*, void*))' /tmp/cckQbf4h.o(.text+0x743): In function `main':: undefined reference to`oracle::occi::Environment::terminateEnvironment(oracle::occi::Environment*)' /tmp/cckQbf4h.o(.gcc_except_table+0xa4): undefined reference to `typeinfo for oracle::occi::SQLException' collect2: ld returned 1 exit status 上面是找不到动态函数库,需要命令行参数中增加-lclntsh –locci g++-o conncl connclient.cpp-I/usr/include-L/usr/lib/oracle/10.2.0.3/client/lib-lclntsh –locci 执行语句再次编译,出现
/usr/bin/ld: warning: libstdc++.so.5, needed by /usr/lib/oracle/10.2.0.3/client/lib/libocci.so, may conflict with libstdc++.so.6
OCCI库在linux编译的时候,由于linux版本太高,会提示以上情况,实际上,在大多数linux系统上,还保留有libstdc++5的库。修改命令参数
g++-o conncl connclient.cpp-I/usr/include-L/usr/lib/oracle/10.2.0.3/client/lib-lclntsh-locci /usr/lib/libstdc++.so.5
编译通过。执行程序
./conncl