Golang Goracle.v2 - 如何查询带有游标的存储过程?
Golang Goracle.v2 - 如何查询带有游标的存储过程? 大家好。 除了API文档外,我没有找到任何教程:
包 goracle 是 Oracle 数据库的 database/sql/driver 驱动包。
如果有人能在这方面给我一些帮助,我将不胜感激, 或者针对这个具体问题提供指导。
我有一个可以正常工作的 PHP 代码:
$sqlStr = oci_parse($conn , 'BEGIN DB_API.GetSitesInfo(:P_USERID , :P_SITEID , :p_cv_DeviceDetails) ; END;') ;
oci_bind_by_name($sqlStr , ':P_USERID' , $USERID );
oci_bind_by_name($sqlStr , ':P_SITEID' , $SITEID );
// 相关行:
$OUTPUT_CUR = oci_new_cursor($conn);
oci_bind_by_name($sqlStr , ':p_cv_DeviceDetails' , $OUTPUT_CUR , -1, OCI_B_CURSOR );
oci_execute($sqlStr) ;
oci_execute($OUTPUT_CUR) ;
在 Golang 中我该怎么做? 我尝试了几种对"res"的赋值方法,但都没有成功。
res := db.NewCursor() // 没有这样的东西。也尝试了 res = interface{} 和 res := ""
cur , err := db.Query("BEGIN DB_API.GetSitesInfo(:P_USERID , :P_SITEID , :p_cv_DeviceDetails) ; END;", 1, 2, &res)
提前非常感谢
更多关于Golang Goracle.v2 - 如何查询带有游标的存储过程?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
我也有同样的问题。如何调用打包的存储过程和函数……以及当返回类型或参数类型为 SYS_REFCURSOR 时该如何处理。
更多关于Golang Goracle.v2 - 如何查询带有游标的存储过程?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中使用goracle.v2包调用带有游标参数的Oracle存储过程,需要使用goracle.Cursor类型来处理游标参数。以下是完整的示例代码:
package main
import (
"database/sql"
"fmt"
"log"
goracle "gopkg.in/goracle.v2"
)
func main() {
// 建立数据库连接
db, err := sql.Open("goracle", "user/password@host:port/service")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 准备调用存储过程的SQL
query := "BEGIN DB_API.GetSitesInfo(:P_USERID, :P_SITEID, :p_cv_DeviceDetails); END;"
// 创建游标变量
var cursor goracle.Cursor
// 执行存储过程,绑定游标参数
_, err = db.Exec(query, 1, 2, goracle.Out{Dest: &cursor})
if err != nil {
log.Fatal("执行存储过程失败:", err)
}
// 从游标中读取数据
rows, err := cursor.Query()
if err != nil {
log.Fatal("从游标查询失败:", err)
}
defer rows.Close()
// 处理结果集
columns, err := rows.Columns()
if err != nil {
log.Fatal("获取列信息失败:", err)
}
fmt.Println("列名:", columns)
// 读取数据行
for rows.Next() {
// 根据实际表结构定义变量
var (
col1 string
col2 int
// 添加更多列...
)
err := rows.Scan(&col1, &col2)
if err != nil {
log.Fatal("扫描行数据失败:", err)
}
fmt.Printf("数据: %s, %d\n", col1, col2)
}
if err = rows.Err(); err != nil {
log.Fatal("遍历行时出错:", err)
}
}
如果需要处理动态列的情况,可以使用以下方法:
// 动态处理结果集
for rows.Next() {
// 获取列类型信息
columnTypes, err := rows.ColumnTypes()
if err != nil {
log.Fatal(err)
}
// 创建值的切片
values := make([]interface{}, len(columnTypes))
for i := range values {
values[i] = new(interface{})
}
err = rows.Scan(values...)
if err != nil {
log.Fatal(err)
}
// 打印每行的值
for i, val := range values {
fmt.Printf("列%d: %v ", i+1, *(val.(*interface{})))
}
fmt.Println()
}
关键点:
- 使用
goracle.Cursor类型处理游标参数 - 使用
goracle.Out{Dest: &cursor}将游标作为输出参数绑定 - 执行存储过程后,通过
cursor.Query()获取结果集 - 使用标准的
database/sql接口处理结果行
确保导入正确的包:goracle "gopkg.in/goracle.v2"

