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

时间:2018-03-13 22:57:07

标签: oracle go long-integer

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

当调用sql的row.Next()时,会捕获以下错误: ORA-01406:获取的列值被截断

row.Next适用于从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())
}

我希望有人可以帮助我解决这个问题或找出问题所在。

1 个答案:

答案 0 :(得分:0)

我假设你使用go-oci8作为驱动程序。

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

根据此commit,问题已通过增加文件oci8cols[i].size$GOPATH/src/github.com/mattn/go-oci8/oci8.go的值来解决。我认为在你的情况下你有更大的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