Golang中使用ORACLE数据库实现INSERT查询返回值的方法

Golang中使用ORACLE数据库实现INSERT查询返回值的方法 在Golang中使用Oracle数据库通过INSERT查询返回值

如何在EXE语句中传递绑定参数值?

例如 -

actualvalue =  append(actualvalue, 1)
actualvalue =  append(actualvalue, 2)
actualvalue =  append(actualvalue, 3)

query = "insert into table (a,b,c) values (:a,:b,:c) returning primarykey, secondarykey into :primarykey,:secondarykey"
stmtIns, err := dbConnImbl.Prep(query)
if err != nil  {
fmt.Println("Second Method Error 22====>> ",err)
}
var id uint64
var id2 uint64
rowsAffected, err := stmtIns.Exe(actualvalue..., &id,&id2)//.Scan(&id,&id2)
if err != nil {
fmt.Println("Error Cluses " , err)
}

高亮显示的那一行无法正常工作

请有人帮忙指导如何在"stmtIns.Exe"中传递动态值


更多关于Golang中使用ORACLE数据库实现INSERT查询返回值的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

你好。这是在使用 Go 语言的 sql 包吗?那么函数应该是 Exec https://golang.org/pkg/database/sql/#DB.Exec

更多关于Golang中使用ORACLE数据库实现INSERT查询返回值的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你只能在函数/方法调用中使用省略号将切片作为可变参数传递,且该参数必须是最后一个参数,同时需要将你显式给出的两个值也一并追加进去。

acutalvalue 是从哪里来的?
你想通过使用省略号(...)表达什么?
你是否遇到任何编译或运行时错误?

能否也请你使用 Markdown 格式化你的代码?(速查表

特别是用代码块包裹的代码更易于阅读:

// your code here

当INSERT操作需要返回子句时,我们无法使用 database/sql 包。

必须添加 orav4 包来实现该功能。

我遇到的问题在于:

EXE命令不支持我想作为绑定参数传递的可变函数值。

如果数据库中有100个字段,而我只需要插入部分随机字段,该如何处理…

// 代码示例保留原样
actualvalue = append(actualvalue, 1)
actualvalue = append(actualvalue, 2)
actualvalue = append(actualvalue, 3)

query = "insert into table (a,b,c) values (:a,:b,:c) returning primarykey, secondarykey into :primarykey,:secondarykey"
stmtIns, err := dbConnImbl.Prep(query)
if err != nil {
fmt.Println("Second Method Error 22====>> ",err)
}
var id uint64
var id2 uint64
**rowsAffected, err := stmtIns.Exe(actualvalue…, &id,&id2)//.Scan(&id,&id2)**
if err != nil {
fmt.Println("Error Cluses " , err)
}

当INSERT操作需要返回子句时,我们不能使用database/sql包。

我们必须添加orav4包来实现这个功能。

我的问题是:

EXE命令不支持我想要作为绑定参数值发送的可变函数值。

如果数据库中有100列,而我只需要插入一些随机列,那么我应该如何处理…

在Golang中使用Oracle数据库的RETURNING子句获取INSERT操作的返回值时,需要正确使用绑定参数。以下是修正后的代码示例:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/godror/godror" // 使用godror驱动
)

func main() {
    // 建立数据库连接
    db, err := sql.Open("godror", "user/pass@host:port/service")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 准备INSERT语句,使用RETURNING子句
    query := "INSERT INTO table (a, b, c) VALUES (:1, :2, :3) RETURNING primarykey, secondarykey INTO :4, :5"
    stmt, err := db.Prepare(query)
    if err != nil {
        fmt.Println("Prepare error:", err)
        return
    }
    defer stmt.Close()

    // 定义输入参数和输出参数
    var (
        a = 1
        b = 2
        c = 3
        primaryKey uint64
        secondaryKey uint64
    )

    // 执行INSERT并获取返回值
    _, err = stmt.Exec(a, b, c, sql.Out{Dest: &primaryKey}, sql.Out{Dest: &secondaryKey})
    if err != nil {
        fmt.Println("Execute error:", err)
        return
    }

    fmt.Printf("Inserted record - PrimaryKey: %d, SecondaryKey: %d\n", primaryKey, secondaryKey)
}

对于动态参数值的情况:

// 使用切片存储动态值
actualValue := []interface{}{1, 2, 3}
var primaryKey uint64
var secondaryKey uint64

// 构建参数切片,包含输入值和输出参数
params := make([]interface{}, 0)
params = append(params, actualValue...)
params = append(params, sql.Out{Dest: &primaryKey})
params = append(params, sql.Out{Dest: &secondaryKey})

// 执行查询
_, err = stmt.Exec(params...)
if err != nil {
    fmt.Println("Execute error:", err)
    return
}

关键点:

  1. 使用sql.Out类型包装输出参数
  2. 在SQL语句中使用位置参数:1, :2, :3而不是命名参数
  3. 将输出参数作为额外的参数传递给Exec方法
  4. 确保Oracle驱动正确配置(推荐使用godror驱动)

使用godror驱动时的完整示例:

import (
    "database/sql"
    "fmt"
    _ "github.com/godror/godror"
)

func insertWithReturn(db *sql.DB) error {
    query := `INSERT INTO your_table (col1, col2, col3) 
              VALUES (:1, :2, :3) 
              RETURNING id, seq INTO :4, :5`
    
    stmt, err := db.Prepare(query)
    if err != nil {
        return err
    }
    defer stmt.Close()

    var id, seq int
    _, err = stmt.Exec(100, "value1", "value2", 
                      sql.Out{Dest: &id}, 
                      sql.Out{Dest: &seq})
    if err != nil {
        return err
    }

    fmt.Printf("Inserted - ID: %d, Seq: %d\n", id, seq)
    return nil
}

这样就能正确获取INSERT操作返回的主键和其他字段值。

回到顶部