zoukankan      html  css  js  c++  java
  • Go语言连接Oracle(就我这个最全)

    综合参考了网上挺多的方案

    倒腾了半天终于连接好了

    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%srcgithub.comwendalgo-oci8windows

    然后:

    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%srcgithub.comwendalgo-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/oracle123@10.1.196.200: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
    ", result[0])
        }
        rows.Close()
    }
    
    func main() {
        query()
    }

    走你

    就是这么刺激,还是错!!!!?????

    现在不要慌,冷静一点,分析情况

    首先,如果你的代码在IDE中运行,会报错如下:

    如果你不信这个邪,在cmd中运行,会报错如下:

    然后你拿着报错信息,去找度娘,有人会告诉你,你的instanceclient版本不对,然后你就不停的换版本,换版本,换版本

    然后发现卵用没有

    对,那个人就是我,=_=???????

    现在!!我现在!!告诉你!!

    真相只有一个!!!!!!!!

    那就是:以管理员模式运行

    来到这,无数次失败,无数次尝试最后获得成功的激动,瞬间就把你点燃。

    恐怕这就是计算机世界吸引我的地方吧。

    IDE中也可以这样解决问题:

     最后的最后,让我们给这段代码加个注释:

     

    最后的最后的最后,如有指教,请留言。

  • 相关阅读:
    HDU 5835 Danganronpa 贪心
    HDU 5842 Lweb and String 水题
    HDU 5832 A water problem 水题
    Codeforces Beta Round #14 (Div. 2) A. Letter 水题
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem K. UTF-8 Decoder 模拟题
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem I. Alien Rectangles 数学
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem H. Parallel Worlds 计算几何
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem F. Turning Grille 暴力
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem C. Cargo Transportation 暴力
    Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp
  • 原文地址:https://www.cnblogs.com/jiangyuqin/p/10135963.html
Copyright © 2011-2022 走看看