【问题标题】:How to read Image from Oracle (long raw format) in GoLang如何在 GoLang 中从 Oracle(长原始格式)读取图像
【发布时间】:2018-03-13 22:57:06
【问题描述】:

我正在尝试使用 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())
}

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

【问题讨论】:

    标签: oracle go long-integer


    【解决方案1】:

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

    基于这个问题https://github.com/mattn/go-oci8/pull/71有人遇到和你一样的错误,然后通过修改驱动程序上的一些代码来解决它。

    根据这个commit,问题已经通过增加文件$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
    

    【讨论】:

    • 感谢@nvl 的评论。你是对的,我正在使用 mattn oracle 包。看起来目前这个包不支持 long raw。我真的想知道之前是否有人碰巧解决了这个问题:(
    • 尝试在oci8.pc上更改代码oci8cols[i].size = int(lp * 12),有人可以通过更改来摆脱这个错误
    • 基本上只是增加缓冲区,lp * 12 或更大
    • 感谢您的反馈。它变得太重,无法加载包裹。 + 少数图像未正确加载。它们被下载到一半。
    猜你喜欢
    • 1970-01-01
    • 2019-08-19
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2011-02-17
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多