47.笔记go——go连接Oracle
在连接ORACLE数据库之前我们先来看下一个概念OCI。
oci
ORACLE调用接口(Oracle Call Interface简称OCI)提供了一组可对ORACLE数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的。
Go-oci下载
地址:https://github.com/wendal/go-oci8
放到开发路径下,文件夹go-oci8-master
将go-oci8-master\windows (绝对路径,此处使用相对路径为例)加入到PATH 环境变量。
设置环境变量PKG_CONFIG_PATH为go-oci8-master\windows(绝对路径,此处使用相对路径为例)
下载OCI
地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
最新的版本是12.1.0.1.0
安装到:C:/instantclient_12_1
prefix=C:/instantclient_12_1
exec_prefix=C:/instantclient_12_1
libdir=${exec_prefix}
includedir=${prefix}/sdk/include/
Name: OCI
Description: Oracle database engine
Version: 12.1
Libs: -L${libdir} -loci
Libs.private:
Cflags: -I${includedir}
历史版本下载:
http://www.oracle.com/technetwork/cn/database/features/instant-client/index-092699-zhs.html
修改oci8.go
如果报错:
# go-oci8-master
go-oci8-master\oci8.go:116: cannot convert(**C.struct_OCIServer)(unsafe.Pointer(&conn.svc)) (type**C.struct_OCIServer) to type **C.struct_OCISvcCtx
exit status 2
则需要修改\go-oci8-master\oci8.go文件
有4个地方需要修改
1、119行
2、136行
3、263行
4、383行
或者直接替换OCIServer为OCISvcCtx。
代码
package main
import (
"database/sql"
_"go-oci8-master"
"log"
"os"
)
func main() {
log.SetFlags(log.Lshortfile| log.LstdFlags)
log.Println("OracleDriver example")
os.Setenv("NLS_LANG","")
// 用户名/密码@实例名跟sqlplus的conn命令类似
db,err := sql.Open("oci8","tpcc2/tpcc2@toaddb")
iferr != nil {
log.Fatal(err)
}
rows,err := db.Query("select 3.14,'foo' from dual")
iferr != nil {
log.Fatal(err)
}
deferdb.Close()
forrows.Next() {
varf1 float64
varf2 string
rows.Scan(&f1,&f2)
log.Println(f1,f2) // 3.14 foo
}
rows.Close()
// 先删表,再建表
db.Exec("droptable sdata")
db.Exec("createtable sdata(name varchar2(256))")
db.Exec("insertinto sdata values('中文')")
db.Exec("insertinto sdata values('1234567890ABCabc!@#$%^&*()_+')")
rows,err = db.Query("select * from sdata")
iferr != nil {
log.Fatal(err)
}
forrows.Next() {
var name string
rows.Scan(&name)
log.Printf("Name= %s,len=%d",name,len(name))
}
rows.Close()
}
执行
2016/07/1011:09:51 hello.go:14: Oracle Driver example
2016/07/1011:09:51 hello.go:33: 3.14 foo
2016/07/1011:09:52 hello.go:52: Name = 中文,len=6
2016/07/1011:09:52 hello.go:52: Name = 1234567890ABCabc!@#$%^&*()_+,len=28
完毕。
原文链接:/oracle/207464.html