golang開發oracle利器godror
godror是golang中連接oracle進行程序開發的一個驅動庫,解決了長期以來go對oracle支持不友好的問題。github項目地址
盡管編譯不需要 Oracle 客戶端庫,但在運行時需要它們,需要在生產環境里安裝oracle客戶端。從 https://www.oracle.com/database/technologies/instant-client/downloads.html 下載免費的 Basic 或 Basic Light 軟件包。
Linux下安裝oracle客戶端參見:文檔最后部分。
簡單查詢示例:
將查詢結果轉換為json字符串輸出
package main
import (
"database/sql"
"encoding/json"
"fmt"
_ "github.com/godror/godror"
)
func main() {
db, err := sql.Open("godror", `user="testq" password="123456" connectString="192.169.123.72:1521/orcl"`)
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
//查詢
sqlStatement := "SELECT * FROM BAJG where ID = :1"
stmt, err := db.Prepare(sqlStatement)
defer stmt.Close()
if err != nil {
panic(err)
}
rows, err := stmt.Query("479") //輸入sql中對應參數的值
//defer rows.Close()
if err != nil {
panic(err)
}
//rows, _ := db.Query("SELECT * FROM BAJG")
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 ID, XM, SFZH, ZL, MJ string
for rows.Next() {
rows.Scan(&ID, &XM, &SFZH, &ZL, &MJ) //寫入查詢數據集的所有列名稱
fmt.Printf("username is %s, department is %s\n", XM, ZL)
m1["ID"] = ID
m1["XMA"] = XM
m1["SFZHB"] = SFZH
m1["ZLC"] = ZL
m1["MJD"] = MJ
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("slice 序列化后 = %v\n", string(data))
fmt.Printf("ok")
}
存儲過程調用:
var po_out, po_fhz, po_msg string //存儲過程輸出參數
var loginid2, password2, gmsfhm string //存儲過程輸入參數
loginid2 = "aaa"
password2 = "aaa123"
gmsfhm = b.SFZH //"41234567890000000"
query := `BEGIN pro.abcproduce(:1,:2,:3,:4,:5,:6); END;`
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
//ctx, _ := context.WithCancel(context.Background())
if _, err := db.ExecContext(ctx, query, loginid2, password2, gmsfhm, sql.Out{Dest: &po_out}, sql.Out{Dest: &po_fhz}, sql.Out{Dest: &po_msg}); err != nil {
log.Printf("Error running %q: %+v", query, err)
panic(err)
//return
}
調用完成后,可以在輸出參數中獲取存儲過程執行后的輸出值。