1. 程式人生 > >Go語言連接Oracle(就我這個最全)

Go語言連接Oracle(就我這個最全)

變量 連接 gop pan package get 之前 命令 size

綜合參考了網上挺多的方案

倒騰了半天終於連接好了

Go都出來這麽多年了

還沒有個Oracle的官方驅動。。。

過程真的很蛋疼。。一度想放棄直接連ODBC

首先交代一下運行環境和工具版本:

WIN10

MINGW64

ORACLE INSTANCCLIENT_18_3 x64

Jetbrins Goland

看完這篇文章,你可以解決如下問題(正經的解決):

編譯階段:
1. exec: "gcc": executable file not found in %PATH%

2. exec: "pkg-config": executable file not found in %PATH%

3. cannot use (**_Ctype_struct_OCIServer)(unsafe.Pointer(&conn.svc))

(type **_Ctype_struct_OCIServer) as type **_Ctype_struct_OCISvcCtx

in argument to func literal

運行階段:

1. Process finished with exit code -1073741701 (0xC000007B)

2. exit status 3221225595

開始

一、下載ORACLE INSTANCCLIENT 和對應的SDK

下載地址:https://www.oracle.com/technetwork/topics/winx64soft-089540.html

我選用了18.3 x64的版本,能向下兼容,不用擔心

註意basic版本和sdk都需要下載下來,一共是兩個文件

技術分享圖片

下載之後先解壓basic壓縮包,然後將sdk解壓到basic目錄下:

技術分享圖片

添加如下環境變量到系統PATH變量:(按自己的情況添加)

技術分享圖片

二、下載安裝MINGW64

主要是解決WIN中沒有GCC的問題

如果不安裝後期會出現問題:(exec: "gcc": executable file not found in %PATH%)

因為之前下載的ORACLE INSTANCCLIENT是64位的所以我們也需要下載MINGW64才能編譯

下載地址:https://sourceforge.net/projects/mingw-w64/files/

註意,第一個是在線安裝程序,較慢,建議直接下載7z壓縮包。解壓即可

技術分享圖片

解壓之後,添加如下環境變量到PATH:(按自己的情況添加)

技術分享圖片

三、獲取GO-OCI8驅動

執行命令:go get github.com/wendal/go-oci8

會報一個錯誤:pkg-config: exec: "pkg-config": executable file not found in %PATH%

先忽略,後面會解決

四、修改OCI8.PC

進入GOPATH目錄,找到OCI8.PC文件,打開,修改 紅色框的部分(按你自己的情況)

%GoPath%\src\github.com\wendal\go-oci8\windows

技術分享圖片

然後:

1.復制此目錄下pkg-config.exe到mingw64下的bin目錄

技術分享圖片

2.復制此目錄下oci8.pc到mingw64下的lib/pkg-config目錄(pkg-config目錄需要自己建)

技術分享圖片

添加如下(PKG_CONFIG_PATH)環境變量:(按自己情況)

技術分享圖片

五、最後一步

執行命令:go get github.com/wendal/go-oci8

此時執行這個操作

應該已經沒有(pkg-config: exec: "pkg-config": executable file not found in %PATH%)這個錯誤了,如果還有,就是上一步你做的不太對。

但是,還會有新的錯誤出現,如下:

技術分享圖片

不要慌

打開GOPATH目錄下,oci8.go文件

路徑:%GoPath%\src\github.com\wendal\go-oci8

此文件中四處OCIServer為OCISvcCtx

技術分享圖片

再次!!!!

執行命令:go get github.com/wendal/go-oci8

可以了,完事兒。

讓我們上一段代碼,測試一下:

package main

import (
    "database/sql"
    "fmt"
    "log"
    "os"

    _ "github.com/wendal/go-oci8"
)

func query() {
    os.Setenv("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8")
    log.SetFlags(log.Lshortfile | log.LstdFlags)
    db, err := sql.Open("oci8", "j1_bibox/[email protected]:1521/zjdevdb")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    rows, err := db.Query("select * from v$version")
    if err != nil {
        log.Fatal(err)
    }
    cols, _ := rows.Columns()
    rawResult := make([][]byte, len(cols))
    result := make([]string, len(cols))
    dest := make([]interface{}, len(cols))
    for i := range rawResult {
        dest[i] = &rawResult[i]
    }
    for rows.Next() {
        err = rows.Scan(dest...)
        for i, raw := range rawResult {
            if raw == nil {
                result[i] = ""
            } else {
                result[i] = string(raw)
            }
        }
        fmt.Printf("%s\n", result[0])
    }
    rows.Close()
}

func main() {
    query()
}

走你

就是這麽刺激,還是錯!!!!?????

現在不要慌,冷靜一點,分析情況

首先,如果你的代碼在IDE中運行,會報錯如下:

技術分享圖片

技術分享圖片

如果你不信這個邪,在cmd中運行,會報錯如下:

技術分享圖片

然後你拿著報錯信息,去找度娘,有人會告訴你,你的instanceclient版本不對,然後你就不停的換版本,換版本,換版本

然後發現卵用沒有

對,那個人就是我,=_=???????

現在!!我現在!!告訴你!!

真相只有一個!!!!!!!!

那就是:以管理員模式運行

技術分享圖片

來到這,無數次失敗,無數次嘗試最後獲得成功的激動,瞬間就把你點燃。

恐怕這就是計算機世界吸引我的地方吧。

IDE中也可以這樣解決問題:

技術分享圖片

最後的最後,讓我們給這段代碼加個註釋:

技術分享圖片

最後的最後的最後,如有指教,請留言。

Go語言連接Oracle(就我這個最全)