oci8 package - github.com/mattn/go-oci8 - Go Packages (original) (raw)

// Example shows how write and read a blob

// For testing, check if database tests are disabled if oci8.TestDisableDatabase || oci8.TestDisableDestructive { fmt.Println("done") return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

// create table tableName := "E_BLOB_" + oci8.TestTimeString query := "create table " + tableName + " ( A BLOB )" ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

// insert row query = "insert into " + tableName + " ( A ) values (:1)" ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query, bytes.Repeat([]byte("abcdefghijklmnopqrstuvwxyz"), 200)) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

var rows sql.Rows ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) defer cancel() rows, err = db.QueryContext(ctx, "select A from "+tableName) if err != nil { fmt.Println("QueryContext error is not nil:", err) return }

// defer close rows defer func() { err = rows.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

if !rows.Next() { fmt.Println("no Next rows") return }

var theBytes []byte err = rows.Scan(&theBytes) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if len(theBytes) != 5200 { fmt.Println("len theBytes != 5200") return }

if rows.Next() { fmt.Println("has Next rows") return }

err = rows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

// drop table query = "drop table " + tableName ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

fmt.Println("done")

Output:

done

// Example shows how write and read a clob

// For testing, check if database tests are disabled if oci8.TestDisableDatabase || oci8.TestDisableDestructive { fmt.Println("done") return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

// create table tableName := "E_CLOB_" + oci8.TestTimeString query := "create table " + tableName + " ( A CLOB )" ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

// insert row query = "insert into " + tableName + " ( A ) values (:1)" ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query, strings.Repeat("abcdefghijklmnopqrstuvwxyz", 200)) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

var rows sql.Rows ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) defer cancel() rows, err = db.QueryContext(ctx, "select A from "+tableName) if err != nil { fmt.Println("QueryContext error is not nil:", err) return }

// defer close rows defer func() { err = rows.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

if !rows.Next() { fmt.Println("no Next rows") return }

var aString string err = rows.Scan(&aString) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if len(aString) != 5200 { fmt.Println("len aString != 5200") return }

if rows.Next() { fmt.Println("has Next rows") return }

err = rows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

// drop table query = "drop table " + tableName ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

fmt.Println("done")

Output:

done

// Example shows how to do a cursor select

// For testing, check if database tests are disabled if oci8.TestDisableDatabase { fmt.Println(3) return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) err = db.PingContext(ctx) cancel() if err != nil { fmt.Println("PingContext error is not nil:", err) return }

var rows sql.Rows ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) defer cancel() rows, err = db.QueryContext(ctx, "select 1, cursor(select 2 from dual union select 3 from dual) from dual") if err != nil { fmt.Println("QueryContext error is not nil:", err) return }

// defer close rows defer func() { err = rows.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

if !rows.Next() { fmt.Println("no Next rows") return }

var aInt int64 var subRows *sql.Rows err = rows.Scan(&aInt, &subRows) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if aInt != 1 { fmt.Println("aInt != 1") return } if subRows == nil { fmt.Println("subRows is nil") return }

if !subRows.Next() { fmt.Println("no Next subRows") return }

err = subRows.Scan(&aInt) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if aInt != 2 { fmt.Println("aInt != 2") return }

if !subRows.Next() { fmt.Println("no Next subRows") return }

err = subRows.Scan(&aInt) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if aInt != 3 { fmt.Println("aInt != 3") return }

if subRows.Next() { fmt.Println("has Next rows") return }

err = subRows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

if rows.Next() { fmt.Println("has Next rows") return }

err = rows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

fmt.Println(aInt)

Output:

3

// Example shows how to do a cursor select from function

// For testing, check if database tests are disabled if oci8.TestDisableDatabase || oci8.TestDisableDestructive { fmt.Println(3) return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) err = db.PingContext(ctx) cancel() if err != nil { fmt.Println("PingContext error is not nil:", err) return }

