47.笔记go——go连接Oracle

来源:互联网 发布:knn算法matlab 编辑:程序博客网 时间:2024/06/04 19:07

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_PATHgo-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

修改oci8.pc文件中如下:

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添加短文件名,方便查看行数

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

           log.Println("OracleDriver example")

           os.Setenv("NLS_LANG","")

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

           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

完毕。

原创粉丝点击