如何在GoLang中从Oracle读取图像(长原始格式)



我正在尝试使用 Golang 代码从外部 Oracle 数据库中读取图像(长原始数据类型)。

当 sql 的行。Next() 被调用,捕获了以下错误: ORA-01406:提取的列值被截断

排。接下来适用于从 mssql DB 读取 blob 图像。

示例代码:

db, err := sql.Open("oci8", getDSN()) //function to get connection details 
if err != nil {
fmt.Println(err)
return
}
defer db.Close()
rows, err := db.Query("SELECT image FROM sysadm.all_images")
if err != nil {
fmt.Println(err)
return
}
defer rows.Close()
for rows.Next() {
var id string
var data []byte
rows.Scan(&id, &data)    
}
fmt.Println("Total errors", rows.Err())
}

我希望有人可以帮助我解决此问题或查明问题区域。

我假设您正在使用go-oci8作为驱动程序。

基于此问题 https://github.com/mattn/go-oci8/pull/71 有人遇到与您相同的错误,然后通过修改驱动程序上的某些代码来修复它。

根据此提交,该问题已经通过增加文件$GOPATH/src/github.com/mattn/go-oci8/oci8.go上的oci8cols[i].size值来解决。我认为在您的情况下,您有更大的 blob 数据,这就是修订版仍然不起作用的原因。

case C.SQLT_NUM:
oci8cols[i].kind = C.SQLT_CHR
oci8cols[i].size = int(lp * 4) // <==== THIS VALUE
oci8cols[i].pbuf = C.malloc(C.size_t(oci8cols[i].size) + 1)

因此,尝试增加乘数,例如:

oci8cols[i].size = int(lp * 12) // <==== OR GREATER

最新更新