因公司需要,开发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)
下面就开始安装!
客户端网址: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软件开发用
下载之后自己建目录存放
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$
新建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说明环境变量未生效,要重启一下
连接命令很简单
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 '^]'.
源码网址:gihub上源码地址
点击code下载即可,下载后解压进入目录
执行以下命令编译
./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:~$
这个时候测试执行
因为我的编译器是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;
}
自此,结束