Golang调用Oracle存储过程并获取返回值
我在使用Golang调用Oracle存储过程时遇到问题,无法正确获取返回值。具体场景是通过database/sql包执行存储过程调用,但不知道如何获取OUT参数的值。存储过程签名类似:PROCEDURE my_proc(p1 IN NUMBER, p2 OUT VARCHAR2)。尝试过用sql.Out类型但总是报错,请问正确的调用方式是什么?需要完整的代码示例说明如何处理IN/OUT参数以及获取返回值。
        
          2 回复
        
      
      
        在Golang中调用Oracle存储过程并获取返回值,可以使用database/sql包配合Oracle驱动(如github.com/godror/godror)实现。以下是具体步骤和示例代码:
步骤
- 导入驱动:使用godror或go-oci8等Oracle驱动。
- 建立连接:配置数据库连接字符串。
- 准备调用语句:使用BEGIN ... END;块或具名参数调用存储过程。
- 绑定输出参数:通过sql.Out或驱动特定类型处理OUT参数。
- 执行并获取结果:使用db.Exec或db.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参数或游标,需扩展绑定逻辑。
 
        
       
                     
                     
                    


