Golang Goracle.v2 - 如何查询带有游标的存储过程?

Golang Goracle.v2 - 如何查询带有游标的存储过程? 大家好。 除了API文档外,我没有找到任何教程:

包 goracle

包 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()
}

关键点:

  1. 使用goracle.Cursor类型处理游标参数
  2. 使用goracle.Out{Dest: &cursor}将游标作为输出参数绑定
  3. 执行存储过程后,通过cursor.Query()获取结果集
  4. 使用标准的database/sql接口处理结果行

确保导入正确的包:goracle "gopkg.in/goracle.v2"

回到顶部