• golang 连接 oracle 数据库 增删改查


     1,golang 连接 oracle 数据库

     2,增删改查

    1. /*
    2. * @Author: lmy
    3. * @Date: 2023-08-24 15:19:22
    4. * @LastEditors: lmy
    5. * @LastEditTime: 2023-08-24 16:23:58
    6. * @FilePath: \golangOracleDemo\main.go
    7. * @Description: golang oracle 增删改查 DEMO
    8. */
    9. package main
    10. import (
    11. "database/sql"
    12. "fmt"
    13. "strings"
    14. "time"
    15. go_ora "github.com/sijms/go-ora/v2"
    16. )
    17. var oracleDB *sql.DB //oracleDB oracle数据库
    18. func main() {
    19. var err error
    20. // 演示的数据库表DDL
    21. // CREATE TABLE "SYSTEM"."TABLE1"
    22. // ( "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,
    23. // "NAME" VARCHAR2(20 BYTE),
    24. // "AGE" NUMBER(*,0),
    25. // "PHONE" VARCHAR2(11 BYTE),
    26. // "BIRTHDAY" DATE
    27. // ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
    28. // NOCOMPRESS LOGGING
    29. // STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
    30. // PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
    31. // BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    32. // TABLESPACE "SYSTEM" ;
    33. // 传入数据库连接字符串
    34. // username/password@host:port/service_name
    35. //system:123456@192.168.168.152:1521/orcl.docker.internal
    36. //system:123456@192.168.168.152:1521/?SID=orcl
    37. port := 1521 // 端口
    38. server := "192.168.168.152" // Host
    39. serviceName := "orcl.docker.internal" // 连接名|服务名
    40. username := "system" // 用户名
    41. password := "123456" // 密码
    42. sid := "orcl" // SID
    43. connStr := ""
    44. //连接数据库的方式
    45. //方法1:简单连接
    46. connStr = go_ora.BuildUrl(server, port, serviceName, username, password, nil)
    47. fmt.Println("数据库链接1=>", connStr)
    48. //方法2:使用SID连接
    49. urlOptions := map[string]string{
    50. "SID": sid,
    51. }
    52. connStr = go_ora.BuildUrl(server, port, "", username, password, urlOptions)
    53. fmt.Println("数据库链接2=>", connStr)
    54. oracleDB, err = CreateOracleSQLConnV2(connStr)
    55. if err != nil {
    56. fmt.Printf("连接数据库失败:%v \n", err)
    57. return
    58. }
    59. // 设置数据库链接 | 要数据库连链接创建成功 才能走下面的流程
    60. //增
    61. var info TableInfo
    62. info.Name = "小明"
    63. info.Age = 11
    64. info.Birthday, _ = time.Parse("2006-01-02", "2012-08-08")
    65. if isOK, _ := addTableInfo(info); isOK {
    66. fmt.Println("新增数据成功", info)
    67. } else {
    68. fmt.Println("新增数据失败", info)
    69. }
    70. //增
    71. info.Name = "大明"
    72. info.Age = 19
    73. var timeZero time.Time
    74. info.Birthday = timeZero
    75. //info.Birthday, _ = time.Parse("2006-01-02", "2004-09-08")
    76. isOK, err := addTableInfo(info)
    77. if err != nil {
    78. fmt.Println("新增数据异常", info, err)
    79. } else {
    80. if isOK {
    81. fmt.Println("新增数据成功", info)
    82. } else {
    83. fmt.Println("新增数据失败", info)
    84. }
    85. }
    86. //根据名称和年龄搜查询单条数据
    87. info, err = sqlGetOneTableDataInfo("明", 18)
    88. if err != nil {
    89. fmt.Printf("根据ID查询单条数据失败:%v \n", err)
    90. return
    91. }
    92. fmt.Println("根据名称和年龄搜查询单条数据", info)
    93. //查询所有数据
    94. datas, err := sqlGetAllTableDataInfo()
    95. if err != nil {
    96. fmt.Printf("查询所有数据失败:%v \n", err)
    97. return
    98. }
    99. fmt.Println("查询所有数据=>", datas)
    100. info.Name = "老明"
    101. info.Age = 20
    102. info.Birthday, _ = time.Parse("2006-01-02", "2003-05-06")
    103. //改
    104. if isOK := editTableInfo(info); isOK {
    105. fmt.Println("编辑数据成功", info)
    106. } else {
    107. fmt.Println("编辑数据失败", info)
    108. }
    109. //查询所有数据
    110. datas, err = sqlGetAllTableDataInfo()
    111. if err != nil {
    112. fmt.Printf("查询所有数据失败:%v", err)
    113. return
    114. }
    115. fmt.Println("查询所有数据=>", datas)
    116. fmt.Println("删除数据=>", info.ID)
    117. // 删除
    118. deleteTableInfoByID(info.ID)
    119. fmt.Println()
    120. //查询所有数据
    121. datas, err = sqlGetAllTableDataInfo()
    122. if err != nil {
    123. fmt.Printf("查询所有数据失败:%v", err)
    124. return
    125. }
    126. fmt.Println("查询所有数据=>", datas)
    127. //删除所有数据
    128. deleteTableInfo()
    129. fmt.Println("删除表所有数据")
    130. //查询所有数据
    131. datas, err = sqlGetAllTableDataInfo()
    132. if err != nil {
    133. fmt.Printf("查询所有数据失败:%v", err)
    134. return
    135. }
    136. fmt.Println("查询所有数据=>", datas)
    137. }
    138. // 添加表数据
    139. func addTableInfo(info TableInfo) (bool, error) {
    140. affect, err := ExecSQL(oracleDB, "INSERT INTO TABLE1( NAME,AGE,BIRTHDAY) VALUES(:name, :age,:brithday)", info.Name, info.Age, info.Birthday)
    141. if err != nil {
    142. fmt.Printf("添加数据失败:%v", err)
    143. return false, err
    144. }
    145. return affect > 0, nil
    146. }
    147. // 编辑表数据
    148. func editTableInfo(info TableInfo) bool {
    149. affect, err := ExecSQL(oracleDB, "UPDATE TABLE1 SET NAME=:name,AGE=:age,BIRTHDAY=:brithday WHERE ID=:ID", info.Name, info.Age, info.Birthday, info.ID)
    150. if err != nil {
    151. fmt.Printf("修改数据失败:%v", err)
    152. return false
    153. }
    154. return affect > 0
    155. }
    156. // 根据ID删除表数据
    157. func deleteTableInfoByID(id int) bool {
    158. affect, err := ExecSQL(oracleDB, "DELETE TABLE1 where ID = :id", id)
    159. if err != nil {
    160. fmt.Printf("根据ID删除数据失败:id:%v,%v", id, err)
    161. return false
    162. }
    163. return affect > 0
    164. }
    165. // 删除表所有数据
    166. func deleteTableInfo() bool {
    167. affect, err := ExecSQL(oracleDB, "DELETE TABLE1 ")
    168. if err != nil {
    169. fmt.Printf("删除所有数据失败:%v", err)
    170. return false
    171. }
    172. return affect > 0
    173. }
    174. // 表数据结构体
    175. type TableInfo struct {
    176. ID int //id,--ID
    177. Name string //NAME,--名称
    178. Age int //AGE,--年纪
    179. Birthday time.Time //BIRTHDAY,--生日
    180. }
    181. // 根据ID查询单条数据
    182. func sqlGetOneTableDataInfo(name string, age int) (TableInfo, error) {
    183. //根据id查询名称
    184. var info TableInfo
    185. sqlStr := `select ID, nvl(NAME,' ') NAME, nvl(AGE,0) AGE, nvl(BIRTHDAY,'') BIRTHDAY from TABLE1 where NAME LIKE :name AND AGE >= :p2 `
    186. err := oracleDB.QueryRow(sqlStr, "%"+name+"%", age).Scan(&info.ID, &info.Name, &info.Age, &info.Birthday)
    187. if err != nil {
    188. if err == sql.ErrNoRows { // 属于空查找
    189. fmt.Printf("查询 数据失败--没有符合条件的数据: \n ")
    190. }
    191. fmt.Printf("查询 数据失败: \nid=%v \nerr=%s", info.ID, err)
    192. return info, err
    193. }
    194. return info, err
    195. }
    196. // 查询所有数据
    197. func sqlGetAllTableDataInfo() ([]TableInfo, error) {
    198. var data []TableInfo
    199. rows, err := oracleDB.Query("SELECT ID, NAME,AGE,BIRTHDAY FROM TABLE1")
    200. if err != nil {
    201. fmt.Printf("查询数据失败:%v \n", err)
    202. return data, err
    203. }
    204. defer rows.Close()
    205. var info TableInfo
    206. for rows.Next() { // 游标读取
    207. info = TableInfo{}
    208. err = rows.Scan(&info.ID, &info.Name, &info.Age, &info.Birthday)
    209. if err != nil {
    210. fmt.Printf("查询数据失败:%v \n", err)
    211. } else {
    212. data = append(data, info)
    213. }
    214. }
    215. return data, nil
    216. }
    217. /*
    218. ExecSQL 通用语句
    219. 参数:
    220. 1. *sql.DB
    221. 2. SQL语句 例子:UPDATE WX_USER_INFO SET wui_status = 20 WHERE wui_openid = :openid
    222. 例子: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())
    223. 3. SQL语句参数参数 os7Cm1EygxiRF3Tox6FM1z11HiMc ,.........
    224. 返回受影响行数affect和错误提示消息err
    225. */
    226. func ExecSQL(sqlBasis *sql.DB, sqlStr string, args ...interface{}) (int64, error) {
    227. affect := int64(-1)
    228. var result sql.Result
    229. var err error
    230. result, err = sqlBasis.Exec(sqlStr, args...)
    231. if err == nil {
    232. affect, _ = result.RowsAffected()
    233. }
    234. if affect == -1 { //执行失败
    235. err = fmt.Errorf("execSQLStr Err:%s\nsql:%s\ndata:%s", err, sqlStr, fmt.Sprintln(args...))
    236. }
    237. return affect, err
    238. }
    239. /*
    240. CreateOracleSQLConnV2 用于创建数据库链接
    241. */
    242. func CreateOracleSQLConnV2(dbconfigdatastr string) (*sql.DB, error) {
    243. // 建立 Oracle
    244. sqldbdata, err := sql.Open("oracle", dbconfigdatastr)
    245. if err != nil {
    246. fmt.Printf("sql application pool:%s\n", err)
    247. return nil, err
    248. }
    249. // 测试创建链接是否成功
    250. err = sqldbdata.Ping()
    251. dbName := strings.Split(dbconfigdatastr, "/")[2]
    252. if err != nil {
    253. fmt.Printf("%s DB Ping err : %s\n", dbName, err)
    254. defer sqldbdata.Close()
    255. } else {
    256. fmt.Printf("The Sql link is successful - %s. \n", dbName)
    257. }
    258. return sqldbdata, err
    259. }

  • 相关阅读:
    form表单有大知识
    WPF 用户控件依赖注入赋值
    springboot基于微信小程序的驾校报名小程序+java+uinapp+Mysql+计算机毕业设计
    第九章认识Express模板
    CISAW应急服务:网络安全应急响应之路——从经验到认证的体会
    常见docker命令(二)-容器生命周期相关
    LeakCanary从使用到源码分析
    Android 解析包时出现问题 的解决方案(应用检查更新)
    idea模板设置
    【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏2(附项目源码)
  • 原文地址:https://blog.csdn.net/lmy_loveF/article/details/132596184