go操作oracle详细

这几天在用java写操作Oracel的程序,由于种种原因,Oracel未提供官方Go驱动。

在github上搜索了N多驱动,oci8,ora,等等,太多了,已经记不清下了多少个包了。

最终发觉能用的是jzaikovs\ora。

下面是遇到的问题及解决办法:

     1。oracle库中Number(19)这种长度的数据,读取时会科学计数法,而且精度丢失3位,

          可以在写SQL时,使用to_char转换成字符,在go中,根据需要再作转换(可以是uint64)。

     2。日期型问题,

          同上,在SQL中转换to_char(field,'yyyy-MM-dd HH:mm:ss')

     3。配置

          在oracle官网下载12.1的base_client以及sdk包,都解压,并把sdk放在baseclient目录中。

          在liteide中加入如下配置(环境变量)

          

# native compiler windows amd64

GOROOT=c:\go
#GOBIN=
GOARCH=amd64
GOOS=windows
CGO_ENABLED=1
GOOPATH=c:\projects\testgo
CGO_CFLAGS=-IC:/projects/instantclient_12_1/sdk/include
CGO_LDFLAGS=C:/projects/instantclient_12_1/oci.dll

 具体路径根据自己情况修改。

        4。程序示例代码:

   

package main

import (
	"database/sql"
	_ "github.com/jzaikovs/ora"
	"log"
	"os"
)

func main() {
	os.Setenv("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8") //解决中文乱码

	db, err := sql.Open("ora", "用户名/密码@//ip地址:1521/sid")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	rows, err := db.Query("select to_char(id) as s_id,EntName from XXX")
	if err != nil {
		panic(err)
	}
	defer rows.Close()
	var id string
	var name string
	for i := 0; i < 100 && rows.Next(); i++ {
		rows.Scan(&id, &name)
		log.Printf("%s %s \n", id, name)
	}
}

猜你喜欢

转载自xiaoa7.iteye.com/blog/2205784