golang连接orcale

 

使用glang有一段时间了,最开始其实并不太喜欢他的语法,但是后来熟悉之后发现用起来还挺爽的。之前数据库一直使用mysql,连接起来没有什么问题,github上有很多完善的驱动,所以以为连接其他数据库也应该没什么问题,近日听说其连接orcale比较麻烦,所以就试了试。

之所以连接orcale比较麻烦是因为orcale并没有提供golang的驱动,所以并不能像java那样引入个驱动包就能连接,也不能像mysql之类的开源数据库可以自己实现驱动。不过正所谓天无绝人之路,既然纯go实现不了,那么还可以用cgo实现,c语言总该支持了吧。
    网上有很多方法,不过都是使用oci实现的,这里我们使用go-oci8(https://github.com/wendal/go-oci8)

一、安装MinGW

首先我们先来配置环境,由于cgo需要gcc支持,所以需要配置gcc环境,如果是linux下一般可以跳过该步骤,win下则需要自己安装了,这里我们使用MinGW,可以到官网现下载,不过官网直接提供的安装程序需要安装时联网下载,很可能会失败,所以几经搜索之后找到如下网址:

  • MinGW下载地址相关:http://blog.csdn.net/mecho/article/details/24305369

里边详细介绍了MinGW各版本的不同,可根据自己情况下载,由于我是64位,这里下载64位的POSIX版本
    具体的安装过程就不费话了,直接解压即可。

二、安装OCI

由于没有对应驱动包,我们不能直接连接,所以需要通过orcale提供OCI接口(有点像odbc),里边包含需要的类库。下载直接官网就行,找到系统对应版本:

  • oci下载地址:http://www.oracle.com/technetwork/topics/winsoft-085727.html

需下载Basic和SDK,下载后解压Basic到instantclient_11_1,然后将SDK解压到instantclient_11_1\sdk下。
    在instantclient_11_1下建立\network\admin\目录,添加tnsnames.ora(这个就不解释了吧),内容根据自己的orcale设置。

三、配置go-oci8

直接go get github.com/wendal/go-oci8(报错不用管),然后到go\src\github.com/wendal\go-oci8\windows下,将pkg-config.exe拷贝到MinGW\bin下,将oci8.pc复制到MinGW\lib\pkg-config\下,并且编辑oci8.pc:

# Package Information for pkg-config
prefix=修改为instantclient_11_1目录,如F:/dev/instantclient_11_1
exec_prefix=修改为instantclient_11_1目录,如F:/dev/instantclient_11_1
libdir=${exec_prefix}
includedir=${prefix}/sdk/include/ Name: OCI
Description: Oracle database engine
Version: 11.2
Libs: -L${libdir} -loci
Libs.private:
Cflags: -I${includedir}

四、设置环境变量

环境变量path下添加instantclient_11_1和mingw\bin的路径
    添加PKG_CONFIG_PATH=C:\mingw\lib\pkg-config
    添加TNS_ADMIN=F:\dev\instantclient_11_1\network\admin\

五、测试

在此执行go get github.com/wendal/go-oci8,如果没错那说明大功告成。具体测试代码见github.com\wendal\go-oci8\example下的oracle.go,注意要把里边import中的mattn改成wendal。一下是我的代码:

package main
import (
"database/sql"
_ "github.com/wendal/go-oci8"
"log"
)
func query() {
// 为log添加短文件名,方便查看行数
log.SetFlags(log.Lshortfile | log.LstdFlags)
// 用户名/密码@实例名 跟sqlplus的conn命令类似
db, err := sql.Open("oci8", "username/pwd@ORCL")
if err != nil {
log.Fatal(err)
}
defer db.Close() rows, err := db.Query("select name from FUB_B")
if err != nil {
log.Fatal(err)
} for rows.Next() {
var name string
rows.Scan(&name)
log.Printf("Name = %s, len=%d", name, len(name))
}
rows.Close()
} func update() {
// 为log添加短文件名,方便查看行数
log.SetFlags(log.Lshortfile | log.LstdFlags)
// 用户名/密码@实例名 跟sqlplus的conn命令类似
db, err := sql.Open("oci8", "username/pwd@ORCL")
if err != nil {
log.Fatal(err)
}
defer db.Close() stmt, _ := db.Prepare(`UPDATE FUB_B set name ='cnm'`)
result, err := stmt.Exec()
if err != nil {
log.Fatal(err)
}
count, _ := result.RowsAffected()
log.Printf("result count:%d", count)
} func main() {
update()
}
 
 
分类: golang
标签: golanggoorcaleoci

go orcale的更多相关文章

  1. orcale删除重复数据

    1.删除orcale重复数据, delete from da_door awhere (a.dt,a.key1) in (select dt,key1 from da_door group by dt ...

  2. Orcale(一)概念

    一 . 基本概念 :   1. orcaleinstanceclient : orcale的客户端  ( 1. 中文乱码问题 : NLS_LANG=SIMPLIFIED CHINESE_CHINA.Z ...

  3. orcale 循环插入 测试数据

    以前开发一直用的是sql server   定义临时变量 循环插入数据到表中已经成为一种固定的模式,本来想orcale应该也一样吧 都是数据库.. 结果被现实无情的打击到了.在网上找办法,求大神 最后 ...

  4. orcale同一条语句运行速度差异问题

    在oracle中执行一个查询语句,该语句首次执行时orcale会把其内容存入SGA(系统全局区)中,下次再执行同一条语句的时候就不再去解析该语句,而是直接从SGA区中取出该语句执行,但是前提是SQL没 ...

  5. Orcale Function Sequence

    Orcale Function Sequence. 1 Create Or Replace Function F_Get_Sequence(As_Companyno In Varchar2, As_T ...

  6. sqlserver分页;mysql分页;orcale分页 的sql 查询语句

    一,sqlserver分页: )) ID FROM 表名 AS 表名1_1 ORDER BY ID)) ORDER BY ID; 二:mysql分页 )*每页显示的数据条数,当前页码 * 每页显示的数 ...

  7. Orcale安装完成后 em管理、性能无法登陆 报:没有找到主机

    先在我的电脑环境变量中加入oracle_sid=orcl 在Orcale主目录中查找emd.properties 文件修改(时间格式) agentTZRegion=GMT agentTZRegion= ...

  8. orcale装完sqldevelop启动不了

    一直在搞考试,昨天考java企业级开发要交项目搞得我装系统后又装了个orcale,每次重新配百度太麻烦,还好记得点,记录下碰到的错误 64位的系统下的orcale11 64位里面的sqldevelop ...

  9. MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法

    在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法. 可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应 ...

