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参数或游标,需扩展绑定逻辑。


