I'm using version 2.8.16 and trying to use udt array. When the udt array has more than 245 elements, I get a panic error. I created a simple test case that replicates this issue.
package main
import (
"database/sql"
"flag"
"fmt"
"os"
"time"
go_ora "github.com/sijms/go-ora/v2"
)
func execCmd(db *sql.DB, stmts ...string) error {
for _, stmt := range stmts {
if _, err := db.Exec(stmt); err != nil {
if len(stmts) > 1 {
return fmt.Errorf("error: %v in execuation of stmt: %s", err, stmt)
} else {
return err
}
}
}
return nil
}
func createTypes(db *sql.DB) error {
return execCmd(db, `
create or replace type stringsType as object(
STRING1 varchar2(60),
STRING2 varchar2(300)
)`,
`create or replace type stringsTypeCol as table of stringsType`)
}
func dropTypes(db *sql.DB) error {
return execCmd(db,
"DROP TYPE stringsTypeCol",
"DROP TYPE stringsType")
}
type StringsType struct {
String1 string `udt:"STRING1"`
String2 string `udt:"STRING2"`
}
func execSql(db *sql.DB, len int) {
start := time.Now()
var output []StringsType
_, err := db.Exec(`
declare
outp stringsTypeCol;
ext number;
begin
ext := :1;
outp := stringsTypeCol();
outp.extend(ext);
for n in 1..ext
loop
outp(n) := stringsType('string1','string2');
end loop;
:2 := outp;
end;
`, len, go_ora.Out{Dest: &output})
if err != nil {
fmt.Println("can't execute query:", err)
return
}
elapsed := time.Since(start)
fmt.Println("length: ", len, " - sql exec took: ", elapsed)
}
func main() {
db, err := sql.Open("oracle", os.Getenv("DSN"))
if err != nil {
fmt.Println(err.Error())
}
defer db.Close()
err = createTypes(db)
if err != nil {
fmt.Println("can't create types: ", err)
return
}
defer func() {
err = dropTypes(db)
if err != nil {
fmt.Println("can't drop types: ", err)
}
}()
err = go_ora.RegisterType(db, "stringsType", "stringsTypeCol", StringsType{})
if err != nil {
fmt.Println("can't register stringsType: ", err)
return
}
var nFlag int
flag.IntVar(&nFlag, "n", 246, "udt array length") // if n > 245 then panic error!
flag.Parse()
for i := 1; i <= nFlag; i++ {
execSql(db, i)
}
}
I'm using version 2.8.16 and trying to use udt array. When the udt array has more than 245 elements, I get a panic error. I created a simple test case that replicates this issue.