为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中连接到 Oracle DB

在 Go 中连接到 Oracle DB

Go
精慕HU 2021-10-04 16:04:19
我正在尝试从 Windows(64 位 Go,32 位客户端)连接到 Oracle DB我已经提出了这个问题,但我对 Go 完全陌生,所以我对他建议的配置一无所知。我安装了多个客户端,例如:1. `code.google.com\p\odbc`2. `github.com\mattn\go-oci8`我试图创建该oci8.pc文件,但似乎是错误的。prefix=/devel/target/1.0exec_prefix=${prefix}libdir=C:/oracle/instantclient_12_1/sdk/lib/msvcincludedir=C:/oracle/instantclient_12_1/sdk/includeoralib=C:/oracle/instantclient_12_1/sdk/lib/msvcorainclude=C:/oracle/instantclient_12_1/sdk/includegcclib=C:/TDM-GCC-64/libgccinclude=C:/TDM-GCC-64/includeglib_genmarshal=glib-genmarshalgobject_query=gobject-queryglib_mkenums=glib-mkenumsName: oci8Version: 12.1Description: oci8 libraryLibs: -L${oralib} -L${gcclib} -lociLibs.private:Cflags: -I${orainclude} -I${gccinclude}当我运行以下代码时,出现错误:// TestDBpackage mainimport ("github.com/odbc")func main() {conn, _ := odbc.Connect("DSN=lnxcepd1db01.XXXXXX.com:51521*CBPDEV;UID=XXXXX;PWD=XXXXX")defer conn.Close()stmt, _ := conn.Prepare("select * from XXXXX where XXXX = ?")defer stmt.Close()stmt.Execute("100044")rows, _ := stmt.FetchAll()for i, row := range rows {println(i, row)}}错误:panic: runtime error: invalid memory address or nil pointer dereference    panic: runtime error: invalid memory address or nil pointer dereference[signal 0xc0000005 code=0x0 addr=0x8 pc=0x43c3a6]goroutine 1 [running]:github.com/odbc.(*Connection).Close(0x0, 0x45)    C:/Go/UDL/src/github.com/odbc/odbc.go:263 +0x26github.com/odbc.(*Connection).newStmt(0x0, 0x36, 0xc0820120e0)    C:/Go/UDL/src/github.com/odbc/odbc.go:152 +0x50github.com/odbc.(*Connection).Prepare(0x0, 0x51cf70, 0x36, 0x0, 0x0, 0x0, 0xc082005e90, 0x9d6eb0)    C:/Go/UDL/src/github.com/odbc/odbc.go:162 +0x51main.main()    C:/Go/My Codes/new/TestDB.go:12 +0xc4goroutine 17 [syscall, locked to thread]:runtime.goexit()    c:/go/src/runtime/asm_amd64.s:2232 +0x1我错过了什么吗?如果有人能指出我正确的方向,我将非常感激。
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

这是一个执行完整 conn/prep/query/fetch 操作的函数:


func getDatePrepQuery(driver string, connString string) error {

    db, err := sql.Open(driver, connString)

    if err != nil {

        log.Printf("sql.Open(%s, %s)\n\t%s\n",

            driver, connString, err.Error())

        return err

    }

    defer db.Close()


    query := "select SYSDATE from dual"

    stmt, err := db.Prepare(query)

    if err != nil {

        log.Printf("db.Prepare(%s) failed.\n\t%s\n", query, err.Error())

        return err

    }

    defer stmt.Close()


    rows, err := stmt.Query()

    if err != nil {

        log.Printf("stmt.Query() failed.\n\t%s\n", err.Error())

        return err

    }

    defer rows.Close()


    var columns []string

    columns, err = rows.Columns()

    if err != nil {

        log.Printf("rows.Columns() failed.\n\t%s\n", err.Error())

    }

    for i, c := range columns {

        fmt.Printf("%3d %s\n", i, c)

    }


    for rows.Next() {

        var sysdate time.Time

        err = rows.Scan(&sysdate)

        if err != nil {

            log.Printf("rows.Scan(...) failed.\n\t%s\n", err.Error())

            return err

        }

        fmt.Println("SYSDATE:", sysdate)

    }

    err = rows.Err()

    if err != nil {

        log.Printf("rows iteration failed.\n\t%s\n", err.Error())

        return err

    }

    return nil

}

使用 Scan 是一个棘手的部分,因为 Oracle 程序员可能不习惯它。这个函数适用于我尝试过的所有 odbc、mgodbc、oci8、adodb 和 goracle 包。


查看完整回答
反对 回复 2021-10-04
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信