47.蛤蟆笔记go——go连接Oracle

前端之家收集整理的这篇文章主要介绍了47.蛤蟆笔记go——go连接Oracle前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

47.蛤蟆笔记go——go连接Oracle@H_502_5@

在连接ORACLE数据库之前我们先来看下一个概念OCI。@H_502_5@

oci

ORACLE调用接口(Oracle Call Interface简称OCI)提供了一组可对ORACLE数据库进行存取的接口子例程函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的。@H_502_5@

Go-oci下载

地址:https://github.com/wendal/go-oci8@H_502_5@

放到开发路径下,文件夹go-oci8-master@H_502_5@

将go-oci8-master\windows (绝对路径,此处使用相对路径为例)加入到PATH 环境变量。@H_502_5@

设置环境变量PKG_CONFIG_PATHgo-oci8-master\windows(绝对路径,此处使用相对路径为例)@H_502_5@

下载OCI

地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html@H_502_5@

最新的版本是12.1.0.1.0@H_502_5@

安装到:C:/instantclient_12_1 @H_502_5@

修改oci8.pc文件中如下:@H_502_5@

prefix=C:/instantclient_12_1@H_502_5@

exec_prefix=C:/instantclient_12_1@H_502_5@

libdir=${exec_prefix}@H_502_5@

includedir=${prefix}/sdk/include/@H_502_5@

Name: OCI@H_502_5@

Description: Oracle database engine@H_502_5@

Version: 12.1@H_502_5@

Libs: -L${libdir} -loci@H_502_5@

Libs.private: @H_502_5@

Cflags: -I${includedir}@H_502_5@

历史版本下载:@H_502_5@

http://www.oracle.com/technetwork/cn/database/features/instant-client/index-092699-zhs.html@H_502_5@

修改oci8.go

如果报错:@H_502_5@

# go-oci8-master@H_502_5@

go-oci8-master\oci8.go:116: cannot convert(**C.struct_OCIServer)(unsafe.Pointer(&conn.svc)) (type**C.struct_OCIServer) to type **C.struct_OCISvcCtx@H_502_5@

@H_502_5@

exit status 2@H_502_5@

则需要修改\go-oci8-master\oci8.go文件@H_502_5@

有4个地方需要修改@H_502_5@

1、119行@H_502_5@

2、136行@H_502_5@

3、263行@H_502_5@

4、383行@H_502_5@

或者直接替换OCIServer为OCISvcCtx。@H_502_5@

代码

package main@H_502_5@

import (@H_502_5@

"database/sql"@H_502_5@

_"go-oci8-master"@H_502_5@

"log"@H_502_5@

"os"@H_502_5@

)@H_502_5@

func main() {@H_502_5@

// log添加文件,方便查看行数@H_502_5@

log.SetFlags(log.Lshortfile| log.LstdFlags)@H_502_5@

log.Println("OracleDriver example")@H_502_5@

os.Setenv("NLS_LANG","")@H_502_5@

// 用户名/密码@实例名sqlplusconn命令类似@H_502_5@

db,err:= sql.Open("oci8","tpcc2/tpcc2@toaddb")@H_502_5@

if err!= nil {@H_502_5@

log.Fatal(err)@H_502_5@

}@H_502_5@

rows,err := db.Query("select 3.14,'foo' from dual")@H_502_5@

if err!= nil {@H_502_5@

log.Fatal(err)@H_502_5@

}@H_502_5@

deferdb.Close()@H_502_5@

forrows.Next() {@H_502_5@

varf1 float64@H_502_5@

varf2 string@H_502_5@

rows.Scan(&f1,&f2)@H_502_5@

log.Println(f1,f2) // 3.14 foo@H_502_5@

}@H_502_5@

rows.Close()@H_502_5@

@H_502_5@

// 先删表,再建表@H_502_5@

db.Exec("droptable sdata")@H_502_5@

db.Exec("createtable sdata(name varchar2(256))")@H_502_5@

db.Exec("insertinto sdata values('中文')")@H_502_5@

db.Exec("insertinto sdata values('1234567890ABCabc!@#$%^&*()_+')")@H_502_5@

rows,err = db.Query("select * from sdata")@H_502_5@

if err!= nil {@H_502_5@

log.Fatal(err)@H_502_5@

}@H_502_5@

forrows.Next() {@H_502_5@

var name string@H_502_5@

rows.Scan(&name)@H_502_5@

log.Printf("Name= %s,len=%d",name,len(name))@H_502_5@

}@H_502_5@

rows.Close()@H_502_5@

}@H_502_5@

执行

2016/07/1011:09:51 hello.go:14: Oracle Driver example@H_502_5@

2016/07/1011:09:51 hello.go:33: 3.14 foo@H_502_5@

2016/07/1011:09:52 hello.go:52: Name = 中文,len=6@H_502_5@

2016/07/1011:09:52 hello.go:52: Name = 1234567890ABCabc!@#$%^&*()_+,len=28@H_502_5@

完毕。@H_502_5@

猜你在找的Oracle相关文章