【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

相关文章

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作