go链接Oracle

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

2、go代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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))
            }
 
        }
    }
 
}

 

工具函数:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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 @   wsh3166Sir  阅读(358)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示