这几天在用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)
}
}