随机推荐

  1. git checkout 命令详解(转)

    在日常的git操作中,git checkout——检出,是我们的常用命令.最为常用的两种情形是创建分支和切换分支. 在下面的命令中,使用了一些简写,在这里说明一下: git st # git stat ...

  2. 国产与第三方库FFmpeg SDK

    一个.编译并安装第三方库 1. libfaac # tar -zxvf faac-1.28.tar.gz # cd faac-1.28 # ./configure --prefix=/opt/YOUR ...

  3. Jquery 插件初学习

    参考文章:插件开发精品教程,让你的jQuery提升一个台阶 刚刚学了一下jquery的插件插件开发,写个demo记录.练习一下.毕竟,输出才是最好的学习. 这个也不过是最基础的一个插件写法,只是,自己 ...

  4. HDU 4349 Xiao Ming's Hope

    非常无语的一个题. 反正我后来看题解全然不是一个道上的. 要用什么组合数学的lucas定理. 表示自己就推了前面几个数然后找找规律. C(n, m) 就是 组合n取m: (m!(n-m!)/n!) 假 ...

  5. thinkphp学习笔记7—多层MVC

    原文:thinkphp学习笔记7-多层MVC ThinkPHP支持多层设计. 1.模型层Model 使用多层目录结构和命名规范来设计多层的model,例如在项目设计中如果需要区分数据层,逻辑层,服务层 ...

  6. hibernate 管理 Session(单独使用session,不spring)

    Hibernate 本身提供了三个管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 托付程序管理 ...

  7. RQNOJ PID4 / 数列(位运算)

    题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是 ...

  8. jquery 访问控制菜单

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpqOTExOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  9. js 实现键盘记录 兼容FireFox和IE

    这两天突然想弄弄js的键盘记录,所以就小研究了一下. 主要分四个部分 第一部分:浏览器的按键事件 第二部分:兼容浏览器 第三部分:代码实现和优化 第四部分:总结 第一部分:浏览器的按键事件 用js实现 ...

  10. Java-继承特性

    继承的特点: 1.提高了代码的复用性. 2.让类与类之间发生了关系,有了这个关系,才有了多态的特性. (注意:千万不要为了获取其他类的功能,简化代码而继承:必须是类与类之间有所属关系才可以继承,所属关 ...