Go database/sql结合godror时Oracle ORA-56735超时无错误返回的问题咨询
Go database/sql结合godror时Oracle ORA-56735超时无错误返回的问题咨询
大家好,我最近在使用Go的database/sql搭配godror驱动操作Oracle数据库时,碰到了一个非常费解的问题,想请教下各位同行大佬。
环境信息
- Go版本:1.24.6
- godror驱动版本:v0.49.0
- 数据库:Oracle,使用
database/sql的DB.QueryContext方法(未设置显式上下文超时)
问题场景
我执行了一个耗时较长的查询,Oracle服务器端配置了执行时间限制,超时后服务器日志里明确记录了ORA-56735: elapsed time limit exceeded - call aborted,但我的Go应用却完全没收到这个错误提示。
核心代码片段如下:
ctx := context.Background() // 这里没有设置显式的上下文超时 rows, err := db.QueryContext(ctx, "SELECT /*+ some hints */ ...", namedParams...) if err != nil { // 我原本预期这里会返回ORA-56735错误 log.Fatalf("QueryContext error: %v", err) } defer rows.Close() // 遍历结果集 for rows.Next() { // 这里没有任何行数据返回 } // 检查遍历后的错误 if err := rows.Err(); err != nil { log.Fatalf("Rows iteration error: %v", err) }
预期行为
我原本以为,要么QueryContext会直接返回ORA-56735错误,要么在调用rows.Next()或者最后调用rows.Err()的时候,能捕获到服务器端触发的这个超时终止错误。
实际发生的情况
Oracle服务器日志清晰显示已经触发了ORA-56735(执行时间超过限制,调用被终止),但我的应用里却是这样的表现:
QueryContext成功返回了rows对象,完全没有报错- 遍历
rows的过程中没有得到任何行数据 - 最后调用
rows.Err()返回的是nil
我的问题
有没有大佬遇到过类似的情况?这是不是database/sql结合godror驱动处理ORA-56735错误时的已知行为,或者是一个未修复的bug呢?




