Golang在Ubuntu 上使用Oracle資料庫

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。一、安裝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()
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.