1. 程式人生 > 實用技巧 >golang開發oracle利器godror

golang開發oracle利器godror

golang開發oracle利器godror

godror是golang中連線oracle進行程式開發的一個驅動庫,解決了長期以來go對oracle支援不友好的問題。github專案地址

簡單查詢示例:
將查詢結果轉換為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["XM"] = XM
		m1["SFZH"] = SFZH
		m1["ZL"] = ZL
		m1["MJ"] = 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
		}

呼叫完成後,可以在輸出引數中獲取儲存過程執行後的輸出值。