首页 > 数据库 >【fgolang代码分享】golang如何连接oracle进行业务开发

【fgolang代码分享】golang如何连接oracle进行业务开发

时间:2023-09-28 15:32:09浏览次数:38  
标签:rows nil err instantclient golang go fgolang oracle

在我们的开发场景下虽然大部分我们都使用mysql就可以满足我们日常的开发任务,但是总有一些开发场景是需要我们是用oracle数据库的,今天我给大家带来golang的俩种连接oracle的方式。 image.png

oracle简介

oracle也是出自甲骨文公司,和mysql同门,也是全球最大的信息管理软件及服务供应商,Oracle开发的关系数据库产品因性能卓越而闻名,Oracle数据库产品为财富排行榜上的前1000家公司所采用,许多大型网站也选用了Oracle系统,是世界最好的数据库产品。 mysql与oracle都是关系型数据库,应用于各种平台。mysql开源免费的,而oracle则是收费的,并且价格非常高 image.png

前置条件

golang连接Oracle 需要安装Oracle Full Client或Instant Client的驱动程序 Oracle的Instant

#选择Instant Client for Linux x86-64下载包如下:
instantclient-basic-linux.x64-21.1.0.0.0.zip
instantclient-sqlplus-linux.x64-21.1.0.0.0.zip
instantclient-sdk-linux.x64-21.1.0.0.0.zip

#都解压到 instantclient_21_1 这个目录,直接解压会解压到instantclient_21_1目录
unzip instantclient-basic-linux.x64-21.1.0.0.0.zip 
unzip instantclient-sdk-linux.x64-21.1.0.0.0.zip
unzip instantclient-sqlplus-linux.x64-21.1.0.0.0.zip

#打印instantclient_21_1目录的路径
pwd
/home/oracle/instantclient_21_1

安装pkg-config

#centos自带了pkg-config
pkg-config -version

创建配置文件oci8.pc

vim/home/oracle/oci8.pc
prefix=/home/oracle/instantclient_21_1
libdir=${prefix}
includedir=${prefix}/sdk/include/

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: oci8
Description: oci8 library
Libs: -L${libdir} -lclntsh
Cflags: -I${includedir}
Version: 21.1

环境变量配置

vim /etc/profile
# Oracle的OCI套件
export LD_LIBRARY_PATH=/home/oracle/instantclient_21_1
# oci8.pc文件所在路径
export PKG_CONFIG_PATH=/home/oracle

使配置生效
source /etc/profile

完成以上操作就可以进行做连接了~ 第一种方式

//使用go get github.com/mattn/go-oci8
//在GoPath的src目录下创建oracleoci8.go
package main

import (
	"database/sql"
	"fmt"
	_ "github.com/mattn/go-oci8"
	"log"
	"os"
)

func main() {
	if len(os.Args) != 2 {
		log.Fatalln(os.Args[0] + " user/password@host:port/sid")
	}
	fmt.Println(os.Args[1])

	db, err := sql.Open("oci8", os.Args[1])

	if err != nil {
		log.Fatalln(err)
	}
	defer db.Close()
	//查询用户
	rows, err := db.Query("select user from dual")
	if err != nil {
		log.Fatalln(err)
	}
	defer rows.Close()
	for rows.Next() {
		var data string
		rows.Scan(&data)
		fmt.Println(data)
	}
	if err = rows.Err(); err != nil {
		log.Fatalln(err)
	}
	//查询ZHUJI表的code字段
	rows2, err := db.Query("SELECT code FROM ZHUJI")
	if err != nil {
		log.Fatalln(err)
	}
	defer rows2.Close()
	for rows2.Next() {
		var data string
		rows2.Scan(&data)
		fmt.Println(data)
	}
	if err = rows2.Err(); err != nil {
		log.Fatalln(err)
	}
}

运行该代码

#直接运行
go run oracleoci8.go liang/[email protected]:1521/orcl
#或者先编译成二进制,在运行二进制文件
go build oracleoci8.go
./oracleoci8 liang/[email protected]:1521/orcl

第二种方式

//使用go get github.com/godror/godror
//在GoPath的src目录下创建oracledror.go
package main

import (
	"database/sql"
	"encoding/json"
	"fmt"
	_ "github.com/godror/godror"
)

