镜像版本

在docker hub上搜索oracle,随便找了一个xe 11版本的镜像。

docker pull deepdiver/docker-oracle-xe-11g

镜像大小在1G左右,下载完成解压后大约2.7GB。

运行
docker run -d -p 1522:22 -p 1521:1521 --name oracle deepdiver/docker-oracle-xe-11g 

使用以上命令运行oracle。等1分钟左右,使用ssh root@localhost -p 1522可进入该容器,密码是admin。

进入bash环境后,执行如下命令,可解决中文乱码问题。

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"

镜像已经安装了sqlplus工具,可直接使用该工具进行连接,默认的system用户的密码是oracle。登录时会提示密码即将获取,改下密码即可。

# 使用sqlplus连接oracle
sqlplus system/oracle@//localhost/xe
# 修改密码
alter user system identified by oracle;
ubuntu16.04安装client

下载

在页面下载当前版本的basic和sdk client包,我这边下载的是19.3版本,文件是instantclient-basic-linux.x64-19.3.0.0.0dbru.zip , instantclient-sdk-linux.x64-19.3.0.0.0dbru.zip。

创建/opt/oracle目录,将上面两个文件移动到/opt/oracle目录并解压,将得到/opt/oracle/instantclient_19_3目录

配置oci8

可通过/usr/lib/pkgconfig目前是否存在确定当前ubuntu16.04已经安装过pkg_config,直接在该目录下新增oci8.pc,内容如下:

prefix=/opt/oracle/instantclient_19_3
exec_prefix=${prefix}
libdir=${exec_prefix}
includedir=${prefix}/sdk/include

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: oci8
Description: oci8 library
Libs: -L${libdir} -lclntsh
Cflags: -I${includedir}
Version: 19.3

配置环境变量

配置如下环境变量,不然golang执行会报错

export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_3
golang

编写单元测试用于oracle连接测试,先import驱动

import(
    _ "github.com/mattn/go-oci8"
)

获取连接

func getConn() (*sql.DB, error) {
	db, err := sql.Open("oci8", "system/oracle@localhost/xe")
	if err != nil {
		logrus.Errorf("init sql connection error:%s", err.Error())
		return db, err
	}
	// defer db.Close()
	if err = db.Ping(); err != nil {
		logrus.Errorf("open sql connection error:%s", err.Error())
		return db, err
	}
	return db, err
}

调用存储过程

func TestOracleV2(t *testing.T) {
	db, err := getConn()
	if err != nil {
		return
	}
	loginStmt, err := db.Prepare(`begin PKG_SMS_INTERFACE.send_sms('ms','短信平台密码',:1,:2,1,sysdate,:3);end;`)
	var result string
	defer loginStmt.Close()
	_, err = loginStmt.Exec("181027", "回家吃饭了", sql.Out{Dest: &result})
	if err != nil {
		logrus.Errorf("exec  error:%s", err.Error())
		return
	}
	fmt.Println(result)
}

调用结果:

=== RUN   TestOracleV2
success
--- PASS: TestOracleV2 (0.03s)

通过sqlplus查询表中的数据:

PHONE
--------------------
CONTENT
--------------------------------------------------------------------------------
SEND_TIME
--------------
10.20.0.5:3906,2019-05-17 08:55:06
17-5月 -19

181027
回家吃饭了
17-5月 -19