地址:https://github.com/wendal/go-oci8
它是 https://github.com/mattn/go-oci8 的分支. win下安装步骤参考:http://www.cnblogs.com/ghj1976/p/3437250.html
下面的安装步骤主要参考了:https://github.com/Centny/Centny/blob/master/Articles/How%20build%20github.com%3amattn%3ago-oci8.md
首先通过pkg-config工具确认你已安装了oci8 c-lib
pkg-config这一工具是用来检索系统中安装库文件的信息。其主要功能如下:
- 检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
- 获得编译预处理参数,如宏定义,头文件的位置。
- 获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
- 自动加入所依赖的其它库的设置。
--exists,可以用来测试模块的可用性。
$ pkg-config --exists oci8||echo no
显示 no 说明pkg-config 没有找到相应的 oci8.pc
http://www.cppblog.com/nenlong/archive/2012/09/04/189480.html
安装oci8:
从 OTN Instant Client 页面下载 Basic 和 SDK Instant Client 程序包。
OCI是指ORACLE调用接口(Oracle Call Interface),它提供了一组可对ORACLE数据库进行存取的接口子例程(函数),通过在代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的。
OCI是集成在 Oracle Database Instant Client 的Basic 版本中的。下载地址如下:
http://www.oracle.com/technetwork/database/features/instant-client/index.html
比如我这里下载的是:
instantclient-sdk-linux.x64-12.1.0.1.0.zip
instantclient-basic-linux.x64-12.1.0.1.0.zip
如果您使用 ZIP 文件,应该将 SDK 解压缩到 basic 程序包所在的目录中
解压缩参数参考:http://www.ezloo.com/2008/01/linux_zip_unzip.html
1),切换到root帐号
2),解压缩 instantclient-basic-linux.x64-12.1.0.1.0.zip
到 /usr/local/ 目录下,得到的路径为 /usr/local/instantclient_12_1/
3),解压缩
instantclient-sdk-linux.x64-12.1.0.1.0.zip,会得到一个和步骤2)中相同名称的目录,该目录下有一个名称为
sdk 的子目录,将其移动到 /usr/local/instantclient_12_1/ 目录下,最终的目录结构如下:
具体命令如下:
解压缩 basic文件
[root@localhost oci]# unzip
instantclient-basic-linux.x64-12.1.0.1.0.zip -d /usr/local/
Archive: instantclient-basic-linux.x64-12.1.0.1.0.zip
inflating: /usr/local/instantclient_12_1/BASIC_README
inflating: /usr/local/instantclient_12_1/adrci
inflating: /usr/local/instantclient_12_1/genezi
inflating:
/usr/local/instantclient_12_1/libclntsh.so.12.1
inflating:
/usr/local/instantclient_12_1/libclntshcore.so.12.1
inflating: /usr/local/instantclient_12_1/libnnz12.so
inflating: /usr/local/instantclient_12_1/libocci.so.12.1
inflating: /usr/local/instantclient_12_1/libociei.so
inflating: /usr/local/instantclient_12_1/libocijdbc12.so
inflating: /usr/local/instantclient_12_1/libons.so
inflating: /usr/local/instantclient_12_1/liboramysql12.so
inflating: /usr/local/instantclient_12_1/ojdbc6.jar
inflating: /usr/local/instantclient_12_1/ojdbc7.jar
inflating: /usr/local/instantclient_12_1/uidrvci
inflating:
/usr/local/instantclient_12_1/xstreams.jar
解压缩 sdk 文件
unzip instantclient-sdk-linux.x64-12.1.0.1.0.zip -d /usr/local/
下一步,手动创建一个符号链接:
ln -s libclntsh.so.12.1 libclntsh.so
参考: http://blog.chinaunix.net/uid-20769015-id-3919458.html
修改oci8.pc文件
(/usr/lib/pkgconfig/ 目录下):
# Package Information for pkg-config
prefix=/usr/local/instantclient_12_1/
libdir=${prefix}
includedir=${prefix}/sdk/include/
Name: OCI
Description: Oracle database engine
Version: 12.1
Libs: -L${libdir} -lclntsh
Libs.private:
Cflags:
-I${includedir}
修改完后,注意需要设置全局参数: PKG_CONFIG_PATH , 否则会报下面错误:
Package oci8 was not found in the pkg-config search path.
Perhaps
you should add the directory containing `oci8.pc‘
to the
PKG_CONFIG_PATH environment variable
No package ‘oci8‘ found
设置方法在 /etc/profile 文件中增加下面一条:
export PKG_CONFIG_PATH=/usr/lib/pkgconfig/
http://blog.csdn.net/joker_zhou/article/details/8907915
配置用户的Oracle客户端环境变量配置
到该用户的根目录,编辑 .bash_profile 文件,设置环境变量.
vi .bash_profile
在内容后面新增如下配置:
export ora_home=/usr/local/instantclient_12_1
export
PATH=$PATH:$ora_home
export LD_LIBRARY_PATH=$ora_home
http://blog.csdn.net/lsxy117/article/details/8647600
这时候执行 go get github.com/wendal/go-oci8 就可以正常下载并编译了.
Oracle 客户端服务配置文件配置
要连接到某一台 oracle 服务器, 一般我们用 tnsnames.ora 文件方式来设置.
在一个目录下新建一个 tnsnames.ora 文件(比如我是建立在 /usr/local/instantclient_12_1/tns 目录下的 ),用于配置连接字符串别名。
这个文件内容类似如下,参考 http://hi.baidu.com/sunxden/item/f5e1423a9bfc298df4e4ad4b:
ORA10 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =
10.10.10.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ora10)
)
)
修改全局配置文件,增加一个 TNS_ADMIN 设置 ,指向这个目录。
set TNS_ADMIN=/usr/local/instantclient_12_1/tns
这杨我们连接字符串就可以写成 用户名/密码@实例名
整个安装过程中,全局变量设置的地方很多, 下面是我自己的 profile文件的相关设置:
export ora_home=/usr/local/instantclient_12_1
export PATH=$PATH:/sbin:/usr/local/go/bin:$ora_home
export
GOPATH=/home/ghj1976/gocodes
export
PKG_CONFIG_PATH=/usr/lib/pkgconfig/
export TNS_ADMIN=$ora_home/tns
export LD_LIBRARY_PATH=$ora_home
用工具检查oracle的连接
连接 oracle时,有时候我们需要用一些工具来判断连接问题,比如常见的:
ORA-12154: TNS:could not resolve the connect identifier specified 问题。
这时候就需要装一些类似下面的工具:
*Instant Client Package - SQL*Plus: Additional libraries and executable for running SQL*Plus with Instant Client
下载地址: http://618119.com/archives/2008/03/20/76.html
解压缩后我们会看到新加了 sqlplus 工具。
$unzip instantclient-sqlplus-linux.x64-12.1.0.1.0.zip -d ./
Archive: instantclient-sqlplus-linux.x64-12.1.0.1.0.zip
inflating: ./instantclient_12_1/SQLPLUS_README
inflating: ./instantclient_12_1/glogin.sql
inflating:
./instantclient_12_1/libsqlplus.so
inflating:
./instantclient_12_1/libsqlplusic.so
inflating:
./instantclient_12_1/sqlplus
**************sqlplus 连接远程数据库系统**********************
方式一:简易连接,不用进行网络配置,
其实就是不用tnsname.ora文件,但只支持oracle10G以上。
命令:sqlplus
用户名/密码@ip地址[:端口]/service_name [as sysdba]
示例:sqlplus
sys/pwd@ip:1521/test as sysdba
备注:使用默认1521端口时可省略输入
如果上述方式测试没问题,表示网络是通的。
方式二:使用 tnsnames 配置的别名
进行网络配置
2.1、图形化操作:Net Configuration Assistant--> 本地Net服务名配置-->添加->服务名->协议(选tcp)->主机名称->端口->完成。
2.2、文本化操作:编辑$ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora文件
test =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =
ip或主机名称)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = 数据库的服务名称)
)
)
备注说明:红色为修改部分
- PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。
- HOST:数据库侦听所在的机器的机器名或IP地址,数据库侦听一般与数据库在同一个机器上,所以当我说数据库侦听所在的机器一般也是指数据库所在的机器。在UNIX或WINDOWS下,可以通过在数据库侦听所在的机器的命令提示符下使hostname命令得到机器名,或通过ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址。需要注意的是,不管用机器名或IP地址,在客户端一定要用ping命令ping通数据库侦听所在的机器的机器名,否则需要在hosts文件中加入数据库侦听所在的机器的机器名的解析。
- PORT:数据库侦听正在侦听的端口.可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。
- SERVICE_NAME:在服务器端,用system用户登陆后,sqlplus> show parameter
service_name命令察看。
======================================================================
如何保证客户端机器连接到oracle数据库呢? 引用:http://www.cnoug.org/viewthread.php?tid=15661
A. 客户端
1.在客户端机器上安装ORACLE的Oracle
Net通讯软件,它包含在oracle的客户端软件中。
2.正确配置了sqlnet.ora文件
3.正确配置了tnsname.ora文件
B. 服务器端
1.保证listener已经启动 lsntctl start
2.保证数据库已经启动。
sql>startup
连接命令, 比如是上面的配置文件:
sqlplus user/password@test
sqlplus 连接用户名/密码@tns别名
方式三:tns别名部分用 tns的配置文件替代
sqlplus user/password@(DESCRIPTION=((ADDRESS=(PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))(CONNECT_DATA=(SERVICE_NAME = zzz)))
if you are using linux or unix OS you need to use quotes else the () are interpreted by the shell
e.g
sqlplus user/password@‘(DESCRIPTION=((ADDRESS=(PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))(CONNECT_DATA=(SERVICE_NAME = zzz)))‘
http://*.com/questions/761418/how-come-sqlplus-not-connecting
这种方式对分析 tnsname 文件配置错误非常有帮助, 我就碰到过一次 ( 配错,导致连接不上的问题。
http://www.cnblogs.com/winkey4986/archive/2012/09/20/2695259.html
===
http://blog.csdn.net/lsxy117/article/details/8647600
http://blog.csdn.net/joker_zhou/article/details/8907915
https://github.com/Centny/Centny/blob/master/Articles/How%20build%20github.com:mattn:go-oci8.md
http://blog.csdn.net/joker_zhou/article/details/8907915
===
http://www.oracle.com/technetwork/cn/articles/dsl/technote-php-instant-090922-zhs.html
参考
pkg-config指南
http://blog.csdn.net/exbob/article/details/6991037
理解 pkg-config 工具
http://www.chenjunlu.com/2011/03/understanding-pkg-config-tool/
Linux中的configure、pkg-config、pkg_config_path
http://yiluohuanghun.blog.51cto.com/3407300/946170