// create function functionName := "E_F_CURSOR_" + oci8.TestTimeString query := create or replace function + functionName + return SYS_REFCURSOR is l_cursor SYS_REFCURSOR; begin open l_cursor for select 2 from dual union select 3 from dual; return l_cursor; end + functionName + ; ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

var rows sql.Rows ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) defer cancel() rows, err = db.QueryContext(ctx, "select 1, "+functionName+"() from dual") if err != nil { fmt.Println("QueryContext error is not nil:", err) return }

// defer close rows defer func() { err = rows.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

if !rows.Next() { fmt.Println("no Next rows") return }

var aInt int64 var subRows *sql.Rows err = rows.Scan(&aInt, &subRows) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if aInt != 1 { fmt.Println("aInt != 1") return } if subRows == nil { fmt.Println("subRows is nil") return }

if !subRows.Next() { fmt.Println("no Next subRows") return }

err = subRows.Scan(&aInt) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if aInt != 2 { fmt.Println("aInt != 2") return }

if !subRows.Next() { fmt.Println("no Next subRows") return }

err = subRows.Scan(&aInt) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if aInt != 3 { fmt.Println("aInt != 3") return }

if subRows.Next() { fmt.Println("has Next rows") return }

err = subRows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

if rows.Next() { fmt.Println("has Next rows") return }

err = rows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

// drop function query = "drop function " + functionName ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

fmt.Println(aInt)

Output:

3

// Example shows how to do a function call with binds

// For testing, check if database tests are disabled if oci8.TestDisableDatabase { fmt.Println(3) return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

number := int64(2) query := declare function ADD_ONE(p_number INTEGER) return INTEGER as begin return p_number + 1; end ADD_ONE; begin :num1 := ADD_ONE(:num1); end;

ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query, sql.Out{Dest: &number, In: true}) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

if number != 3 { fmt.Println("number != 3") return }

fmt.Println(number)

Output:

3

// Example shows how to do a single insert

// For testing, check if database tests are disabled if oci8.TestDisableDatabase || oci8.TestDisableDestructive { fmt.Println(1) return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

// create table tableName := "E_INSERT_" + oci8.TestTimeString query := "create table " + tableName + " ( A INTEGER )" ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

// insert row var result sql.Result query = "insert into " + tableName + " ( A ) values (:1)" ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) result, err = db.ExecContext(ctx, query, 1) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

// can see number of RowsAffected if wanted var rowsAffected int64 rowsAffected, err = result.RowsAffected() if err != nil { fmt.Println("RowsAffected error is not nil:", err) return }

// drop table query = "drop table " + tableName ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

fmt.Println(rowsAffected)

Output:

1

// Example shows how to do a many inserts

// For testing, check if database tests are disabled if oci8.TestDisableDatabase || oci8.TestDisableDestructive { fmt.Println(3) return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

// create table tableName := "E_MANY_INSERT_" + oci8.TestTimeString query := "create table " + tableName + " ( A INTEGER )" ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

// prepare insert query statement var stmt sql.Stmt query = "insert into " + tableName + " ( A ) values (:1)" ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) stmt, err = db.PrepareContext(ctx, query) cancel() if err != nil { fmt.Println("PrepareContext error is not nil:", err) return }

// insert 3 rows for i := 0; i < 3; i++ { ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = stmt.ExecContext(ctx, i) cancel() if err != nil { stmt.Close() fmt.Println("ExecContext error is not nil:", err) return } }

// close insert query statement err = stmt.Close() if err != nil { fmt.Println("Close error is not nil:", err) return }

// select count/number of rows var rows sql.Rows query = "select count(1) from " + tableName ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) defer cancel() rows, err = db.QueryContext(ctx, query) if err != nil { fmt.Println("QueryContext error is not nil:", err) return }

// defer close rows defer func() { err = rows.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

if !rows.Next() { fmt.Println("no Next rows") return }

var count int64 err = rows.Scan(&count) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if count != 3 { fmt.Println("count not equal to 3") return }

if rows.Next() { fmt.Println("has Next rows") return }

