【REST2SQL】02 GO连接Oracle数据库

2024-01-03 17:12

本文主要是介绍【REST2SQL】02 GO连接Oracle数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Oracle数据库我用的最多,先研究Oracle,Go连接Oracle并实现REST和SQL服务。

1 Oracle数据库的安装

我这里安装使用的是Oracle 11g , 安装过程省略5217字。

2 安装Go-ora依赖

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

安装成功后在GOPATH目录可见:
在这里插入图片描述

3 创建一个Gooracle控制台程序测试

全部代码如下 :

// gooracle project main.go
package mainimport ("database/sql/driver""encoding/json""fmt""io""log""os"go_ora "github.com/sijms/go-ora/v2" // 1 go get github.com/sijms/go-ora/v2
)// Oracle连接字符串
const connStr string = "oracle://blma:5217@127.0.0.1:1521/CQYH"func main() {var (sqls   string //sql语句result string //sql执行后返回的结果)// select查询数据sqls = "select sysdate from dual"result = selectData(sqls)fmt.Println(result)// delete 删除数据sqls = "delete from atop where p_id = -5"result = deleteData(sqls)fmt.Println(result)// update 更新数据sqls = "update atop set f_dm = '005217' where p_id = -5217"result = updateData(sqls)fmt.Println(result)// insert 插入一行数据sqls = "insert into atop (p_id) values (FLOOR(DBMS_RANDOM.value(0, 100)))"result = insertData(sqls)fmt.Println(result)
}// 连接Oracle数据库
func connDB(connStr string) *go_ora.Connection {//创建连接DB, err := go_ora.NewConnection(connStr)dieOnError("Can't open the driver:", err)//打开连接err = DB.Open()dieOnError("Can't open the connection:", err)return DB
}// delete
func deleteData(deleteSql string) string {result, _ := execSQL(deleteSql)rows, err := result.RowsAffected()dieOnError("Can't delete", err)ret := map[string]int{"Delete rowsAffected": int(rows),}jsonBytes, err := json.Marshal(ret)dieOnError("map 转 json失败:", err)return string(jsonBytes)
}// update
func updateData(updateSql string) string {result, _ := execSQL(updateSql)rows, err := result.RowsAffected()dieOnError("Can't update", err)ret := map[string]int{"Update rowsAffected": int(rows),}jsonBytes, err := json.Marshal(ret)dieOnError("map 转 json失败:", err)return string(jsonBytes)
}// insert
func insertData(insertSql string) string {result, _ := execSQL(insertSql)rows, err := result.RowsAffected()dieOnError("Can't insert", err)ret := map[string]int{"Insert rowsAffected": int(rows),}jsonBytes, err := json.Marshal(ret)dieOnError("map 转 json失败:", err)return string(jsonBytes)
}// 执行SQL, execute stmt (INSERT, UPDATE, DELETE, DML, PLSQL) and return driver.Result object
func execSQL(sqls string) (result driver.Result, err error) {//连接数据库DB := connDB(connStr)//延迟关闭连接defer DB.Close()//准备sql语句stmt := go_ora.NewStmt(sqls, DB)//延迟关闭SQLdefer stmt.Close()//执行SQL, execute stmt (INSERT, UPDATE, DELETE, DML, PLSQL) and return driver.Result objectresult, err = stmt.Exec(nil)dieOnError("Can't execSql() ", err)return result, err
}// select查询,结果为json
func selectData(sqls string) string {//连接数据库DB := connDB(connStr)//延迟关闭连接defer DB.Close()//准备sql语句stmt := go_ora.NewStmt(sqls, DB)//延迟关闭SQLdefer stmt.Close()rows, err := stmt.Query(nil)dieOnError("Can't query", err)defer rows.Close()//fmt.Println(rows)columns := rows.Columns()//fmt.Println("columns:", columns)values := make([]driver.Value, len(columns))var dataset []map[string]interface{} //元素为map的切片//Header(columns)for {err = rows.Next(values)if err != nil {break}//fmt.Println("values:", values)row1 := Record(columns, values)dataset = append(dataset, row1)}if err != io.EOF {dieOnError("Can't Next", err)}//切片转jsonjsonBytes, err := json.Marshal(dataset)dieOnError("slice 转 json失败:", err)//fmt.Println(string(jsonBytes))return string(jsonBytes)
}// 发生错误退出1
func dieOnError(msg string, err error) {if err != nil {//fmt.Println(msg, err)log.Fatal(msg, err)os.Exit(1)}
}// func Header(columns []string) {// }// 一行记录加入 map
func Record(columns []string, values []driver.Value) map[string]interface{} {mc := make(map[string]interface{}) //一行记录信息放入 mapfor i, c := range values {//fmt.Printf("\"%s\":%v,", columns[i], c)mc[columns[i]] = c}//fmt.Println(mc)return mc //返回一行记录的信息map
}// func returnErr(err error) error {
// 	if err != nil {
// 		return err
// 	}
// 	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
// }

运行输出结果如下:

[{“SYSDATE”:“2024-01-03T15:46:39+08:00”}]
{“Delete rowsAffected”:0}
{“Update rowsAffected”:1}
{“Insert rowsAffected”:1}

这篇关于【REST2SQL】02 GO连接Oracle数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566451

相关文章

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的