Linux oci连接oracle服务器

因公司需要,开发MES将其迁移到Linux平台,使用oracle数据库,现在oracle服务器已经配置好,如果没有配置成功的请参考另一篇博客Linux下安装oracle,即可安装!

转载请附上链接,禁止侵权!

一、安装前言

因linux发行版本不同,我这个版本是ubuntu的
同时,编译器使用的是QT,但是我在QT下编译oci插件不成功,具体不成功原因可能是使用的ubuntu而不是centos或者ret hat,我在ret hat下编译依旧不成功,具体不成功原因就不加以说明了。
现在选择的方式是安装oracle客户端+ocilib方式,很容易,使用方便性上也很好!
总结:
操作系统:ubuntu18.04
编译器:Qt5.13.2(这个其实无关紧要)
oracle客户端版本(11.2.0)
下面就开始安装!

二、安装oracle11.2客户端

1.下载客户端

客户端网址:oracle客户端下载

所需要的安装包

oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm

其中三个包的用处:
oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm --基础包,为了运行OCI、OCCI、JDBC-OCI 这几个应用程序;
oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm --补充包/文件,是为了运行sql*plus的即时客户端;
oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm --作oralce软件开发用

所以建议都安装上
  
Linux oci连接oracle服务器_第1张图片
Linux oci连接oracle服务器_第2张图片

Linux oci连接oracle服务器_第3张图片

2.使用alien安装

下载之后自己建目录存放
ubuntu只能安装deb包而不能安装rpm包,所以要使用alien进行转换
如果没有安装alien,使用下面命令安装

sudo apt-get install alien

安装之后就开始进行转换rpm包并进行安装

sudo alien  oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
sudo alien  oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
sudo alien  oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
dpkg -i *.rpm

因为是默认安装,所以安装的lib、bin、include的位置为:

aaron@aaron-Raytine-PC:~$ cd /usr/lib/oracle/11.2/client64/
aaron@aaron-Raytine-PC:/usr/lib/oracle/11.2/client64$ ls
bin  lib  tnsnames.ora
aaron@aaron-Raytine-PC:/usr/lib/oracle/11.2/client64$ 

这个时候还没有tnsnames.ora

aaron@aaron-Raytine-PC:~$ cd /usr/include/oracle/11.2/client64/
aaron@aaron-Raytine-PC:/usr/include/oracle/11.2/client64$ ls
ldap.h        occiControl.h  oci8dp.h  ocidfn.h    ocixstream.h  orl.h
nzerror.h     occiData.h     ociap.h   ociextp.h   odci.h        oro.h
nzt.h         occi.h         ociapr.h  oci.h       oratypes.h    ort.h
occiAQ.h      occiObjects.h  ocidef.h  ocikpr.h    orid.h        xa.h
occiCommon.h  oci1.h         ocidem.h  ocixmldb.h  ori.h
aaron@aaron-Raytine-PC:/usr/include/oracle/11.2/client64$ 

3.oracle客户端环境配置

新建tnsnames.ora,位置可以随便但是要记住,建议位置和我一样放在/usr/lib/oracle/11.2/client64
打开sudo vi tnsnames.ora
输入以下内容

ORCL =	//这个名字要记住,后期连接需要tns文件
(
	DESCRIPTION =
    (
	ADDRESS = 
	(
	PROTOCOL = TCP	//tcp连接
	)
	(
	HOST = 192.168.3.71	//服务器ip地址
	)
	(
	PORT = 1521	//oracle服务器端口号
	)
    )
    (
	CONNECT_DATA =
        (
	SERVER = DEDICATED
	)
	(
	SERVICE_NAME = szxndb //这里一定要和oracle服务器上数据库名一致,
	//如果是默认安装oracle应该是orcl
	)
    )
)

保存退出

接下来添加lib环境,方便以后连接oracle数据库使用
在/etc/ld.so.conf.d下新建文件,输入oracle客户端lib路径

aaron@aaron-Raytine-PC:/etc/ld.so.conf.d$ cat oracleclient.conf 
/usr/lib/oracle/11.2/client64/lib
aaron@aaron-Raytine-PC:/etc/ld.so.conf.d$ 

sudo ldconfig生效

sudo ldconfig

然后添加到ubuntu环境中
在/etc/profile文件中添加