err = rows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

// drop table query = "drop table " + tableName ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

fmt.Println(count)

Output:

3

// Example shows a few ways to get rowid

// For testing, check if database tests are disabled if oci8.TestDisableDatabase || oci8.TestDisableDestructive { fmt.Println("done") return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

// create table tableName := "E_ROWID_" + oci8.TestTimeString query := "create table " + tableName + " ( A INTEGER )" ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

// insert row and get rowid from returning var rowid1 string // rowid will be put into here var result sql.Result query = "insert into " + tableName + " ( A ) values (:1) returning rowid into :rowid1" ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) result, err = db.ExecContext(ctx, query, 1, sql.Named("rowid1", sql.Out{Dest: &rowid1})) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

// get rowid from LastInsertId var rowid2 string // rowid will be put into here var id int64 id, err = result.LastInsertId() if err != nil { fmt.Println("LastInsertId error is not nil:", err) return } rowid2 = oci8.GetLastInsertId(id)

// select rowid var rowid3 string // rowid will be put into here var rows sql.Rows query = "select rowid from " + tableName ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) defer cancel() rows, err = db.QueryContext(ctx, query) if err != nil { fmt.Println("QueryContext error is not nil:", err) return }

// defer close rows defer func() { err = rows.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

if !rows.Next() { fmt.Println("no Next rows") return }

err = rows.Scan(&rowid3) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if rows.Next() { fmt.Println("has Next rows") return }

err = rows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

// drop table query = "drop table " + tableName ctx, cancel = context.WithTimeout(context.Background(), 55*time.Second) _, err = db.ExecContext(ctx, query) cancel() if err != nil { fmt.Println("ExecContext error is not nil:", err) return }

if len(rowid1) != len(rowid2) || len(rowid2) != len(rowid3) { fmt.Println("rowid len is not equal", rowid1, rowid2, rowid3) return }

fmt.Println("done")

Output:

done

// Example shows how to do a basic select

// For testing, check if database tests are disabled if oci8.TestDisableDatabase { fmt.Println(1) return }

oci8.Driver.Logger = log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)

var openString string // [username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN] if len(oci8.TestUsername) > 0 { if len(oci8.TestPassword) > 0 { openString = oci8.TestUsername + "/" + oci8.TestPassword + "@" } else { openString = oci8.TestUsername + "@" } } openString += oci8.TestHostValid

// A normal simple Open to localhost would look like: // db, err := sql.Open("oci8", "127.0.0.1") // For testing, need to use additional variables db, err := sql.Open("oci8", openString) if err != nil { fmt.Printf("Open error is not nil: %v", err) return } if db == nil { fmt.Println("db is nil") return }

// defer close database defer func() { err = db.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

ctx, cancel := context.WithTimeout(context.Background(), 55*time.Second) err = db.PingContext(ctx) cancel() if err != nil { fmt.Println("PingContext error is not nil:", err) return }

var rows sql.Rows ctx, cancel = context.WithTimeout(context.Background(), 55time.Second) defer cancel() rows, err = db.QueryContext(ctx, "select 1 from dual") if err != nil { fmt.Println("QueryContext error is not nil:", err) return }

// defer close rows defer func() { err = rows.Close() if err != nil { fmt.Println("Close error is not nil:", err) } }()

if !rows.Next() { fmt.Println("no Next rows") return }

dest := make([]interface{}, 1) destPointer := make([]interface{}, 1) destPointer[0] = &dest[0] err = rows.Scan(destPointer...) if err != nil { fmt.Println("Scan error is not nil:", err) return }

if len(dest) != 1 { fmt.Println("len dest != 1") return } data, ok := dest[0].(float64) if !ok { fmt.Println("dest type not float64") return } if data != 1 { fmt.Println("data not equal to 1") return }

if rows.Next() { fmt.Println("has Next rows") return }

err = rows.Err() if err != nil { fmt.Println("Err error is not nil:", err) return }

