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