Documentation
¶
Overview ¶
Example (SqlBlob) ¶
// 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&...¶mN=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(), 55*time.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 (SqlClob) ¶
// 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&...¶mN=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(), 55*time.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 (SqlCursor) ¶
// 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&...¶mN=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(), 55*time.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 (SqlCursorFunction) ¶
// 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&...¶mN=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(), 55*time.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 (SqlFunction) ¶
// 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&...¶mN=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 (SqlInsert) ¶
// 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&...¶mN=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 (SqlManyInserts) ¶
// 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&...¶mN=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(), 55*time.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(), 55*time.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 (SqlRowid) ¶
// 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&...¶mN=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(), 55*time.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 (SqlSelect) ¶
// 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&...¶mN=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(), 55*time.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
Index ¶
- Variables
- func GetLastInsertId(id int64) string
- func NewConnector(hosts ...string) driver.Connector
- func QueryEscape(s string) string
- func QueryUnescape(s string) (string, error)
- type Conn
- func (conn *Conn) Begin() (driver.Tx, error)
- func (conn *Conn) BeginTx(ctx context.Context, txOptions driver.TxOptions) (driver.Tx, error)
- func (conn *Conn) Close() error
- func (conn *Conn) Ping(ctx context.Context) error
- func (conn *Conn) Prepare(query string) (driver.Stmt, error)
- func (conn *Conn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error)
- type Connector
- type DSN
- type DriverStruct
- type EscapeError
- type Result
- type Rows
- type Stmt
- func (stmt *Stmt) CheckNamedValue(namedValue *driver.NamedValue) error
- func (stmt *Stmt) Close() error
- func (stmt *Stmt) Exec(values []driver.Value) (driver.Result, error)
- func (stmt *Stmt) ExecContext(ctx context.Context, namedValues []driver.NamedValue) (driver.Result, error)
- func (stmt *Stmt) NumInput() int
- func (stmt *Stmt) Query(values []driver.Value) (driver.Rows, error)
- func (stmt *Stmt) QueryContext(ctx context.Context, namedValues []driver.NamedValue) (driver.Rows, error)
- type Tx
- type Values
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrOCIInvalidHandle is OCI_INVALID_HANDLE ErrOCIInvalidHandle = errors.New("OCI_INVALID_HANDLE") // ErrOCISuccessWithInfo is OCI_SUCCESS_WITH_INFO ErrOCISuccessWithInfo = errors.New("OCI_SUCCESS_WITH_INFO") // ErrOCIReservedForIntUse is OCI_RESERVED_FOR_INT_USE ErrOCIReservedForIntUse = errors.New("OCI_RESERVED_FOR_INT_USE") // ErrOCINoData is OCI_NO_DATA ErrOCINoData = errors.New("OCI_NO_DATA") // ErrOCINeedData is OCI_NEED_DATA ErrOCINeedData = errors.New("OCI_NEED_DATA") // ErrOCIStillExecuting is OCI_STILL_EXECUTING ErrOCIStillExecuting = errors.New("OCI_STILL_EXECUTING") // ErrNoRowid is result has no rowid ErrNoRowid = errors.New("result has no rowid") // Driver is the sql driver Driver = &DriverStruct{ Logger: log.New(ioutil.Discard, "", 0), } )
Functions ¶
func GetLastInsertId ¶
GetLastInsertId returns rowid from LastInsertId
func NewConnector ¶
NewConnector returns a new database connector
func QueryEscape ¶
QueryEscape escapes the string so it can be safely placed inside a URL query.
func QueryUnescape ¶
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.
Types ¶
type Conn ¶
type Conn struct {
// contains filtered or unexported fields
}
Conn is Oracle connection
type Connector ¶
Connector is the sql driver connector
type DSN ¶
type DSN struct {
Connect string
Username string
Password string
// contains filtered or unexported fields
}
DSN is Oracle Data Source Name
func ParseDSN ¶
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&...¶mN=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 ¶
type DriverStruct struct {
// Logger is used to log connection ping errors, defaults to discard
// To log set it to something like: log.New(os.Stderr, "oci8 ", log.Ldate|log.Ltime|log.LUTC|log.Lshortfile)
Logger *log.Logger
}
DriverStruct is Oracle driver struct
type EscapeError ¶
type EscapeError string
EscapeError for invalid escape
func (EscapeError) Error ¶
func (e EscapeError) Error() string
Error returns string for invalid URL escape
type Result ¶
type Result struct {
// contains filtered or unexported fields
}
Result is Oracle result
func (*Result) LastInsertId ¶
LastInsertId returns last inserted ID
func (*Result) RowsAffected ¶
RowsAffected returns rows affected
type Rows ¶
type Rows struct {
// contains filtered or unexported fields
}
Rows is Oracle rows
func (*Rows) ColumnTypeDatabaseTypeName ¶
ColumnTypeDatabaseTypeName implement RowsColumnTypeDatabaseTypeName.
func (*Rows) ColumnTypeLength ¶
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 ¶
ColumnTypeScanType implement RowsColumnTypeScanType.
type Stmt ¶
type Stmt struct {
// contains filtered or unexported fields
}
Stmt is Oracle statement
func (*Stmt) CheckNamedValue ¶
func (stmt *Stmt) CheckNamedValue(namedValue *driver.NamedValue) error
CheckNamedValue checks a named value
func (*Stmt) ExecContext ¶
func (stmt *Stmt) ExecContext(ctx context.Context, namedValues []driver.NamedValue) (driver.Result, error)
ExecContext run a exec query with context
func (*Stmt) QueryContext ¶
func (stmt *Stmt) QueryContext(ctx context.Context, namedValues []driver.NamedValue) (driver.Rows, error)
QueryContext runs a query with context
type Values ¶
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.
func ParseQuery ¶
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.
func (Values) Add ¶
Add adds the value to key. It appends to any existing values associated with key.
func (Values) Encode ¶
Encode encodes the values into “URL encoded” form ("bar=baz&foo=quux") not sorted by key
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
_example
|
|
|
as_sysdba
command
|
|
|
blob
command
|
|
|
dbms_output
command
|
|
|
lastinsertid
command
|
|
|
nls
command
|
|
|
storedproc
command
|