export  ORACLE_HOME=/usr/lib/oracle/11.2/client64
export  TNS_ADMIN=$ORACLE_HOME
export  LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export  PATH=$ORACLE_HOME/bin:$PATH

保存退出,执行source /etc/profile生效,有的时候要重启一下。

这个时候输入sqlplus可以看到

aaron@aaron-Raytine-PC:~$ sqlplus
sqlplus    sqlplus64  
aaron@aaron-Raytine-PC:~$ sqlplus

如果是自动提示只显示sqlplus64说明环境变量未生效,要重启一下

4.连接

连接命令很简单
sqlplus test(用户名)/12345(密码)@ORCL(和tnsnames一致)

aaron@aaron-Raytine-PC:~$ sqlplus test/12345@ORCL

SQL*Plus: Release 11.2.0.4.0 Production on Tue Jul 14 20:33:38 2020

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


Connected to:
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

SQL> 

如果连接不上,建议执行telnet 192.168.3.71 1521看看防火墙,网段,端口号什么之类的是否一致,出现以下界面是连接成功。如果没有telnet aptget下载一下就可以。

aaron@aaron-Raytine-PC:~$ telnet 192.168.3.71 1521
Trying 192.168.3.71...
Connected to 192.168.3.71.
Escape character is '^]'.

三、编译ocilib

1.下载ocilib源码

源码网址:gihub上源码地址
Linux oci连接oracle服务器_第4张图片
点击code下载即可,下载后解压进入目录

2.编译

执行以下命令编译

./configure --with-oracle-lib-path=/usr/lib/oracle/11.2/client64/lib --with-oracle-headers-path=/usr/include/oracle/11.2/client64
make
sudo make install

完成之后,编译出的库路径在

aaron@aaron-Raytine-PC:~$ ls -l /usr/local/lib/*oci*
-rw-r--r-- 1 root root 3564210 7月  14 19:27 /usr/local/lib/libocilib.a
-rwxr-xr-x 1 root root     976 7月  14 19:27 /usr/local/lib/libocilib.la
lrwxrwxrwx 1 root root      18 7月  14 19:27 /usr/local/lib/libocilib.so -> libocilib.so.4.6.4
lrwxrwxrwx 1 root root      18 7月  14 19:27 /usr/local/lib/libocilib.so.4 -> libocilib.so.4.6.4
-rwxr-xr-x 1 root root 1985000 7月  14 19:27 /usr/local/lib/libocilib.so.4.6.4
aaron@aaron-Raytine-PC:~$ 

头文件就在解压的安装包下
Linux oci连接oracle服务器_第5张图片

这个时候测试执行
因为我的编译器是qt,qt里头文件和库连接配置如下

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

DEFINES += QT_DEPRECATED_WARNINGS

HEADERS += \
        ocilib.h

SOURCES += \
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

#oracle库
LIBS += -L/usr/include/oracle/11.2/client64 -L/usr/lib/oracle/11.2/client64/lib -lclntsh 
#oci库
LIBS += -L/usr/local/lib -locilib

测试代码如下:

#include "ocilib.h"

void err_handler(OCI_Error *err)
{
    printf("%s\n", OCI_ErrorGetString(err));
}

int main(int argc, char *argv[])
{
    OCI_Connection* cn;
    OCI_Statement* st;
    OCI_Resultset* rs;
    // init with err_handler
    OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT);
    // connect
    cn = OCI_ConnectionCreate("192.168.3.71:1521/szxndb", "test", "12345", OCI_SESSION_DEFAULT);
    // version
    printf("Server major version : %i\n", OCI_GetServerMajorVersion(cn));
    printf("Server minor version : %i\n", OCI_GetServerMinorVersion(cn));
    printf("Server revision version : %i\n\n", OCI_GetServerRevisionVersion(cn));
    printf("Connection version : %i\n\n", OCI_GetVersionConnection(cn));
    // select
    st = OCI_StatementCreate(cn);

    OCI_ExecuteStmt(st, "select intcol, strcol from table");
    rs = OCI_GetResultset(st);
    while (OCI_FetchNext(rs))
    {
        printf("%i - %s\n", OCI_GetInt(rs, 1), OCI_GetString(rs, 2));
    }
    // clean up
    OCI_Cleanup();
    return EXIT_SUCCESS;
}

运行结果如下:
Linux oci连接oracle服务器_第6张图片

自此,结束

你可能感兴趣的:(Linux)