fmt.Println(data)

Output:

1

This section is empty.

GetLastInsertId returns rowid from LastInsertId

NewConnector returns a new database connector

QueryEscape escapes the string so it can be safely placed inside a URL query.

QueryUnescape does the inverse transformation of QueryEscape, converting %AB into the byte 0xAB and '+' into ' ' (space). It returns an error if any % is not followed by two hexadecimal digits.

Conn is Oracle connection

Begin starts a transaction

BeginTx starts a transaction

func (conn *Conn) Close() error

Close a connection

PrepareContext prepares a query with context

Connector is the sql driver connector

Connect returns a new database connection

Driver returns the OCI8 driver

DSN is Oracle Data Source Name

ParseDSN parses a DSN used to connect to Oracle

It expects to receive a string in the form:

[username/[password]@]host[:port][/service_name][?param1=value1&...&paramN=valueN]

Connection timeout can be set in the Oracle files: sqlnet.ora as SQLNET.OUTBOUND_CONNECT_TIMEOUT or tnsnames.ora as CONNECT_TIMEOUT

Supported parameters are:

loc - the time location for reading timestamp (without time zone). Defaults to UTC Note that writing a timestamp (without time zone) just truncates the time zone.

isolation - the isolation level that can be set to: READONLY, SERIALIZABLE, or DEFAULT

prefetch_rows - the number of top level rows to be prefetched. Defaults to 0. A 0 means unlimited rows.

prefetch_memory - the max memory for top level rows to be prefetched. Defaults to 4096. A 0 means unlimited memory.

questionph - when true, enables question mark placeholders. Defaults to false. (uses strconv.ParseBool to check for true)

type DriverStruct struct {

Logger *[log](/log).[Logger](/log#Logger)

}

DriverStruct is Oracle driver struct

Open opens a new database connection

EscapeError for invalid escape

Error returns string for invalid URL escape

Result is Oracle result

LastInsertId returns last inserted ID

RowsAffected returns rows affected

Rows is Oracle rows

func (rows *Rows) Close() error

Close closes rows

func (*Rows) ColumnTypeDatabaseTypeName added in v0.0.7

func (rows *Rows) ColumnTypeDatabaseTypeName(i int) string

ColumnTypeDatabaseTypeName implement RowsColumnTypeDatabaseTypeName.

func (*Rows) ColumnTypeLength added in v0.0.7

ColumnTypeLength is returning OCI_ATTR_DATA_SIZE, which is max data size in bytes. Note this is not returing length of the column type, like the 20 in FLOAT(20), which is what is normally expected. TODO: Should / can it be changed to return length of the column type?

func (*Rows) ColumnTypeScanType added in v0.0.7

ColumnTypeScanType implement RowsColumnTypeScanType.

func (*Rows) Columns added in v0.0.7

func (rows *Rows) Columns() []string

Columns returns column names

Stmt is Oracle statement

CheckNamedValue checks a named value

func (stmt *Stmt) Close() error

Close closes the statement

ExecContext run a exec query with context

func (stmt *Stmt) NumInput() int

NumInput returns the number of input

QueryContext runs a query with context

Tx is Oracle transaction

func (tx *Tx) Commit() error

Commit transaction commit

func (tx *Tx) Rollback() error

Rollback transaction rollback

Values maps a string key to a list of values. It is typically used for query parameters and form values. Unlike in the http.Header map, the keys in a Values map are case-sensitive.

ParseQuery parses the URL-encoded query string and returns a map listing the values specified for each key. ParseQuery always returns a non-nil map containing all the valid query parameters found; err describes the first decoding error encountered, if any.

Add adds the value to key. It appends to any existing values associated with key.

Del deletes the values associated with key.

Encode encodes the values into “URL encoded” form ("bar=baz&foo=quux") not sorted by key

Get gets the first value associated with the given key. If there are no values associated with the key, Get returns the empty string. To access multiple values, use the map directly.

Set sets the key to value. It replaces any existing values.