golang 连接oracle(纯golang的方式)

git地址:

GitHub - sijms/go-ora: Pure go oracle clientPure go oracle client. Contribute to sijms/go-ora development by creating an a***ount on GitHub.https://github.***/sijms/go-ora

优点

无效安装 mingw,也不用 oracle的客户端,使用非常方便

简单操作示例

1. 安装 go-ora。

 go get github.***/sijms/go-ora/v2 

2. 连接数据库示例代码

package main

import (
	"database/sql"
	"errors"
	"fmt"
	_ "github.***/sijms/go-ora/v2"
	"log"
	"os"
	"time"
)

func main() {
	err := InitConn(
		"user",      //数据库用户名
		"pwd",       //数据库用户密码
		"localhost", //数据库的电脑ip
		1521,        //oracle端口
		"orcl",      //oracle实例名
	)
	if err != nil {
		log.Fatal(err)
	}
	

}

var db *sql.DB

func InitConn(user, pwd, server string, port int, database string) (err error) {
	err = os.Setenv("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8")
	if err != nil {
		return errors.New(fmt.Sprintf("数据库连接失败 : %v", err.Error()))
	}
	connStr := go_ora.BuildUrl(server, port, database, user, pwd, nil)
	db, err = sql.Open("oracle", connStr)
	if err != nil {
		return errors.New(fmt.Sprintf("数据库连接失败 : %v", err.Error()))
	}
	err = db.Ping()
	if err != nil {
		return errors.New(fmt.Sprintf("数据库连接失败 : %v", err.Error()))
	}
	return err
}

3. 新增表

func createTable() error {
	var err error
	_, err = db.Exec(`CREATE OR REPLACE function ora_test2_func(b_id IN NUMBER) return varchar2 AS BEGIN 'ora_test2_pro' || p_id; END;`)
	if err != nil {
		return err
	}
	_, err = db.Exec(`CREATE OR REPLACE PROCEDURE ora_test2_pro(b_id IN NUMBER, r_msg OUT VARCHAR2) AS BEGIN 'ora_test2_func-' || b_id;  return; END;`)
	if err != nil {
		return err
	}

	_, err = db.Exec(`create sequence seq_ora_test2 minvalue 1 maxvalue 9999999999999999999999999999 start with 1 increment by 1 cache 5`)
	if err != nil {
		return err
	}
	_, err = db.Exec(`create table ora_test2(id number(10) primary key,name varchar2(80) not null,remark varchar2(80) )`)
	if err != nil {
		return err
	}

	return nil
}

4、插入数据,并获取id。

func insertData() error {
	var id int
	for i := 0; i < 10; i++ {
		//插入数据,可以直接返回id
		_, err := db.Exec(`insert into ora_test2(id,name,remark ) values (seq_ora_test2.nextval,&1,&2) RETURNING ID INTO  :id`,
			fmt.Sprintf("名称%d", i), fmt.Sprintf("备注%d", i), sql.Out{Dest: &id})
		if err != nil {
			fmt.Println("新增失败", err)
			return err
		}
		//查询结果
		var name, remark string
		rs, err := db.Query("select name,remark from ora_test2 where id = :id ", sql.Named("id", id))
		if err != nil {
			fmt.Println("新增失败", err)
			return err
		}
		if rs.Next() {
			_ = rs.Scan(&name, &remark)
		}
		_ = rs.Close()
		//打印
		fmt.Println("新增成功 id为:", id, name, remark)
	}
	return nil
}

5、批量插入 

func batchInsertData() error {
	//开启事务
	tx, err := db.Begin()
	if err != nil {
		return err
	}
	//定义执行的sql
	stmt, err := tx.Prepare(`insert into ora_test2(id,name,remark ) values (&1,&2,&3) `) //批发插入 RETURNING ID 有点问题 最好别用
	defer func() { _ = stmt.Close() }()
	var id int
	for i := 0; i < 1000; i++ {
		//查询id
		rr, err := tx.Query("select seq_ora_test2.nextval from dual ")
		if err != nil {
			fmt.Println("新增失败,事务回滚", err)
			_ = tx.Rollback()
			return err
		}
		if rr.Next() {
			_ = rr.Scan(&id)
		}
		_ = rr.Close()
		//插入参数,执行新增
		_, err = stmt.Exec(id, fmt.Sprintf("batch插入标题%d", i), fmt.Sprintf("batch插入备注%d", i)) //, sql.Out{Dest: &id}
		if err != nil {
			fmt.Println("新增失败,事务回滚", err)
			_ = tx.Rollback() //回滚事务
			return err
		}
		//查询返回结果
		var name, remark string
		rs, err := tx.Query("select name,remark from ora_test2 where id = :id ", sql.Named("id", id))
		if err != nil {
			fmt.Println("新增失败,事务回滚", err)
			_ = tx.Rollback() //回滚事务
			return err
		}
		if rs.Next() {
			_ = rs.Scan(&name, &remark)
		}
		_ = rs.Close()
		//打印
		fmt.Println("新增成功 id为:", id, name, remark)

	}
	return tx.***mit() //提交事务
}

6. 查询sql

func queryData() error {
	//按顺序 匹配参数查询
	rs1, err := db.Query("select name,remark from ora_test2  where name = &1", "名称1")
	if err != nil {
		return err
	}
	defer func() { _ = rs1.Close() }()
	//打印结果
	for rs1.Next() {
		var name, remark string
		_ = rs1.Scan(&name, &remark)
		fmt.Println("查询结果:", name, remark)
	}
	//按名称 匹配参数查询
	rs2, err := db.Query("select name,remark from ora_test2  where name = :name", sql.Named("name", "名称1"))
	if err != nil {
		return err
	}
	defer func() { _ = rs2.Close() }()
	//打印结果
	for rs2.Next() {
		var name, remark string
		_ = rs2.Scan(&name, &remark)
		fmt.Println("查询结果:", name, remark)
	}
	return nil
}

7.调用存储过程

func callStoredProcedure() error {
	var (
		id  int
		msg string = strings.Repeat(" ", 2000) //先赋值内容
	)
	//执行存储过程,
	_, err := db.Exec(`BEGIN ora_test2_pro(:1, :2 ); END;`,
		id,
		sql.Out{Dest: &msg},
	)
	if err != nil {
		return err
	}
	//输出结果
	fmt.Println(msg)
	return nil
}

8.调用函数

func callFunction() error {
	var (
		id  int
		msg string = strings.Repeat(" ", 2000) //先赋值内容
	)
	//执行存储过程,
	_, err := db.Exec(`BEGIN :1 := ora_test2_func(:2 ); END;`,
		sql.Out{Dest: &msg},
		id,
	)
	if err != nil {
		return err
	}
	//输出结果
	fmt.Println(msg)
	return nil
}

9. 执行sql

func updateSql() error {
	//更新sql
	_, err := db.Exec(`update ora_test2 t set t.remark=:1 where t.name = :2`,
		"更新后的备注", "名称1",
	)
	if err != nil {
		return err
	}
	//删除
	_, err = db.Exec(`delete from ora_test2 t where t.name = :1`,
		"名称3",
	)
	if err != nil {
		return err
	}
	return nil
}

实操视频

golang 连接oracle(go-ora)

 

转载请说明出处内容投诉
CSS教程_站长资源网 » golang 连接oracle(纯golang的方式)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买