Golang调用Oracle存储过程并获取返回值

我在使用Golang调用Oracle存储过程时遇到问题,无法正确获取返回值。具体场景是通过database/sql包执行存储过程调用,但不知道如何获取OUT参数的值。存储过程签名类似:PROCEDURE my_proc(p1 IN NUMBER, p2 OUT VARCHAR2)。尝试过用sql.Out类型但总是报错,请问正确的调用方式是什么?需要完整的代码示例说明如何处理IN/OUT参数以及获取返回值。

2 回复

在Golang中调用Oracle存储过程并获取返回值,可以使用go-ora驱动:

  1. 首先安装驱动:
go get github.com/sijms/go-ora/v2
  1. 代码示例:
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/sijms/go-ora/v2"
)

func main() {
    connStr := "oracle://user:pass@host:port/service"
    db, err := sql.Open("oracle", connStr)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 调用存储过程
    var result string
    _, err = db.Exec(`
        BEGIN 
            your_procedure(:1, :2); 
        END;`,
        sql.Out{Dest: &result}, // 输出参数
        "input_param")          // 输入参数
    
    if err != nil {
        panic(err)
    }
    fmt.Println("结果:", result)
}

关键点:

  • 使用sql.Out包装输出参数
  • 在PL/SQL块中调用存储过程
  • 参数按顺序绑定
  • 支持返回游标、数值等多种类型

注意:确保Oracle客户端库正确安装,连接字符串格式正确。

更多关于Golang调用Oracle存储过程并获取返回值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中调用Oracle存储过程并获取返回值,可以使用database/sql包配合Oracle驱动(如github.com/godror/godror)实现。以下是具体步骤和示例代码:

步骤

  1. 导入驱动:使用godrorgo-oci8等Oracle驱动。
  2. 建立连接:配置数据库连接字符串。
  3. 准备调用语句:使用BEGIN ... END;块或具名参数调用存储过程。
  4. 绑定输出参数:通过sql.Out或驱动特定类型处理OUT参数。
  5. 执行并获取结果:使用db.Execdb.Query执行。

示例代码

假设存储过程为:

CREATE OR REPLACE PROCEDURE get_employee(
    p_id IN NUMBER,
    p_name OUT VARCHAR2
) AS
BEGIN
    SELECT name INTO p_name FROM employees WHERE id = p_id;
END;

Golang调用代码:

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/godror/godror"
)

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

    var outName string

    // 调用存储过程,绑定OUT参数
    _, err = db.Exec(`
        BEGIN 
            get_employee(:1, :2); 
        END;`,
        123, // 输入参数
        sql.Out{Dest: &outName}, // 输出参数
    )
    if err != nil {
        log.Fatal("执行失败:", err)
    }

    fmt.Printf("员工姓名: %s\n", outName)
}

关键点

  • 参数绑定:使用sql.Out包装输出变量地址。
  • 错误处理:检查Exec返回的错误。
  • 驱动差异:不同Oracle驱动(如go-oci8)语法可能略有不同,请参考具体文档。

注意事项

  • 确保Oracle客户端库已安装并配置。
  • 复杂类型(如游标)需使用驱动特定方式处理。

以上示例适用于简单返回值场景,若有多个OUT参数或游标,需扩展绑定逻辑。

回到顶部