一、知識(shí)準(zhǔn)備
oracle未對(duì)golang提供官方驅(qū)動(dòng),此處使用 OCI方案,包使用:https://github.com/mattn/go-oci8
要通過cgo工具對(duì)oci進(jìn)行封裝編譯接校,需要安裝C/C++的構(gòu)建工具(windows使用mingw,macOS和linux使用gcc [1])
二睦柴、環(huán)境準(zhǔn)備
ps:此處使用windows環(huán)境,linux 和 macos類似
2.1 安裝Oracle client
2.1.1 下載數(shù)據(jù)庫對(duì)應(yīng)版本的 oracle client basic 和 sdk训柴。
下載地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
ps:根據(jù)網(wǎng)上資料 oracle 11g如果使用 11.*版本可能出現(xiàn)問題(未測(cè)試)妇拯,此處使用 12.2版本 幻馁,另外 go-oci8說明的例子中也是用此版本。
2.1.2 解壓
將兩個(gè)文件解壓到 同一目錄下 (此處用:c:/app 越锈,此處使用系統(tǒng)盤仗嗦,如果使用其他盤,編譯的時(shí)候會(huì)出現(xiàn) ld.exe not find l**** 類型錯(cuò)誤)
2.2 安裝c/c++構(gòu)建工具
mingw下載地址:https://sourceforge.net/projects/mingw-w64/files/
ps:此處根據(jù)自己系統(tǒng)選擇版本甘凭,x_86_64是64位稀拐,i686 是32位, posix 和 win32是線程模型丹弱,詳見https://www.cnblogs.com/findumars/p/8290230.html 德撬,sjlj铲咨、seh、dwarf為異常處理模型蜓洪,建議 64為用 seh ,32位用 dwarf
2.2.2 解壓
將下載的壓縮文件解壓到非系統(tǒng)盤纤勒,此處用 d:/ (如果放到系統(tǒng)盤會(huì)出現(xiàn) OCIEnvCreate 異常,原因是權(quán)限不足隆檀,需要使用 管理員啟動(dòng)IDE即可)
2.2.3 添加環(huán)境變量
在環(huán)境變量 path 中添加 d:/mingw64/bin
2.2 pkg-config
pkg-config是一個(gè)linux下的命令摇天,用于獲得某一個(gè)庫/模塊的所有編譯相關(guān)的信息。[2]
window中使用只需下載 pkg-config.exe 放到 mingw的bin目錄中即可恐仑。下載地址
- 32位:http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip
- 64位:http://ftp.gnome.org/pub/gnome/binaries/win64/dependencies/pkg-config_0.23-2_win64.zip
pkg-config 的配置信息有兩種方案(linux):
1)取系統(tǒng)的/usr/lib下的所有.pc文件泉坐。
2)PKG_CONFIG_PATH環(huán)境變量所指向的路徑下的所有.pc文件。
windows下我們使用d:/mingw64/lib/下創(chuàng)建 pkg-config 文件夾裳仆,并在里面創(chuàng)建 oci8.pc 文件腕让,內(nèi)容為
prefix=/dev/target/oracle-oci8
exec_prefix=${prefix}
libdir=c:/app/instantclient_12_2
includedir=c:/app/instantclient_12_2/sdk/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: oci8
Description: oci8 library
Libs: -L${libdir} -loci
Cflags: -I${includedir}
Version: 12.2
ps: 此處與go-oci8 github上的例子有出入,libdir 如果指定到 /sdk/oci/lib/msvc 目錄鉴逞,沒找都此目錄记某,libdir的目中要保證含有 oci.dll
二、代碼測(cè)試
package main
import (
"database/sql"
_ "github.com/mattn/go-oci8"
"log"
)
func main() {
db, err := sql.Open("oci8", "tt/bitservice@127.0.0.1:1521/orcl")
if err != nil {
log.Fatal(err)
}
rows, err := db.Query("select 3.14, 'foo' from dual")
if err != nil {
log.Fatal(err)
}
defer db.Close()
for rows.Next() {
var f1 float64
var f2 string
rows.Scan(&f1, &f2)
log.Println(f1, f2) // 3.14 foo
}
rows.Close()
// 先刪表,再建表
db.Exec("drop table sdata")
db.Exec("create table sdata(name varchar2(256))")
db.Exec("insert into sdata values('中文')")
db.Exec("insert into sdata values('1234567890ABCabc!@#$%^&*()_+')")
rows, err = db.Query("select * from sdata")
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var name string
rows.Scan(&name)
log.Printf("Name = %s, len=%d", name, len(name))
}
rows.Close()
}
三构捡、運(yùn)行異常
編譯出現(xiàn)異常液南,例如:
pkg 3221225781的錯(cuò)誤原因很多,但提示太少勾徽。我們可以使用cmd 直接運(yùn)行 pkg-config --cflags -- oci8 命令滑凉,查看編譯連接時(shí)的錯(cuò)誤
百度解決即可
參考資料: