1. 程式人生 > >ubuntu16.04搭建oracle環境用於golang開發

ubuntu16.04搭建oracle環境用於golang開發

映象版本

在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
回家吃飯了