Linux下OCI基础:配置Instant Client连Oracle数据库(一)

2014-11-24 17:39:40 · 作者: · 浏览: 2

前段时间有位兄弟在我博客上找到一篇我以前写的用OCI链接oracle数据库配置方法的帖子,因为只是随手记录,那篇文章里面很多东西都没交代清楚,我看得懂人家看起来就云里雾里。oracle声名在外又不是盖的,而那位老兄被上面逼得很急,加我qq问了我三四天总算才基本搞定OCI链接oralce数据库


也不能怪那个老兄,不像用C连mysql很简单,官方文档汉化很全很详细,市面上销售的mysql书籍很多都有关于C连mysql数据库的例子和相关介绍。想想当初我弄C通过OCI接口连oracle数据库去新华书店/当当网把oracle有关的书籍找了个遍,全部都是介绍java,php,多奶等语言连oracle的例子介绍,仅仅只有一本《Oracle Spatial与OCI高级编程》有一些OCI的介绍,唯一的这本书对怎么配置OCI连接环境也只字不提。


oracle官方文档全英文还藏着捏着生怕别人看到,相对mysql的C详细汉化文档完全让人吐血;网上搜索也基本只能搜索到windows下的配置方法,linux下基本没有,我当时就是根据windows下配置方法和一些英文文档一步一步弄出来的。为了不让后来人重蹈那位老兄的覆辙,通过这篇文章,我从零开始一步一步详细地教大家在linux下用C语言通过OCI连接oracle数据库。


首先,去oracle官网下载C语言的库文件和头文件网址如下,选择对应的Instant Client版本(我下载的都是zip包,没有下载rpm包,rpm包应该安装的时候就把那些东西配置好了):


http://www.oracle.com/technology/software/tech/oci/instantclient/index.html


下面是linux i386版本的


http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html


Instant Client Package - Basic 里面包含了动态库文件 libclntsh.so.11.1(最新版本可能不一样) 并将其加载到动态库搜索路径中去,这里就不说详细步骤了,有疑问百度/狗狗搜索,实在不行在下面留言。


*Instant Client Package - SDK 这个则是包含的头文件


*Instant Client Package - SQL*Plus sqlplus这个东西最好还是下一个装上,试验客户端是否配置好,查看sql语句执行结果都需要他。


下载文件路径设置:


/home/oracle/lib 存放Basic和sqlplus的各种库文件,因此在/etc/ld.so.conf文件中添加路径/home/oracle/lib ,还有就是在当前文件下为libclntsh.so.11.1库文件建个软连接 ln -s libclntsh.so.11.1 libclntsh.so 让代码连接动态库的时候能找到库文件。


/home/oracle/include 存放SDK的头文件。


配置好以后发现在终端运行sqlplus链接oracle数据库错误:ERROR:ORA-12541: TNS:no listener 网络上一搜索都说是没有配置好oracle数据库的监听器或者是监听器没有启动,而那太oracle10g数据库的监听器明明启动了,而且网内另外一台windows机器安装了oracle client客户端用sqlplus能链接并操作数据库。


连sqlplus都报一样的错误那就不是sqlplus或者是oci的问题了,是instant的环境配置问题鸟。在百度/狗狗上搜索一通,发现配置oracle的instant,要配置一个环境变量参数:ORACLE_HOME 。用export命令只对当前运行的系统有效,重启系统后就没了,因此要做到一次配置永久生效就要编辑 ~/.bashrc 文件,在文件末尾加上一句:


export ORACLE_HOME=/home/oracle/lib


注:ORACLE_HOME 环境变量的路径是解压 Instant Client Package - Basic zip包的解压路径,路径下包含了从Basic包里解压出来的so文件jar文件等。


最后在 $ORACLE_HOME/network/admin 目录(没有就新建)下新建一个oracle配置文件tnsnames.ora文件 ,我的tnsnames.ora是从其他机器上直接拷过来的,内容如下:


# tnsnames.ora Network Configuration File: /home/oracle/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora


TEST =


(DESCRIPTION =


(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.8)(PORT = 1521))


(CONNECT_DATA =


(SERVER = DEDICATED)


(SERVICE_NAME = test)


)


)


EXTPROC_CONNECTION_DATA =


(DESCRIPTION =


(ADDRESS_LIST =


(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))


)


(CONNECT_DATA =


(SID = PLSExtProc)


(PRESENTATION = RO)


)


)


配置好上面这些后,注销用户重新登录,让 ORACLE_HOME环境变量生效,检查方法很简单,分别在终端输入命令:


[mgqw@localhost ~]$ echo $ORACLE_HOME


/home/oracle


如果像上面那样有路径输出则说明配置成功了,如果没有输出那重新再编辑一下 ~/.bashrc 看看哪里出了问题吧。


检查完成以后运行sqlplus登录数据库成功!例子如下,运行C程序链接数据库也成功!总算把环境配好了。


[mgqw@localhost ~]$ sqlplus uname/pswd@dbname


SQL*Plus: Release 11.1.0.7.0 - Production on Sun May 31 14:22:00 2009


Copyright (c) 1982, 2008, Oracle. All rights reserved.


Connected to:


Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production


With the Partitioning, OLAP and Data Mining options


SQL> select * from t1;


A B


---------- ----------


0 3


2 3


20 3


21 3


8 1


9 1


30 32


-1 2


1 4


3 6


5 8


A B


---------- ----------


7 10


22 2


26 2


14 rows selected.


下面补偿一点配置文件说明:


tnsnames.ora文件放在客户端机器上,并且在默认状态下存储在ORACLE_HOME/network/admin目录中。 sqlnet.ora文