go链接Oracle

1、先安装gcc,可以参考   超详细教程:windows安装MSYS2(mingw && gcc)

2、go代码

 

package main

import (
	"database/sql"
	"fmt"
	"time"

	"github.com/godror/godror"
)

//全局链接变量
var db *sql.DB

const (
	host        string = "127.0.0.1"
	port        string = `1521`
	user        string = "user"
	sqlpassword string = "sqlpassword"
	dbname      string = "orcl"
)

//初始化数据库链接
func init() {
	// 用户名/密码@IP:端口/实例名
	//osqlInfo := fmt.Sprintf("%s/%s@%s:%d/%s?timezone=local", user, sqlpassword, host, port, dbname)

	//	db, err := sql.Open("godror", osqlInfo)

	var P godror.ConnectionParams
	P.Username, P.Password = user, godror.NewPassword(sqlpassword)
	P.ConnectString = host + ":" + port + "/" + dbname + "?connect_timeout=5"
	P.SessionTimeout = 32 * time.Second
	//	P.SetSessionParamOnInit("NLS_NUMERIC_CHARACTERS", ",.")
	// loc, _ := time.LoadLocation("Asia/Shanghai")
	// P.Timezone = loc

	//fmt.Println(P.String()) //打印全部参数

	db = sql.OpenDB(godror.NewConnector(P))
	if y := db.Ping(); y != nil {
		fmt.Println(`y is ====?`, y)
		return
	} else {
		fmt.Println(`链接数据库成功!`)
	}

}

func main() {

	sqlStatement := `SELECT * from(		SELECT rownum as orderid,e.* FROM wms.jc_jgm e where djbm =:1 ) f where f.orderid>=:2 and f.orderid<:3	`
	stmt, err := db.Prepare(sqlStatement)

	if err != nil {
		fmt.Println(err)
		panic(err)
	}
	defer stmt.Close()

	rows, err := stmt.Query("YYXX2204210033", 3, 5) //输入sql中对应参数的值
	if err != nil {
		panic(err)
	}

	defer rows.Close() //defer关闭查询连接
	a, _ := sql_rows(rows)
	for i := 0; i < len(a); i++ {

		fmt.Println(i, `行结果集==>`)
		d := a[i]
		map_sort(d)
		for y, d1 := range d {

			if x, ok := d1.([]byte); ok && len(x) > 0 {
				fmt.Println(y, `==>OK==>`, string(x))
			}

		}
	}

}

 

工具函数:

 

package main

import (
	"database/sql"
	"fmt"
	"sort"
)

/*返回有序map*/
func sql_rows(rows *sql.Rows) (map[int]map[string]interface{}, error) {

	//读出查询出的列字段名
	cols, _ := rows.Columns()
	//	fmt.Println(cols)
	//values是每个列的值,这里获取到byte里
	values := make([][]byte, len(cols))
	//query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度
	scans := make([]interface{}, len(cols))
	//让每一行数据都填充到[][]byte里面
	for i := range values {
		scans[i] = &values[i]
	}

	//最后得到的map
	results := make(map[int]map[string]interface{})
	i := 0
	for rows.Next() { //循环,让游标往下推
		if err := rows.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
			//fmt.Println(err)
			return nil, err
		}

		row := make(map[string]interface{}) //每行数据

		for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
			//key := strings.ToLower(cols[k])
			key := cols[k]
			row[key] = v

			//fmt.Println("row[key]======>", row[key])
		}
		results[i] = row //装入结果集中
		i++
	}

	//return json.Marshal(results)
	return results, nil

}

//有序打印  map[string]interface{}
func map_sort(map_list map[string]interface{}) {

	var names []string
	for name := range map_list {
		names = append(names, name)
	}
	sort.Strings(names)
	for _, name := range names {
		//fmt.Printf("%s\t%v\n", name, map_list[name])

		if x, ok := map_list[name].([]byte); ok && len(x) > 0 {
			fmt.Println(name, `==>map_sort OK==>`, string(x))
		}
	}

}

 

posted @ 2022-04-24 15:15  wsh3166Sir  阅读(350)  评论(1编辑  收藏  举报