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

I am trying to read images (in long raw datatype) from external Oracle database using Golang code.

When sql's row.Next() is called following error is caught: ORA-01406: fetched column value was truncated

row.Next works fine for reading blob images from mssql DB.

Example code:

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())
}

I hope someone can help me to fix this issue or pinpoint to problem area.

I assume you are using go-oci8 as the driver.

Based on this issue https://github.com/mattn/go-oci8/pull/71 there are someone who get the same error like yours, and then managed to fix it by modifying some codes on the driver.

As per this commit, the problem is already solved by increasing the value of oci8cols[i].size on file $GOPATH/src/github.com/mattn/go-oci8/oci8.go. I think in your case you have bigger blob data, that's why the revision is still not working.

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)

So, try to increase the multiplier, like:

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