在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