当前位置: 首页 > news >正文

golang 连接 oracle 数据库 增删改查

 1,golang 连接 oracle 数据库

 2,增删改查

/** @Author: lmy* @Date: 2023-08-24 15:19:22* @LastEditors: lmy* @LastEditTime: 2023-08-24 16:23:58* @FilePath: \golangOracleDemo\main.go* @Description:  golang oracle 增删改查 DEMO*/package mainimport ("database/sql""fmt""strings""time"go_ora "github.com/sijms/go-ora/v2"
)var oracleDB *sql.DB //oracleDB  oracle数据库func main() {var err error// 演示的数据库表DDL//   CREATE TABLE "SYSTEM"."TABLE1"//    (	"ID" NUMBER(*,0) GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE,// 	"NAME" VARCHAR2(20 BYTE),// 	"AGE" NUMBER(*,0),// 	"PHONE" VARCHAR2(11 BYTE),// 	"BIRTHDAY" DATE//    ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255//  NOCOMPRESS LOGGING//   STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645//   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1//   BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)//   TABLESPACE "SYSTEM" ;// 传入数据库连接字符串// username/password@host:port/service_name//system:123456@192.168.168.152:1521/orcl.docker.internal//system:123456@192.168.168.152:1521/?SID=orclport := 1521                          // 端口server := "192.168.168.152"           // HostserviceName := "orcl.docker.internal" // 连接名|服务名username := "system"                  // 用户名password := "123456"                  // 密码sid := "orcl"                         // SIDconnStr := ""//连接数据库的方式//方法1:简单连接connStr = go_ora.BuildUrl(server, port, serviceName, username, password, nil)fmt.Println("数据库链接1=>", connStr)//方法2:使用SID连接urlOptions := map[string]string{"SID": sid,}connStr = go_ora.BuildUrl(server, port, "", username, password, urlOptions)fmt.Println("数据库链接2=>", connStr)oracleDB, err = CreateOracleSQLConnV2(connStr)if err != nil {fmt.Printf("连接数据库失败:%v \n", err)return}// 设置数据库链接 |  要数据库连链接创建成功 才能走下面的流程//增var info TableInfoinfo.Name = "小明"info.Age = 11info.Birthday, _ = time.Parse("2006-01-02", "2012-08-08")if isOK, _ := addTableInfo(info); isOK {fmt.Println("新增数据成功", info)} else {fmt.Println("新增数据失败", info)}//增info.Name = "大明"info.Age = 19var timeZero time.Timeinfo.Birthday = timeZero//info.Birthday, _ = time.Parse("2006-01-02", "2004-09-08")isOK, err := addTableInfo(info)if err != nil {fmt.Println("新增数据异常", info, err)} else {if isOK {fmt.Println("新增数据成功", info)} else {fmt.Println("新增数据失败", info)}}//根据名称和年龄搜查询单条数据info, err = sqlGetOneTableDataInfo("明", 18)if err != nil {fmt.Printf("根据ID查询单条数据失败:%v \n", err)return}fmt.Println("根据名称和年龄搜查询单条数据", info)//查询所有数据datas, err := sqlGetAllTableDataInfo()if err != nil {fmt.Printf("查询所有数据失败:%v \n", err)return}fmt.Println("查询所有数据=>", datas)info.Name = "老明"info.Age = 20info.Birthday, _ = time.Parse("2006-01-02", "2003-05-06")//改if isOK := editTableInfo(info); isOK {fmt.Println("编辑数据成功", info)} else {fmt.Println("编辑数据失败", info)}//查询所有数据datas, err = sqlGetAllTableDataInfo()if err != nil {fmt.Printf("查询所有数据失败:%v", err)return}fmt.Println("查询所有数据=>", datas)fmt.Println("删除数据=>", info.ID)// 删除deleteTableInfoByID(info.ID)fmt.Println()//查询所有数据datas, err = sqlGetAllTableDataInfo()if err != nil {fmt.Printf("查询所有数据失败:%v", err)return}fmt.Println("查询所有数据=>", datas)//删除所有数据deleteTableInfo()fmt.Println("删除表所有数据")//查询所有数据datas, err = sqlGetAllTableDataInfo()if err != nil {fmt.Printf("查询所有数据失败:%v", err)return}fmt.Println("查询所有数据=>", datas)
}// 添加表数据
func addTableInfo(info TableInfo) (bool, error) {affect, err := ExecSQL(oracleDB, "INSERT INTO TABLE1( NAME,AGE,BIRTHDAY) VALUES(:name, :age,:brithday)", info.Name, info.Age, info.Birthday)if err != nil {fmt.Printf("添加数据失败:%v", err)return false, err}return affect > 0, nil
}// 编辑表数据
func editTableInfo(info TableInfo) bool {affect, err := ExecSQL(oracleDB, "UPDATE TABLE1 SET NAME=:name,AGE=:age,BIRTHDAY=:brithday WHERE ID=:ID", info.Name, info.Age, info.Birthday, info.ID)if err != nil {fmt.Printf("修改数据失败:%v", err)return false}return affect > 0
}// 根据ID删除表数据
func deleteTableInfoByID(id int) bool {affect, err := ExecSQL(oracleDB, "DELETE TABLE1 where ID = :id", id)if err != nil {fmt.Printf("根据ID删除数据失败:id:%v,%v", id, err)return false}return affect > 0
}// 删除表所有数据
func deleteTableInfo() bool {affect, err := ExecSQL(oracleDB, "DELETE TABLE1 ")if err != nil {fmt.Printf("删除所有数据失败:%v", err)return false}return affect > 0
}// 表数据结构体
type TableInfo struct {ID       int       //id,--IDName     string    //NAME,--名称Age      int       //AGE,--年纪Birthday time.Time //BIRTHDAY,--生日
}// 根据ID查询单条数据
func sqlGetOneTableDataInfo(name string, age int) (TableInfo, error) {//根据id查询名称var info TableInfosqlStr := `select  ID, nvl(NAME,' ')  NAME, nvl(AGE,0) AGE, nvl(BIRTHDAY,'') BIRTHDAY  from TABLE1 where  NAME LIKE :name  AND AGE >= :p2 `err := oracleDB.QueryRow(sqlStr, "%"+name+"%", age).Scan(&info.ID, &info.Name, &info.Age, &info.Birthday)if err != nil {if err == sql.ErrNoRows { // 属于空查找fmt.Printf("查询 数据失败--没有符合条件的数据: \n ")}fmt.Printf("查询 数据失败: \nid=%v \nerr=%s", info.ID, err)return info, err}return info, err
}// 查询所有数据
func sqlGetAllTableDataInfo() ([]TableInfo, error) {var data []TableInforows, err := oracleDB.Query("SELECT ID, NAME,AGE,BIRTHDAY FROM TABLE1")if err != nil {fmt.Printf("查询数据失败:%v \n", err)return data, err}defer rows.Close()var info TableInfofor rows.Next() { // 游标读取info = TableInfo{}err = rows.Scan(&info.ID, &info.Name, &info.Age, &info.Birthday)if err != nil {fmt.Printf("查询数据失败:%v \n", err)} else {data = append(data, info)}}return data, nil
}/*
ExecSQL 通用语句参数:1. *sql.DB2. SQL语句  例子:UPDATE WX_USER_INFO SET wui_status = 20 WHERE wui_openid = :openid例子:INSERT INTO dbo.ALL_WEIXIN_MSG_LOG (awml_wxid,awml_send_openid,awml_msg_from,awml_msg_body,awml_addtime) VALUES(:wxid,:openid,:msgform,:msgbody,GETDATE())3. SQL语句参数参数  os7Cm1EygxiRF3Tox6FM1z11HiMc ,.........返回受影响行数affect和错误提示消息err
*/
func ExecSQL(sqlBasis *sql.DB, sqlStr string, args ...interface{}) (int64, error) {affect := int64(-1)var result sql.Resultvar err errorresult, err = sqlBasis.Exec(sqlStr, args...)if err == nil {affect, _ = result.RowsAffected()}if affect == -1 { //执行失败err = fmt.Errorf("execSQLStr Err:%s\nsql:%s\ndata:%s", err, sqlStr, fmt.Sprintln(args...))}return affect, err
}/*
CreateOracleSQLConnV2 用于创建数据库链接
*/
func CreateOracleSQLConnV2(dbconfigdatastr string) (*sql.DB, error) {// 建立 Oraclesqldbdata, err := sql.Open("oracle", dbconfigdatastr)if err != nil {fmt.Printf("sql application pool:%s\n", err)return nil, err}// 测试创建链接是否成功err = sqldbdata.Ping()dbName := strings.Split(dbconfigdatastr, "/")[2]if err != nil {fmt.Printf("%s DB Ping err : %s\n", dbName, err)defer sqldbdata.Close()} else {fmt.Printf("The Sql link is successful - %s. \n", dbName)}return sqldbdata, err
}

相关文章:

golang 连接 oracle 数据库 增删改查

1,golang 连接 oracle 数据库 2,增删改查 /** Author: lmy* Date: 2023-08-24 15:19:22* LastEditors: lmy* LastEditTime: 2023-08-24 16:23:58* FilePath: \golangOracleDemo\main.go* Description: golang oracle 增删改查 DEMO*/package mainimpor…...

Unity——音频管理器(附例子)

在实际游戏开发中,音效既是一个相对独立的部分,又与其他游戏逻辑密切关联。也就是说,与音效相关的代码会插入很多细节代码中。 而且在音效非常丰富的情况下,如果每一个游戏模块都单独播放音效,那么可能会带来一些问题…...

TCP协议基础

一: TCP协议是什么? TCP协议是基于面向连接,可靠传输,基于字节流的传输层通信协议 1. 面向连接 TCP协议是一种面向连接的协议,意味着在双方在建立数据传输之前,需要进行一个逻辑上的连接,且是…...

C# NetTopologySuite+ProjNet 任意图形类型坐标转换

添加引用:NetTopologySuite、ProjNet、ProjNet.SRID Program.cs文件: using ProjNet.CoordinateSystems; using ProjNet.CoordinateSystems.Transformations; using ProjNet.SRID; using System; using System.Collections.Generic; using System.Linq;…...

Windows笔记本电脑开机黑屏

Windows笔记本电脑开机黑屏 最近,我遇到了一件奇怪的事情。我的Windows笔记本电脑在开机时出现了一个黑屏,没有任何反应。我尝试了多种方法,包括重启和恢复出厂设置,但都无济于事。 我开始感到担心,因为这只会影响到…...

Samb共享用户的设置和修改Linux用户的id号,修改Linux组的id号,加入组,删除组成员等

零、samba帐号的设置 为samba共享添加用户,并设定仅能由授权用户进入的共享 #增加没有家目录,也无法登录系统的空用户 useradd -M userA -s /sbin/nologin #-M 选项是--no-create-home的简写形式,即不为该用户配置家目录;-s选项&…...

VBA:对Excel单元格进行合并操作

Sub hb()Dim nn 3For i 3 To 18If Range("b" & i) <> Range("b" & i 1) ThenRange("b" & n & ":b" & i).Mergen i 1End IfNextEnd Sub...

HTML5离线储存

简介 离线存储指的是&#xff1a;在用户没有与因特网连接时&#xff0c;可以正常访问站点或应用&#xff0c;在用户与因特网连接时&#xff0c;更新用户机器上的缓存文件。 原理&#xff1a;HTML5的离线存储是基于一个新建的 .appcache 文件的缓存机制(不是存储技术)&#xf…...

cmd: Union[List[str], str], ^ SyntaxError: invalid syntax

跑项目在调用from easyprocess import EasyProcess 遇到报错&#xff1a; cmd: Union[List[str], str], ^ SyntaxError: invalid syntax猜测是EasyProcess版本与python版本不对应 pip show EasyProcess查证一下&#xff1a; WARNING: pip is being invoked by an old…...

2023高教社杯数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…...

FFDNet-pytorch版本代码测试教程

一、FFDNet-pytorch版本代码下载 &#xff08;1&#xff09;FFDNet-pytorch下载 https://download.csdn.net/download/qq_41104871/88233742 二、FFDNet-pytorch版本代码运行环境配置 &#xff08;1&#xff09;FFDNet-pytorch版本代码运行环境配置 https://blog.csdn.net/q…...

uni-app项目由hbuilder项目转化为cli项目

1.背景 原uni-app项目是通过hbuilder创建的&#xff0c;运行以及打包都要依赖于hbuilder运行&#xff1b;一般在vscode开发&#xff0c;在hbuilder运行比较怪异&#xff1b;后续希望脱离hbuilder运行并能通过构建平台进行打包&#xff0c;因此将hbuilder项目转化为cli项目 2.…...

使用SpaceDesk连接平板作为电脑副屏详细步骤教程

文章目录 下载安装PC端安装安卓端安装 配置步骤PC端安卓端 连接 SpaceDesk官网链接https://www.spacedesk.net/ (应该是需要科学上网才能进入) SpaceDesk它可以连接安卓,苹果的平板,手机等&#xff0c;也可以连接其他可以打开网页&#xff08;HTML5&#xff09;的设备。 这里我…...

云备份——第三方库使用介绍(下)

httplib库&#xff0c;一个C11单文件头的跨平台HTTP/HTTPS库。安装起来非常容易。只需包含httplib.h在你的代码中即可。 httplib库实际上是用于搭建一个简单的http服务器或者客户端的库&#xff0c;这种第三方网络库&#xff0c;可以让我们免去搭建服务器或客户端的时间&#x…...

springboot实战(一)之项目搭建

环境准备 ideajdk1.8springboot版本 2.7.15 项目开始 1.打开idea&#xff0c;点击new project 2.选择spring initillizr 核对&#xff1a;Server Url是否是&#xff1a;start.spring.io&#xff0c;然后根据自己依次设置项目名称、存储位置和包名&#xff0c;如下&#xff…...

线性代数的学习和整理16:什么是各种空间(类型),向量空间,距离(类型)?

目录 1 空间相关的群&#xff0c;环&#xff0c;域&#xff0c;集合&#xff0c;空间的预备知识 1.1&#xff1a;群&#xff0c;环&#xff0c;域&#xff0c;集合&#xff0c;空间的定义&#xff08;表示不懂&#xff0c;只是做个标记&#xff09; 2 空间 2.1 各种空间概念…...

css实现文字翻转效果

csss实现文字翻转效果 主要实现核心属性 direction: rtl; unicode-bidi: bidi-override; direction: rtl; 这个属性用于指定文本的方向为从右到左&#xff08;Right-to-Left&#xff09;。它常用于处理阿拉伯语、希伯来语等从右向左书写的文字样式。当设置了 direction: rtl; …...

19 Linux之Python定制篇-apt软件管理和远程登录

19 Linux之Python定制篇-apt软件管理和远程登录 文章目录 19 Linux之Python定制篇-apt软件管理和远程登录19.1 apt软件管理19.1.1 apt介绍19.1.2 更新软件下载地址-阿里源19.1.3 使用apt完成安装和卸载vim 19.2 远程登录Ubuntu 学习视频来自于B站【小白入门 通俗易懂】2021韩顺…...

WebDAV之π-Disk派盘 + notototo

notototo是一款功能丰富的笔记软件,提供了多种功能,包括载入PDF文件并进行批注和标记的能力。您可以使用Apple Pencil或手指在PDF文件上进行写作和绘图操作。 同时,notototo也提供了与团队合作的功能,您可以连接到服务器并与他人协作。此外,您还可以在notototo中进行绘图,…...

_kbhit() and getch() 在小游戏中用不了。因为控制台函数,仅在控制台程序中可用

太长不看版&#xff1a; _kbhit() and getch() 包含在conio.h中。 conio是Console Input/Output&#xff08;控制台输入输出&#xff09;的简写&#xff0c;其中定义了通过控制台进行数据输入和数据输出的函数&#xff0c;主要是一些用户通过按键盘产生的对应操作&#xff0c…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...