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
你只能在函数/方法调用中使用省略号将切片作为可变参数传递,且该参数必须是最后一个参数,同时需要将你显式给出的两个值也一并追加进去。
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
}
关键点:
- 使用
sql.Out类型包装输出参数 - 在SQL语句中使用位置参数
:1, :2, :3而不是命名参数 - 将输出参数作为额外的参数传递给
Exec方法 - 确保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操作返回的主键和其他字段值。


