Golang在Ubuntu 上使用Oracle数据库

一、安装Oracle的OCI套件

1、OCI下载链接页面下载(instantclient-basic,instantclient-sdk)

http://www.oracle.com/technetwor ... t/index-097480.html

2、解压缩到同一个目录下,比如:instantclient_12_1

3、root权限移动文件夹到目录 /usr/lib 下

2、root权限执行以下命令

##​ 其实直接cp拷贝过去也是一样的

ln /usr/lib/instantclient_12_1/libclntsh.so.12.1 /usr/lib/libclntsh.so
ln /usr/lib/instantclient_12_1/libocci.so.12.1 /usr/lib/libocci.so
ln /usr/lib/instantclient_12_1/libociei.so /usr/lib/libociei.so

ln /usr/lib/instantclient_12_1/libnnz12.so /usr/lib/libnnz12.so

## 以下两条是为了运行sqlplus命令

ln /usr/lib/instantclient_12_1/​libsqlplusic.so /usr/lib/libsqlplusic.so​


ln /usr/lib/instantclient_12_1/libsqlplus.so /usr/lib/libsqlplus.so​

##​ 把 OCI路径加入系统加载动态库的路径中,并重新加载一次
​echo /opt/oracle/instantclient >> /etc/ld.so.conf
​ldconfig

3、安装pkg-config

4、在 /usr/lib/pkgconfig 目录下创建文件 oci8.pc,内容如下:

prefix= 
// 路径改为/usr/lib/instantclient_12_1
libdir=${prefix}
includedir=${prefix}/sdk/include/

Name: OCI
Description: Oracle database engine
Version: 12.1 
// 版本改为实际的版本号
Libs: -L${libdir} -lclntsh
Libs.private:
Cflags: -I${includedir}


5、直接运行步骤6会报libaio不存在的错误,安装libaio库

sudo apt-get install libaio1

6、安装go-oci8

go get github.com/mattn/go-oci8​

7、.bashrc 文件中添加系统变量

# OCI安装目录​
export ORACLE_HOME=/usr/lib/instantclient_12_1
# ​tnsnames.ora 文件地址​
​export TNS_ADMIN=$ORACLE_HOME/network/admin
# OCI安装目录加入动态库加载路径​
​export LD_LIBRARY_PATH=$ORACLE_HOME
# oci8.pc文件所在路径
export PKG_CONFIG_PATH=/usr/lib/pkgconfig

8、 tnsnames.ora 文件的内容


CODE:
awsdb=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.126)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = awsdb)
)
)


EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

二、使用github.com/mattn/go-oci8操作Oracle数据库​

​2.1、增删改查
CODE:
package main

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



func main() {

// 字符集
os.Setenv("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8")

// 注意连接字符串的写法
db, err := sql.Open("oci8", "awsdb/awsdb@192.168.0.126:1521/awsdb")
if err != nil {
fmt.Println(err)
return
}
// 事务开启
myTx,err:=db.Begin()

myTx.Commit()



// 查询与结果遍历
rows, err := db.Query("select nodeid,nodename from AA_MT_TEST")
if err != nil {
fmt.Println(err)
return
}
for rows.Next() {
var f1 string
var f2 string
rows.Scan(&f1, &f2)
println(f1, f2) // 3.14 foo
}
rows.Close()

_, err = db.Exec("create table foo(bar varchar2(256))")
_, err = db.Exec("drop table foo")
if err != nil {
fmt.Println(err)
return
}
// 关闭数据库连接
db.Close()

}




2.2、执行了一个存储过程、使用结构保存结果




package main


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


var (
db *sql.DB
mux sync.Mutex
)

// 多行字符串的定义
var userTableSql string = `
BEGIN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE user_profile';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
EXECUTE IMMEDIATE 'CREATE TABLE user_profile (id int PRIMARY KEY, name VARCHAR(20) NOT NULL, created VARCHAR(20) NOT NULL)';
END;
`



func init() {

// 锁
mux.Lock()
defer mux.Unlock()


os.Setenv("NLS_LANG", "AMERICAN_AMERICA.ZHS16GBK")
// check
if db != nil {
return
}


// open
oracledb, err := sql.Open("oci8", "awsdb/awsdb@192.168.0.126:1521/awsdb")
checkErr(err)


// new db
db = oracledb


// create database table
_, err = db.Exec(userTableSql)
checkErr(err)
}


func checkErr(err error) {
if err != nil {
panic("oracle err:" + err.Error())
}
return
}


func main() {
// insert
insertSql := `insert into user_profile(id,name,created) values(1,'viney','2013-03-06')`
_, err := db.Exec(insertSql)
checkErr(err)


// update
updateSql := `update user_profile set name='中国人' where id=1`
_, err = db.Exec(updateSql)
checkErr(err)


// select
querySql := `select * from user_profile where id=1`
rows, err := db.Query(querySql)


type user struct {
id int // 这个地方改成string才不会报错,但是我创建数据库是int类型
name string
created string
}


var u = &user{}
for rows.Next() {
err = rows.Scan(
&u.id,
&u.name,
&u.created)
checkErr(err)
}
rows.Close()


fmt.Println(*u)


// delete
deleteSql := `delete from user_profile where id=1`
_, err = db.Exec(deleteSql)
checkErr(err)


db.Close()
}
可以使用Oracle提供的go库 "github.com/godror/godror" 来实现。 以下是一个示例程序,用于向Oracle数据库中的表插入日期数据: ```go package main import ( "context" "database/sql" "fmt" "time" "github.com/godror/godror" ) func main() { // 创建一个Oracle数据库连接 dsn := godror.ConnectionParams{ Username: "username", Password: "password", SID: "sid", } db, err := sql.Open("godror", dsn.StringWithPassword()) if err != nil { panic(err) } defer db.Close() // 准备Insert语句 query := `INSERT INTO my_table (id, my_date) VALUES (:1, :2)` stmt, err := db.PrepareContext(context.Background(), query) if err != nil { panic(err) } defer stmt.Close() // 准备要插入的日期数据 myDate := time.Date(2021, 10, 1, 0, 0, 0, 0, time.UTC) // 执行Insert语句 result, err := stmt.ExecContext(context.Background(), 1, myDate) if err != nil { panic(err) } // 输出Insert结果 rowsAffected, err := result.RowsAffected() if err != nil { panic(err) } fmt.Printf("%d rows affected\n", rowsAffected) } ``` 在上面的示例程序中,我们使用 `time.Date` 函数创建了一个日期对象,然后将其作为参数插入到Insert语句中。在执行Insert语句时,我们使用了 `stmt.ExecContext` 函数,该函数的第二个参数是要插入的日期数据。 需要注意的是,Oracle数据库中的date类型数据与golang中的time.Time类型数据具有不同的格式。在这种情况下,godror库会自动将golang的time.Time类型数据转换为Oracle的date类型数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值