func main() {
	db, err := sql.Open("godror", `user="liang" password="liang" connectString="192.168.0.4:1521/orcl"`)
	if err != nil {
		panic(err)
	}
	err = db.Ping()
	if err != nil {
		panic(err)
	}
	//查询ZHUJI表中code='pt'的sql:SELECT * FROM ZHUJI where CODE = 'pt'
	sqlStatement := "SELECT * FROM ZHUJI where CODE = :1"
	stmt, err := db.Prepare(sqlStatement)
	defer stmt.Close()
	if err != nil {
		panic(err)
	}
	rows, err := stmt.Query("pt") //输入sql中对应参数的值
	if err != nil {
		panic(err)
	}

	defer rows.Close() //defer关闭查询连接
	//获取列相关信息
	strings, _ := rows.Columns()

	for i := 0; i < len(strings); i++ {
		fmt.Print(" ", strings[i])
	}
	fmt.Print("\n")
	//构造切片存储json
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	m1 = make(map[string]interface{})

	var CODE, OVALUE1, OVALUE2 string
	for rows.Next() {
		rows.Scan(&CODE, &OVALUE1, &OVALUE2) //写入查询数据集的所有列名称
		fmt.Printf("code is %s, OVALUE1 is %s\n", CODE, OVALUE1)
		m1["CODE"] = CODE
		m1["OVALUE1"] = OVALUE1
		m1["OVALUE2"] = OVALUE2
		slice = append(slice, m1) //分片中追加信息
	}
	if err = rows.Err(); err != nil {
		// handle the error here
	}
	defer stmt.Close()

	data, err := json.Marshal(slice)
	if err != nil {
		fmt.Printf("序列化错误 err = %v\n", err)
	}
	//输出序列化后的结果 json字符串
	fmt.Printf("序列化后 = %v\n", string(data))
}

运行

#直接运行
go run oracledror.go
#或者先编译成二进制,在运行二进制文件
go build oracledror.go
./oracledror

以上就是golang的俩种连接oracle数据库的方式。

标签:rows,nil,err,instantclient,golang,go,fgolang,oracle
From: https://blog.51cto.com/yuanmouren/7640052

相关文章

  • golang之命令行工具Cobra
    github地址: https://github.com/spf13/cobra [安装]goget-ugithub.com/spf13/cobra@latest使用cobra_cli工具goinstallgithub.com/spf13/cobra-cli@latest [使用]#初始化工程cobra-cliinit#添加应用cobra-cliaddtimezone 示例://tim......
  • golang-channel
    什么是channel管道channel是goroutine与goroutine之间通信的重要桥梁channel是一个通道,用于端到端的数据传输,这有点像我们平常使用的消息队列,只不过channel的发送方和接受方是 goroutine 对象,属于内存级别的通信。这里涉及到了goroutine概念,goroutine是轻量级的......
  • oracle导出几百万数据-技巧
    --plsql新建表,但是plsql工具导出数据很慢CREATETABLEtmp_20221207ASSELECTaFROMbbbbb;--用NavicatPremium工具,用access的格式,导出文件--110w条数据导出   618.375s参考图片......
  • oracle常用命令
    目录一、基础增删改查1.解锁用户2.修改用户密码3.查看所有用户的缺省表空间4.查看表空间路径,名称,大小5.查看数据库大小6.查询数据库连接数-总数7.查询数据库连接数-详细连接数8.查询字符集9.数据库启停10.修改密码过期时间11.通过表名-->找用户12.性能排查sql  a.查看耗时SQL;b.......
  • ORACLE 11204 for Linux(RAC) 环境配置及数据库参数最佳实践
    ORACLE11204forLinux(RAC)环境配置及数据库参数最佳实践针对Linux6.6(+)版本:1、Linux内核参数配置vm.dirty_ratio=20vm.dirty_background_ratio=3vm.dirty_writeback_centisecs=100vm.dirty_expire_centisecs=500vm.swappiness=10vm.min_free_kbytes=524288##需要根据SGA......
  • 在windows10上安装多个golang
    在windows10上安装多个golang原理下载不同go版本,然后重命名go可执行文件,然后配置环境变量,不同命令使用不同的版本。其实所有的开发环境都可以这么使用。比如python2,python3方法问的文心一言,哈哈哈哈哈哈总体方法如下,具体可以参考例子,例子更清楚。创建一个新的文件夹,用于......
  • golang-waitgroup
    说明golang通过waitgroup来实现并发控制,用法跟java的CountDownLatch 效果一样 WaitGroup的使用场景和方法我们通过goroutine运行一个或者一组任务,需要关心这组任务执行完了进行通知WaitGroup如同它的字面意思,就是等待一组goroutine运行完成,主要有三个方法组成:Add(de......
  • 一个思路:实现 golang 中的 `__file__` `__line__` 宏
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯测试zaplog发现,开启caller的调用,会使整个服务增加2%的损耗。其实文件及其行号完全可以在编译期加上去,没必要带来运行期的性能损耗。因此有一个思路,可以解决这......
  • Oracle各个产品官方报价
    今天无意中找了Oracle官方网站基于产品的报价,记录一下:网址:https://shop.oracle.com/apex/f?p=dstore:2:0::NO:RIR,2:PROD_HIER_ID:28457297826249371097327176Oraclesoftware软件价格:(按Processor计算)(按user计算) (按Processor计算)ADG软件价格:(按Processor计算)按照user......
  • golang 反射
    参考https://www.cnblogs.com/jiujuan/p/17142703.htmlfloat反射示例packagemainimport( "fmt" "reflect")funcmain(){ varxfloat64=1.2345 fmt.Println("==TypeOf==") t:=reflect.TypeOf(x) fmt.Println("type:&quo......