Closed elgs closed 2 months ago
+1 same issue
2024-04-23 panic: runtime error: invalid memory address or nil pointer dereference
2024-04-23 [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0xd3ee87]
2024-04-23
2024-04-23 goroutine 1 [running]:
2024-04-23 github.com/sijms/go-ora/v2/network.(*Session).Connect(0xc0003eaa80, {0x12c4270, 0xc0003d1420})
2024-04-23 /gopath/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/network/session.go:490 +0x127
2024-04-23 github.com/sijms/go-ora/v2.(*Connection).OpenWithContext(0xc00026cf08, {0x12c4270, 0xc0003d1420})
2024-04-23 /gopath/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/connection.go:412 +0x6d7
2024-04-23 github.com/sijms/go-ora/v2.(*OracleConnector).Connect(0xc00041aea0, {0x12c4270, 0xc0003d1420})
2024-04-23 /gopath/pkg/mod/github.com/sijms/go-ora/v2@v2.8.12/connection.go:134 +0x15e
2024-04-23 database/sql.(*DB).conn(0xc000377110, {0x12c4270, 0xc0003d1420}, 0x1)
2024-04-23 /usr/local/go/src/database/sql/sql.go:1415 +0x71e
2024-04-23 database/sql.(*DB).Conn.func1(0x0?)
2024-04-23 /usr/local/go/src/database/sql/sql.go:1940 +0x3a
2024-04-23 database/sql.(*DB).retry(0x12c4270?, 0xc00004d750)
2024-04-23 /usr/local/go/src/database/sql/sql.go:1566 +0x42
2024-04-23 database/sql.(*DB).Conn(0xc000377110, {0x12c4270?, 0xc0003d1420?})
...
➕1️⃣
https://github.com/godoes/gorm-oracle/actions/runs/8793564085/job/24131652002 https://github.com/godoes/gorm-oracle/pull/22
I am fixing
fixed 2.8.13
connection issue is fixed, but a new problem is produced in my environment with new version 2.8.13. 2.8.11 is ok.
query column info error: ORA-01009: missing mandatory parameter\n - sql: SELECT * FROM testdbuser.testshort WHERE ID=:1
the following code run without error:
package main
import (
"database/sql"
"fmt"
go_ora "github.com/sijms/go-ora/v2"
"os"
"strconv"
"time"
)
type TTB_DATA struct {
Id int64 `db:"ID"`
Name string `db:"NAME"`
Val float64 `db:"VAL"`
Date time.Time `db:"LDATE"`
}
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 createTable(db *sql.DB) error {
t := time.Now()
err := execCmd(db, `CREATE TABLE TTB_545(
ID number(10) NOT NULL,
NAME VARCHAR(200),
VAL number(10,2),
LDATE date,
PRIMARY KEY(ID)
)`)
if err != nil {
return err
}
fmt.Println("Finish create table :", time.Now().Sub(t))
return nil
}
func dropTable(db *sql.DB) error {
t := time.Now()
err := execCmd(db, "drop table TTB_545 purge")
if err != nil {
return err
}
fmt.Println("Finish drop table: ", time.Now().Sub(t))
return nil
}
func insert(conn *sql.DB, count int) error {
t := time.Now()
data := make([]TTB_DATA, count)
for x := 0; x < count; x++ {
data[x].Id = int64(1 + x)
data[x].Name = "test_ " + strconv.Itoa(x+1)
data[x].Val = 100.23 + 1
data[x].Date = time.Now()
}
_, err := conn.Exec("INSERT INTO TTB_545 (ID, NAME, VAL, LDATE) VALUES(:ID, :NAME, :VAL, :LDATE)", data)
if err != nil {
return err
}
fmt.Println("Finish insert data: ", time.Now().Sub(t))
return nil
}
func main() {
config, err := go_ora.ParseConfig(os.Getenv("DSN"))
if err != nil {
fmt.Println("can't parse config:", err)
return
}
go_ora.RegisterConnConfig(config)
db, err := sql.Open("oracle", "")
if err != nil {
fmt.Println("can't open db:", err)
return
}
defer func() {
err = db.Close()
if err != nil {
fmt.Println("can't close db:", err)
}
}()
err = createTable(db)
if err != nil {
fmt.Println("can't create table:", err)
return
}
defer func() {
err = dropTable(db)
if err != nil {
fmt.Println("can't drop table:", err)
}
}()
err = insert(db, 100)
if err != nil {
fmt.Println("can't insert data:", err)
return
}
rows, err := db.Query("SELECT * FROM TTB_545 where id = :1", 1)
if err != nil {
fmt.Println("can't query rows:", err)
return
}
defer func() {
err = rows.Close()
if err != nil {
fmt.Println("can't close rows:", err)
}
}()
}
Sorry, test it, my table is little different and includes clob column. This code will produce error.
Finish create table : 2.871612167s
Finish insert data: 21.6205ms
can't query rows: ORA-01009: missing mandatory parameter
Finish drop table: 48.876541ms
package main
import (
"context"
"fmt"
"strconv"
"time"
"github.com/jmoiron/sqlx"
go_ora "github.com/sijms/go-ora/v2"
)
type TTB_DATA struct {
Id int64 `db:"ID"`
Name string `db:"NAME"`
Val float64 `db:"VAL"`
Clobtest string `db:"CLOBTEST"`
Date time.Time `db:"LDATE"`
}
func execCmd(db *sqlx.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 createTable(db *sqlx.DB) error {
t := time.Now()
err := execCmd(db, `CREATE TABLE TTB_545(
ID number(10) NOT NULL,
NAME VARCHAR(200),
VAL number(10,2),
CLOBTEST CLOB,
LDATE date,
PRIMARY KEY(ID)
)`)
if err != nil {
return err
}
fmt.Println("Finish create table :", time.Now().Sub(t))
return nil
}
func dropTable(db *sqlx.DB) error {
t := time.Now()
err := execCmd(db, "drop table TTB_545 purge")
if err != nil {
return err
}
fmt.Println("Finish drop table: ", time.Now().Sub(t))
return nil
}
func insert(conn *sqlx.DB, count int) error {
t := time.Now()
data := make([]TTB_DATA, count)
for x := 0; x < count; x++ {
data[x].Id = int64(1 + x)
data[x].Name = "test_ " + strconv.Itoa(x+1)
data[x].Val = 100.23 + 1
data[x].Clobtest = "ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
data[x].Date = time.Now()
}
_, err := conn.Exec("INSERT INTO TTB_545 (ID, NAME, VAL,CLOBTEST, LDATE) VALUES(:ID, :NAME, :VAL,:CLOBTEST, :LDATE)", data)
if err != nil {
return err
}
fmt.Println("Finish insert data: ", time.Now().Sub(t))
return nil
}
func main() {
options := map[string]string{
"TIMEOUT": "60",
"CONNECTION TIMEOUT": "5",
}
dsn := go_ora.BuildUrl(host, 1521, "orcldb", "test", "test123", options)
conn, err := sqlx.Open("oracle", dsn)
if err != nil {
fmt.Printf("create oracle connection pool error: %v\n", err)
return
}
defer func() {
err = conn.Close()
if err != nil {
fmt.Println("can't close db:", err)
}
}()
err = createTable(conn)
if err != nil {
fmt.Println("can't create table:", err)
return
}
defer func() {
err = dropTable(conn)
if err != nil {
fmt.Println("can't drop table:", err)
}
}()
err = insert(conn, 100)
if err != nil {
fmt.Println("can't insert data:", err)
return
}
ctxTimeout, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
rows, err := conn.QueryxContext(ctxTimeout, "SELECT * FROM TTB_545 where id = :1", 1)
if err != nil {
fmt.Println("can't query rows:", err)
return
}
defer func() {
err = rows.Close()
if err != nil {
fmt.Println("can't close rows:", err)
}
}()
}
fixed in next release
fixed v2.8.14
Test. This error is gone.
I got the following error after upgrading to v2.8.12, which worked without a problem on v2.8.11.
The code I use to connect to the db looks something like this: