sijms / go-ora

Pure go oracle client
MIT License
795 stars 176 forks source link

Fixed: utils.refineSqlText - Removed the increment from the form index #553

Closed fitlcarlos closed 4 months ago

fitlcarlos commented 5 months ago

Fixed: utils.refineSqlText - Removed the increment from the form index if the character is '\', as it is removing a single quote when the query has a concatenation of texts with a slash, leaving the skip equal to true for the rest of the query.

The error caused when the query has parameters.

Example: SELECT ID, DESCRIPTION||'\'||DESCRIPTION FROM FAB_PROCESSO WHERE ID = :ID

Error: ORA-01008: not all variables bound

sijms commented 5 months ago

where is \\ character in sql? by the way I make an example

package main

import (
    "database/sql"
    "fmt"
    go_ora "github.com/sijms/go-ora/v2"
    "os"
)

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)
        }
    }()
    var result string
    _, err = db.Exec("BEGIN SELECT 'test_' || '' || 'test' into :id from dual; END;", go_ora.Out{Dest: &result, Size: 50})
    if err != nil {
        fmt.Println("can't execute query:", err)
        return
    }
    fmt.Println("result: ", result)
}

output: result: test_test

sijms commented 5 months ago

I also test it with \\ between '' and same result

package main

import (
    "database/sql"
    "fmt"
    go_ora "github.com/sijms/go-ora/v2"
    "os"
)

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)
        }
    }()
    var result string
    _, err = db.Exec(`BEGIN SELECT 'test_' || '\' || 'test' into :id from dual; END;`, go_ora.Out{Dest: &result, Size: 50})
    if err != nil {
        fmt.Println("can't execute query:", err)
        return
    }
    fmt.Println("result: ", result)
}

no error

fitlcarlos commented 5 months ago

The error is not occurring because you are concatenating two strings with the slash in a from dual.

Test using the HR.DEPARTMENTS table with a Where for the department_id column.

package main

import (
    "database/sql"
    "fmt"
    go_ora "github.com/sijms/go-ora/v2"
)

func main() {
    config, err := go_ora.ParseConfig("oracle://nbsgm:new@100.0.65.225:1521/nbs1")

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

    var rows *sql.Rows

    rows, err = db.Query(`SELECT department_name || '\' || department_name FROM HR.DEPARTMENTS where department_id = :department_id`, sql.Named("department_id", 10))

    if err != nil {
        fmt.Println("can't execute query:", err)
        return
    }
    var desc sql.NullString
    for rows.Next() {
        err = rows.Scan(&desc)
    }

    fmt.Println("Process: ", desc)
}

Error:

go_build_test_go_ora.exe -- API server listening at: 127.0.0.1:54387 can't execute query: ORA-01008: not all variables bound

Debugger finished with the exit code 0