{"id":19626322,"url":"https://github.com/rana/ora","last_synced_at":"2025-05-16T18:06:50.502Z","repository":{"id":22597637,"uuid":"25939656","full_name":"rana/ora","owner":"rana","description":"An Oracle database driver in Go.","archived":false,"fork":false,"pushed_at":"2024-11-01T18:01:24.000Z","size":2742,"stargazers_count":274,"open_issues_count":45,"forks_count":67,"subscribers_count":21,"default_branch":"master","last_synced_at":"2025-05-10T02:56:14.562Z","etag":null,"topics":["database","driver","go","golang","golang-package","oracle","oracle-database","oracle-db"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rana.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-10-29T20:19:18.000Z","updated_at":"2025-03-03T12:18:58.000Z","dependencies_parsed_at":"2024-12-16T06:02:10.944Z","dependency_job_id":"d6f9985b-2b0c-44c3-b999-d4db5b3f18a3","html_url":"https://github.com/rana/ora","commit_stats":null,"previous_names":["ranaian/ora"],"tags_count":39,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rana%2Fora","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rana%2Fora/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rana%2Fora/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rana%2Fora/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rana","download_url":"https://codeload.github.com/rana/ora/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254582905,"owners_count":22095518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","driver","go","golang","golang-package","oracle","oracle-database","oracle-db"],"created_at":"2024-11-11T11:46:18.625Z","updated_at":"2025-05-16T18:06:50.477Z","avatar_url":"https://github.com/rana.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ora - High Performance Oracle Database Driver for Go\n\n`ora` is a feature-rich Go database driver for Oracle that implements the `database/sql/driver` interface. The project provides direct access to Oracle databases with support for advanced Oracle features while maintaining high performance and reliability.\n\n--\n    import \"gopkg.in/rana/ora.v4\"\n\nPackage ora implements an Oracle database driver.\n\n### Golang Oracle Database Driver ###\n\n#### TL;DR; just use it ####\n\n    import (\n    \t\"database/sql\"\n\n    \t_ \"gopkg.in/rana/ora.v4\"\n    )\n\n    func main() {\n    \tdb, err := sql.Open(\"ora\", \"user/passw@host:port/sid\")\n    \tdefer db.Close()\n\n    \t// Set timeout (Go 1.8)\n    \tctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n    \t// Set prefetch count (Go 1.8)\n    \tctx = ora.WithStmtCfg(ctx, ora.Cfg().StmtCfg.SetPrefetchCount(50000))\n    \trows, err := db.QueryContext(ctx, \"SELECT * FROM user_objects\")\n    \tdefer rows.Close()\n    }\n\nCall stored procedure with OUT parameters:\n\n    import (\n    \t\"gopkg.in/rana/ora.v4\"\n    )\n\n    func main() {\n    \tenv, srv, ses, err := ora.NewEnvSrvSes(\"user/passw@host:port/sid\")\n    \tif err != nil {\n    \t\tlog.Fatal(err)\n    \t}\n    \tdefer env.Close()\n    \tdefer srv.Close()\n    \tdefer ses.Close()\n\n    \tvar user string\n    \tif _, err = ses.PrepAndExe(\"BEGIN :1 := SYS_CONTEXT('USERENV', :2); END;\", \u0026res, \"SESSION_USER\"); err != nil {\n    \t\tlog.Fatal(err)\n    \t}\n    \tlog.Printf(\"user: %q\", user)\n    }\n\n## Key Features\n\n### Core Capabilities\n- Full implementation of Go's `database/sql/driver` interface\n- Support for all Oracle built-in data types including NUMBER, BINARY_DOUBLE, BINARY_FLOAT, DATE, TIMESTAMP, CHAR, VARCHAR2, CLOB, BLOB, etc.\n- Advanced Oracle-specific features like SYS_REFCURSOR, INTERVAL types, RAW types, LOBs, and BFILEs\n- Connection pooling with different pool types (Session Pool, Connection Pool, DRCP)\n- Support for SYSDBA and SYSOPER connections\n- Comprehensive transaction management\n- Statement preparation and execution\n- Result set handling with prefetch capabilities\n\n### Performance Features\n- Configurable prefetch row count and memory size for optimized data retrieval\n- Connection pooling with automatic resource management\n- Support for batch operations and array binding\n- Efficient memory management through sync.Pool usage\n- Tunable LOB and LONG buffer sizes\n\n### Developer-Friendly Features\n- Extensive configuration options at driver, environment, server, session and statement levels\n- Support for nullable types (Int64, Float64, String, etc.)\n- Flexible parameter binding\n- Rich error handling with detailed Oracle error information\n- Built-in logging capabilities with multiple logger implementations\n- ORM-like convenience methods for INSERTs, UPDATEs, and SELECTs\n\n### Type System\n- Rich set of Go type mappings for Oracle types\n- Support for pointers, slices, and nullable types\n- Custom type conversion configuration\n- Special handling for booleans (mapped to single-byte chars)\n\n## Technical Highlights\n\n### Architecture\n- Layered design with Environment → Server → Session → Statement hierarchy\n- Uses Oracle Call Interface (OCI) C libraries through cgo\n- Thread-safe implementation with proper locking mechanisms\n- Resource cleanup through careful handle management\n\n### Advanced Features\n- Support for Oracle session pools (OCI_SPOOL)\n- Connection pooling (OCI_CPOOL) \n- Database Resident Connection Pooling (DRCP)\n- Character set handling with AL32UTF8 support\n- Statement caching capabilities\n- Array DML operations\n\n### Quality Assurance\n- Comprehensive test suite\n- Production-proven with Oracle 11g and 12c\n- Memory leak prevention through proper resource management\n- Error recovery mechanisms\n\n## Notable Implementation Details\n- Written in Go with C (OCI) bindings\n- Uses sync.Pool for efficient object reuse\n- Implements connection timeouts and context cancellation\n- Proper cleanup of Oracle handles and resources\n- Thread-safe design with atomic operations and mutex protection\n\nHighlights:\n- Go programming and best practices\n- Oracle database internals and OCI\n- High-performance database driver implementation\n- Resource management and memory optimization\n- Thread-safe concurrent programming\n- Complex system architecture design\n- C integration through cgo\n- Production-grade error handling\n\nThis driver stands out for its combination of performance features, extensive Oracle support, and developer-friendly interface, making it suitable for both simple applications and complex enterprise systems requiring advanced Oracle functionality.\n\n### Background\n\nAn Oracle database may be accessed through the\n[database/sql](http://golang.org/pkg/database/sql) package or through the ora\npackage directly. database/sql offers connection pooling, thread safety, a\nconsistent API to multiple database technologies and a common set of Go types.\nThe ora package offers additional features including pointers, slices, nullable\ntypes, numerics of various sizes, Oracle-specific types, Go return type\nconfiguration, and Oracle abstractions such as environment, server and session.\n\nThe ora package is written with the Oracle Call Interface (OCI) C-language\nlibraries provided by Oracle. The OCI libraries are a standard for client\napplication communication and driver communication with Oracle databases.\n\nThe ora package has been verified to work with:\n\n* Oracle Standard 11g (11.2.0.4.0), Linux x86_64 (RHEL6)\n\n* Oracle Enterprise 12c (12.1.0.1.0), Windows 8.1 and AMD64.\n\n### ---\n\n* [Installation](https://github.com/rana/ora#installation)\n\n* [Data Types](https://github.com/rana/ora#data-types)\n\n* [SQL Placeholder Syntax](https://github.com/rana/ora#sql-placeholder-syntax)\n\n* [Working With The Sql\nPackage](https://github.com/rana/ora#working-with-the-sql-package)\n\n* [Working With The Oracle Package\nDirectly](https://github.com/rana/ora#working-with-the-oracle-package-directly)\n\n* [Logging](https://github.com/rana/ora#logging)\n\n* [Test Database Setup](https://github.com/rana/ora#test-database-setup)\n\n* [Limitations](https://github.com/rana/ora#limitations)\n\n* [License](https://github.com/rana/ora#license)\n\n* [API Reference](http://godoc.org/github.com/rana/ora#pkg-index)\n\n* [Examples](./examples)\n\n### ---\n\n\n### Installation\n\nMinimum requirements are Go 1.3 with CGO enabled, a GCC C compiler, and Oracle\n11g (11.2.0.4.0) or Oracle Instant Client (11.2.0.4.0).\n\nInstall Oracle or Oracle Instant Client.\n\nCopy the [oci8.pc](contrib/oci8.pc) from the `contrib` folder (or the one for\nyour system, maybe tailored to your specific locations) to a folder in\n`$PKG_CONFIG_PATH` or a system folder, such as\n\n    cp -aL contrib/oci8.pc /usr/local/lib/pkgconfig/oci8.pc\n\nThe ora package has no external Go dependencies and is available on GitHub and\ngopkg.in:\n\n    go get gopkg.in/rana/ora.v4\n\n*WARNING*: If you have Oracle Instant Client 11.2, you'll need to add \"-lnnz11\"\nto the list of linked libs! Otherwise, you may encounter \"undefined reference to\n`nzosSCSP_SetCertSelectionParams' \" errors. Oracle Instant Client 12.1 does not\nneed this.\n\n\n### Data Types\n\nThe ora package supports all built-in Oracle data types. The supported Oracle\nbuilt-in data types are NUMBER, BINARY_DOUBLE, BINARY_FLOAT, FLOAT, DATE,\nTIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL\nYEAR TO MONTH, INTERVAL DAY TO SECOND, CHAR, NCHAR, VARCHAR, VARCHAR2,\nNVARCHAR2, LONG, CLOB, NCLOB, BLOB, LONG RAW, RAW, ROWID and BFILE.\nSYS_REFCURSOR is also supported.\n\nOracle does not provide a built-in boolean type. Oracle provides a single-byte\ncharacter type. A common practice is to define two single-byte characters which\nrepresent true and false. The ora package adopts this approach. The oracle\npackage associates a Go bool value to a Go rune and sends and receives the rune\nto a CHAR(1 BYTE) column or CHAR(1 CHAR) column.\n\nThe default false rune is zero '0'. The default true rune is one '1'. The bool\nrune association may be configured or disabled when directly using the ora\npackage but not with the database/sql package.\n\n\n### SQL Placeholder Syntax\n\nWithin a SQL string a placeholder may be specified to indicate where a Go\nvariable is placed. The SQL placeholder is an Oracle identifier, from 1 to 30\ncharacters, prefixed with a colon (:). For example:\n\n    // example Oracle placeholder uses a colon\n    INSERT INTO T1 (C1) VALUES (:C1)\n\nPlaceholders within a SQL statement are bound by position. The actual name is\nnot used by the ora package driver e.g., placeholder names :c1, :1, or :xyz are\ntreated equally.\n\n\n### LastInsertId\n\nThe `database/sql` package provides a LastInsertId method to return the last\ninserted row's id. Oracle does not provide such functionality, but if you append\n`... RETURNING col /*LastInsertId*/` to your SQL, then it will be presented as\nLastInsertId. Note that you have to mark with a `/*LastInsertId*/` (case\ninsensitive) your `RETURNING` part, to allow ora to return the last column as\n`LastInsertId()`. That column must fit in `int64`, though!\n\n\n### Working With The Sql Package\n\nYou may access an Oracle database through the database/sql package. The\ndatabase/sql package offers a consistent API across different databases,\nconnection pooling, thread safety and a set of common Go types. database/sql\nmakes working with Oracle straight-forward.\n\nThe ora package implements interfaces in the database/sql/driver package\nenabling database/sql to communicate with an Oracle database. Using database/sql\nensures you never have to call the ora package directly.\n\nWhen using database/sql, the mapping between Go types and Oracle types may be\nchanged slightly. The database/sql package has strict expectations on Go return\ntypes. The Go-to-Oracle type mapping for database/sql is:\n\n    Go type\t\tOracle type\n\n    int64\t\tNUMBER°, BINARY_DOUBLE, BINARY_FLOAT, FLOAT\n\n    float64\t\tNUMBER¹, BINARY_DOUBLE, BINARY_FLOAT, FLOAT\n\n    time.Time\tTIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, DATE\n\n    string\t\tCHAR², NCHAR, VARCHAR, VARCHAR2, NVARCHAR2, LONG, CLOB, NCLOB\n\n    bool\t\tCHAR(1 BYTE)³, CHAR(1 CHAR)³\n\n    []byte\t\tBLOB, LONG RAW, RAW\n\n    ° A select-list column defined as an Oracle NUMBER with zero scale e.g.,\n    NUMBER(10,0) is returned as an int64. Either int64 or float64 may be inserted\n    into a NUMBER column with zero scale. float64 insertion will have its fractional\n    part truncated.\n\n    ¹ A select-list column defined as an Oracle NUMBER with a scale greater than\n    zero e.g., NUMBER(10,4) is returned as a float64. Either int64 or float64 may\n    be inserted into a NUMBER column with a scale greater than zero.\n\n    ² A select-list column defined as an Oracle CHAR with a length greater than 1\n    e.g., CHAR(2 BYTE) or CHAR(2 CHAR) is returned as a string. A Go string of any\n    length up to the column max length may be inserted into the CHAR column.\n\n    ³ The Go bool value false is mapped to the zero rune '0'. The Go bool value\n    true is mapped to the one rune '1'.\n\nThe \"ora\" driver is automatically registered for use with sql.Open, but you can\ncall ora.SetCfg to set the used configuration options including statement\nconfiguration and Rset configuration.\n\n        func init() {\n    \t\tdrvCfg := ora.Cfg()\n    \t\tdrvCfg.FalseRune = 'N'\n    \t\tdrvCfg.TrueRune = 'Y'\n    \t\tdrvCfg.TrueRune = 'Y'\n    \t\tora.SetCfg(drvCfg)\n    \t}\n\nWhen configuring the driver for use with database/sql, keep in mind that\ndatabase/sql has strict Go type-to-Oracle type mapping expectations.\n\n\n### Working With The Oracle Package Directly\n\nThe ora package allows programming with pointers, slices, nullable types,\nnumerics of various sizes, Oracle-specific types, Go return type configuration,\nand Oracle abstractions such as environment, server and session. When working\nwith the ora package directly, the API is slightly different than database/sql.\n\nWhen using the ora package directly, the mapping between Go types and Oracle\ntypes may be changed. The Go-to-Oracle type mapping for the ora package is:\n\n    Go type\t\t\t\tOracle type\n\n    int64, int32, int16, int8\tNUMBER°, BINARY_DOUBLE, BINARY_FLOAT, FLOAT\n    uint64, uint32, uint16, uint8\n    Int64, Int32, Int16, Int8\n    Uint64, Uint32, Uint16, Uint8\n    *int64, *int32, *int16, *int8\n    *uint64, *uint32, *uint16, *uint8\n    []int64, []int32, []int16, []int8\n    []uint64, []uint32, []uint16, []uint8\n    []Int64, []Int32, []Int16, []Int8\n    []Uint64, []Uint32, []Uint16, []Uint8\n\n    float64, float32\t\tNUMBER¹, BINARY_DOUBLE, BINARY_FLOAT, FLOAT\n    Float64, Float32\n    *float64, *float32\n    []float64, []float32\n    []Float64, []Float32\n\n    time.Time\t\t\tTIMESTAMP, TIMESTAMP WITH TIME ZONE,\n    Time\t\t\t\tTIMESTAMP WITH LOCAL TIME ZONE, DATE\n    *time.Time\n    []time.Time\n    []Time\n\n    string\t\t\t\tCHAR², NCHAR, VARCHAR, VARCHAR2,\n    String\t\t\t\tNVARCHAR2, LONG, CLOB, NCLOB, ROWID\n    *string\n    []string\n    []String\n\n    bool\t\t\t\tCHAR(1 BYTE)³, CHAR(1 CHAR)³\n    Bool\n    *bool\n    []bool\n    []Bool\n\n    []byte, [][]byte\tBLOB\n\n    Lob, []Lob, *Lob\tBLOB, CLOB\n\n    Raw, []Raw\t\t\tRAW, LONG RAW\n\n    IntervalYM\t\t\tINTERVAL MONTH TO YEAR\n    []IntervalYM\n\n    IntervalDS\t\t\tINTERVAL DAY TO SECOND\n    []IntervalDS\n\n    Bfile\t\t\t\tBFILE\n\n    ° A select-list column defined as an Oracle NUMBER with zero scale e.g.,\n    NUMBER(10,0) is returned as an int64 by default. Integer and floating point\n    numerics may be inserted into a NUMBER column with zero scale. Inserting a\n    floating point numeric will have its fractional part truncated.\n\n    ¹ A select-list column defined as an Oracle NUMBER with a scale greater than\n    zero e.g., NUMBER(10,4) is returned as a float64 by default. Integer and\n    floating point numerics may be inserted into a NUMBER column with a scale\n    greater than zero.\n\n    ² A select-list column defined as an Oracle CHAR with a length greater than 1\n    e.g., CHAR(2 BYTE) or CHAR(2 CHAR) is returned as a string. A Go string of any\n    length up to the column max length may be inserted into the CHAR column.\n\n    ³ The Go bool value false is mapped to the zero rune '0'. The Go bool value\n    true is mapped to the one rune '1'.\n\nAn example of using the ora package directly:\n\n    package main\n\n    import (\n    \t\"fmt\"\n    \t\"gopkg.in/rana/ora.v4\"\n    )\n\n    func main() {\n    \t// example usage of the ora package driver\n    \t// connect to a server and open a session\n    \tenv, err := ora.OpenEnv()\n    \tdefer env.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tsrvCfg := ora.SrvCfg{Dblink: \"orcl\"}\n    \tsrv, err := env.OpenSrv(\u0026srvCfg)\n    \tdefer srv.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tsesCfg := ora.SesCfg{\n    \t\tUsername: \"test\",\n    \t\tPassword: \"test\",\n    \t}\n    \tses, err := srv.OpenSes(sesCfg)\n    \tdefer ses.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n\n    \t// create table\n    \ttableName := \"t1\"\n    \tstmtTbl, err := ses.Prep(fmt.Sprintf(\"CREATE TABLE %v \"+\n    \t\t\"(C1 NUMBER(19,0) GENERATED ALWAYS AS IDENTITY \"+\n    \t\t\"(START WITH 1 INCREMENT BY 1), C2 VARCHAR2(48 CHAR))\", tableName))\n    \tdefer stmtTbl.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \trowsAffected, err := stmtTbl.Exe()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tfmt.Println(rowsAffected)\n\n    \t// begin first transaction\n    \ttx1, err := ses.StartTx()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n\n    \t// insert record\n    \tvar id uint64\n    \tstr := \"Go is expressive, concise, clean, and efficient.\"\n    \tstmtIns, err := ses.Prep(fmt.Sprintf(\n    \t\t\"INSERT INTO %v (C2) VALUES (:C2) RETURNING C1 INTO :C1\", tableName))\n    \tdefer stmtIns.Close()\n    \trowsAffected, err = stmtIns.Exe(str, \u0026id)\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tfmt.Println(rowsAffected)\n\n    \t// insert nullable String slice\n    \ta := make([]ora.String, 4)\n    \ta[0] = ora.String{Value: \"Its concurrency mechanisms make it easy to\"}\n    \ta[1] = ora.String{IsNull: true}\n    \ta[2] = ora.String{Value: \"It's a fast, statically typed, compiled\"}\n    \ta[3] = ora.String{Value: \"One of Go's key design goals is code\"}\n    \tstmtSliceIns, err := ses.Prep(fmt.Sprintf(\n    \t\t\"INSERT INTO %v (C2) VALUES (:C2)\", tableName))\n    \tdefer stmtSliceIns.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \trowsAffected, err = stmtSliceIns.Exe(a)\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tfmt.Println(rowsAffected)\n\n    \t// fetch records\n    \tstmtQry, err := ses.Prep(fmt.Sprintf(\n    \t\t\"SELECT C1, C2 FROM %v\", tableName))\n    \tdefer stmtQry.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \trset, err := stmtQry.Qry()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tfor rset.Next() {\n    \t\tfmt.Println(rset.Row[0], rset.Row[1])\n    \t}\n    \tif err := rset.Err(); err != nil {\n    \t\tpanic(err)\n    \t}\n\n    \t// commit first transaction\n    \terr = tx1.Commit()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n\n    \t// begin second transaction\n    \ttx2, err := ses.StartTx()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \t// insert null String\n    \tnullableStr := ora.String{IsNull: true}\n    \tstmtTrans, err := ses.Prep(fmt.Sprintf(\n    \t\t\"INSERT INTO %v (C2) VALUES (:C2)\", tableName))\n    \tdefer stmtTrans.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \trowsAffected, err = stmtTrans.Exe(nullableStr)\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tfmt.Println(rowsAffected)\n    \t// rollback second transaction\n    \terr = tx2.Rollback()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n\n    \t// fetch and specify return type\n    \tstmtCount, err := ses.Prep(fmt.Sprintf(\n    \t\t\"SELECT COUNT(C1) FROM %v WHERE C2 IS NULL\", tableName), ora.U8)\n    \tdefer stmtCount.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \trset, err = stmtCount.Qry()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \trow := rset.NextRow()\n    \tif row != nil {\n    \t\tfmt.Println(row[0])\n    \t}\n    \tif err := rset.Err(); err != nil {\n    \t\tpanic(err)\n    \t}\n\n    \t// create stored procedure with sys_refcursor\n    \tstmtProcCreate, err := ses.Prep(fmt.Sprintf(\n    \t\t\"CREATE OR REPLACE PROCEDURE PROC1(P1 OUT SYS_REFCURSOR) AS BEGIN \"+\n    \t\t\t\"OPEN P1 FOR SELECT C1, C2 FROM %v WHERE C1 \u003e 2 ORDER BY C1; \"+\n    \t\t\t\"END PROC1;\",\n    \t\ttableName))\n    \tdefer stmtProcCreate.Close()\n    \trowsAffected, err = stmtProcCreate.Exe()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n\n    \t// call stored procedure\n    \t// pass *Rset to Exe to receive the results of a sys_refcursor\n    \tstmtProcCall, err := ses.Prep(\"CALL PROC1(:1)\")\n    \tdefer stmtProcCall.Close()\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tprocRset := \u0026ora.Rset{}\n    \trowsAffected, err = stmtProcCall.Exe(procRset)\n    \tif err != nil {\n    \t\tpanic(err)\n    \t}\n    \tif procRset.IsOpen() {\n    \t\tfor procRset.Next() {\n    \t\t\tfmt.Println(procRset.Row[0], procRset.Row[1])\n    \t\t}\n    \t\tif err := procRset.Err(); err != nil {\n    \t\t\tpanic(err)\n    \t\t}\n    \t\tfmt.Println(procRset.Len())\n    \t}\n\n    \t// Output:\n    \t// 0\n    \t// 1\n    \t// 4\n    \t// 1 Go is expressive, concise, clean, and efficient.\n    \t// 2 Its concurrency mechanisms make it easy to\n    \t// 3\n    \t// 4 It's a fast, statically typed, compiled\n    \t// 5 One of Go's key design goals is code\n    \t// 1\n    \t// 1\n    \t// 3\n    \t// 4 It's a fast, statically typed, compiled\n    \t// 5 One of Go's key design goals is code\n    \t// 3\n    }\n\nPointers may be used to capture out-bound values from a SQL statement such as an\ninsert or stored procedure call. For example, a numeric pointer captures an\nidentity value:\n\n    // given:\n    // CREATE TABLE T1 (\n    // C1 NUMBER(19,0) GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),\n    // C2 VARCHAR2(48 CHAR))\n    var id int64\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C2) VALUES ('GO') RETURNING C1 INTO :C1\")\n    stmt.Exe(\u0026id)\n\nA string pointer captures an out parameter from a stored procedure:\n\n    // given:\n    // CREATE OR REPLACE PROCEDURE PROC1 (P1 OUT VARCHAR2) AS BEGIN P1 := 'GO'; END PROC1;\n    var str string\n    stmt, err = ses.Prep(\"CALL PROC1(:1)\")\n    stmt.Exe(\u0026str)\n\nSlices may be used to insert multiple records with a single insert statement:\n\n    // insert one million rows with single insert statement\n    // given: CREATE TABLE T1 (C1 NUMBER)\n    values := make([]int64, 1000000)\n    for n, _ := range values {\n    \tvalues[n] = int64(n)\n    }\n    rowsAffected, err := ses.PrepAndExe(\"INSERT INTO T1 (C1) VALUES (:C1)\", values)\n\nThe ora package provides nullable Go types to support DML operations such as\ninsert and select. The nullable Go types provided by the ora package are Int64,\nInt32, Int16, Int8, Uint64, Uint32, Uint16, Uint8, Float64, Float32, Time,\nIntervalYM, IntervalDS, String, Bool, Binary and Bfile. For example, you may\ninsert nullable Strings and select nullable Strings:\n\n    // insert String slice\n    // given: CREATE TABLE T1 (C1 VARCHAR2(48 CHAR))\n    a := make([]ora.String, 5)\n    a[0] = ora.String{Value: \"Go is expressive, concise, clean, and efficient.\"}\n    a[1] = ora.String{Value: \"Its concurrency mechanisms make it easy to\"}\n    a[2] = ora.String{IsNull: true}\n    a[3] = ora.String{Value: \"It's a fast, statically typed, compiled\"}\n    a[4] = ora.String{Value: \"One of Go's key design goals is code\"}\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (:C1)\")\n    stmt.Exe(a)\n\n    // Specify OraS to Prep method to return ora.String values\n    // fetch records\n    stmt, err = ses.Prep(\"SELECT C1 FROM T1\", OraS)\n    rset, err := stmt.Qry()\n    for rset.Next() {\n    \tfmt.Println(rset.Row[0])\n    }\n\nThe `Stmt.Prep` method is variadic accepting zero or more `GoColumnType` which\ndefine a Go return type for a select-list column. For example, a Prep call can\nbe configured to return an int64 and a nullable Int64 from the same column:\n\n    // given: create table t1 (c1 number)\n    stmt, err = ses.Prep(\"SELECT C1, C1 FROM T1\", ora.I64, ora.OraI64)\n    rset, err := stmt.Qry()\n    for rset.Next() {\n    \tfmt.Println(rset.Row[0], rset.Row[1])\n    }\n\nGo numerics of various sizes are supported in DML operations. The ora package\nsupports int64, int32, int16, int8, uint64, uint32, uint16, uint8, float64 and\nfloat32. For example, you may insert a uint16 and select numerics of various\nsizes:\n\n    // insert uint16\n    // given: create table t1 (c1 number)\n    value := uint16(9)\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (:C1)\")\n    stmt.Exe(value)\n\n    // select numerics of various sizes from the same column\n    stmt, err = ses.Prep(\n    \t\"SELECT C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, FROM T1\",\n    \tora.I64, ora.I32, ora.I16, ora.I8, ora.U64, ora.U32, ora.U16, ora.U8,\n    \tora.F64, ora.F32)\n    rset, err := stmt.Qry()\n    row := rset.NextRow()\n\nIf a non-nullable type is defined for a nullable column returning null, the Go\ntype's zero value is returned.\n\nGoColumnTypes defined by the ora package are:\n\n    Go type\t\tGoColumnType\n\n    int64\t\tI64\n\n    int32\t\tI32\n\n    int16\t\tI16\n\n    int8\t\tI8\n\n    uint64\t\tU64\n\n    uint32\t\tU32\n\n    uint16\t\tU16\n\n    uint8\t\tU8\n\n    float64\t\tF64\n\n    Int64\t\tOraI64\n\n    Int32\t\tOraI32\n\n    Int16\t\tOraI16\n\n    Int8\t\tOraI8\n\n    Uint64\t\tOraU64\n\n    Uint32\t\tOraU32\n\n    Uint16\t\tOraU16\n\n    Uint8\t\tOraU8\n\n    Float64\t\tOraF64\n\n    Float32\t\tOraF32\n\n    time.Time\tT\n\n    Time\t\tOraT\n\n    string\t\tS\n\n    String\t\tOraS\n\n    bool\t\tB\n\n    Bool\t\tOraB\n\n    []byte\t\tBin\n\n    Raw\t\t\tBin\n\n    Lob°\t\tBin or S\n\n    default¹\tD\n\n    ° Lob will return binary data if the Oracle column is a BLOB; otherwise, Lob\n      will return a string if the Oracle column is a CLOB.\n\n    ¹ D represents a default mapping between a select-list column and a Go type.\n    The default mapping is defined in RsetCfg.\n\nWhen Stmt.Prep doesn't receive a GoColumnType, or receives an incorrect\nGoColumnType, the default value defined in RsetCfg is used.\n\nEnvCfg, SrvCfg, SesCfg, StmtCfg and RsetCfg are the main configuration structs.\nEnvCfg configures aspects of an Env. SrvCfg configures aspects of a Srv. SesCfg\nconfigures aspects of a Ses. StmtCfg configures aspects of a Stmt. RsetCfg\nconfigures aspects of Rset. StmtCfg and RsetCfg have the most options to\nconfigure. RsetCfg defines the default mapping between an Oracle select-list\ncolumn and a Go type. StmtCfg may be set in an EnvCfg, SrvCfg, SesCfg and\nStmtCfg. RsetCfg may be set in a Stmt.\n\nEnvCfg.StmtCfg, SrvCfg.StmtCfg, SesCfg.StmtCfg may optionally be specified to\nconfigure a statement. If StmtCfg isn't specified default values are applied.\nEnvCfg.StmtCfg, SrvCfg.StmtCfg, SesCfg.StmtCfg cascade to new descendent\nstructs. When ora.OpenEnv() is called a specified EnvCfg is used or a default\nEnvCfg is created. Creating a Srv with env.OpenSrv() will use SrvCfg.StmtCfg if\nit is specified; otherwise, EnvCfg.StmtCfg is copied by value to SrvCfg.StmtCfg.\nCreating a Ses with srv.OpenSes() will use SesCfg.StmtCfg if it is specified;\notherwise, SrvCfg.StmtCfg is copied by value to SesCfg.StmtCfg. Creating a Stmt\nwith ses.Prep() will use SesCfg.StmtCfg if it is specified; otherwise, a new\nStmtCfg with default values is set on the Stmt. Call Stmt.Cfg() to change a\nStmt's configuration.\n\nAn Env may contain multiple Srv. A Srv may contain multiple Ses. A Ses may\ncontain multiple Stmt. A Stmt may contain multiple Rset.\n\n    // StmtCfg cascades to descendent structs\n    // EnvCfg -\u003e SrvCfg -\u003e SesCfg -\u003e StmtCfg -\u003e RsetCfg\n\nSetting a RsetCfg on a StmtCfg does not cascade through descendent structs.\nConfiguration of Stmt.Cfg takes effect prior to calls to Stmt.Exe and Stmt.Qry;\nconsequently, any updates to Stmt.Cfg after a call to Stmt.Exe or Stmt.Qry are\nnot observed.\n\nOne configuration scenario may be to set a server's select statements to return\nnullable Go types by default:\n\n    sc := \u0026ora.SrvCfg{Dblink: \"orcl\"}\n    sc.Dblink = \"orcl\"\n    cfg := NewStmtCfg().\n    \tSetNumberInt(ora.OraI64).\n    \tSetNumberFloat(ora.OraF64).\n    \tSetBinaryDouble(ora.OraF64).\n    \tSetBinaryFloat(ora.OraF64).\n    \tSetFloat(ora.OraF64).\n    \tSetDate(ora.OraT).\n    \tSetTimestamp(ora.OraT).\n    \tSetTimestampTz(ora.OraT).\n    \tSetTimestampLtz(ora.OraT).\n    \tSetChar1(ora.OraS).\n    \tSetVarchar(ora.OraS).\n    \tSetLong(ora.OraS).\n    \tSetClob(ora.OraS).\n    \tSetBlob(ora.OraBin).\n    \tSetRaw(ora.OraBin).\n    \tSetLongRaw(ora.OraBin).\n    \tSetFetchLen(100).\n    \tSetLOBFetchLen(100)\n    sc.StmtCfg = cfg\n    srv, err := env.OpenSrv(sc)\n    // any new SesCfg.StmtCfg, StmtCfg.Cfg will receive this StmtCfg\n    // any new Rset will receive the StmtCfg.Rset configuration\n\nAnother scenario may be to configure the runes mapped to bool values:\n\n    // update StmtCfg to change the FalseRune and TrueRune inserted into the database\n    // given: CREATE TABLE T1 (C1 CHAR(1 BYTE))\n\n    stmt.Cfg().Char1(ora.OraB)\n\n    // insert 'false' record\n    var falseValue bool = false\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (:C1)\")\n    stmt.Cfg().FalseRune = 'N'\n    stmt.Exe(falseValue)\n\n    // insert 'true' record\n    var trueValue bool = true\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (:C1)\")\n    stmt.Cfg().TrueRune = 'Y'\n    stmt.Exe(trueValue)\n\n    // update RsetCfg to change the TrueRune\n    // used to translate an Oracle char to a Go bool\n    // fetch inserted records\n    stmt, err = ses.Prep(\"SELECT C1 FROM T1\")\n    stmt.Cfg().Rset.TrueRune = 'Y'\n    rset, err := stmt.Qry()\n    for rset.Next() {\n    \tfmt.Println(rset.Row[0])\n    }\n\nOracle-specific types offered by the ora package are ora.Rset, ora.IntervalYM,\nora.IntervalDS, ora.Raw, ora.Lob and ora.Bfile. ora.Rset represents an Oracle\nSYS_REFCURSOR. ora.IntervalYM represents an Oracle INTERVAL YEAR TO MONTH.\nora.IntervalDS represents an Oracle INTERVAL DAY TO SECOND. ora.Raw represents\nan Oracle RAW or LONG RAW. ora.Lob may represent an Oracle BLOB or Oracle CLOB.\nAnd ora.Bfile represents an Oracle BFILE. ROWID columns are returned as strings\nand don't have a unique Go type.\n\n#### LOBs\n\nThe default for SELECTing [BC]LOB columns is a safe Bin or S, which means all\nthe contents of the LOB is slurped into memory and returned as a []byte or\nstring.\n\nThe DefaultLOBFetchLen says LOBs are prefetched only a minimal way, to minimize\nextra memory usage - you can override this using\n`stmt.SetCfg(stmt.Cfg().SetLOBFetchLen(100))`.\n\nIf you want more control, you can use ora.L in Prep, Qry or\n`ses.SetCfg(ses.Cfg().SetBlob(ora.L))`. But keep in mind that Oracle restricts\nthe use of LOBs: it is forbidden to do ANYTHING while reading the LOB! No\nanother query, no exec, no close of the Rset - even *advance* to the next record\nin the result set is forbidden!\n\nFailing to adhere these rules results in \"Invalid handle\" and ORA-03127 errors.\n\nYou cannot start reading another LOB till you haven't finished reading the\nprevious LOB, not even in the same row! Failing this results in ORA-24804!\n\nFor examples, see [z_lob_test.go](z_lob_test.go).\n\n#### Rset\n\nRset is used to obtain Go values from a SQL select statement. Methods Rset.Next,\nRset.NextRow, and Rset.Len are available. Fields Rset.Row, Rset.Err, Rset.Index,\nand Rset.ColumnNames are also available. The Next method attempts to load data\nfrom an Oracle buffer into Row, returning true when successful. When no data is\navailable, or if an error occurs, Next returns false setting Row to nil. Any\nerror in Next is assigned to Err. Calling Next increments Index and method Len\nreturns the total number of rows processed. The NextRow method is convenient for\nreturning a single row. NextRow calls Next and returns Row. ColumnNames returns\nthe names of columns defined by the SQL select statement.\n\nRset has two usages. Rset may be returned from Stmt.Qry when prepared with a SQL\nselect statement:\n\n    // given: CREATE TABLE T1 (C1 NUMBER, C2, CHAR(1 BYTE), C3 VARCHAR2(48 CHAR))\n    stmt, err = ses.Prep(\"SELECT C1, C2, C3 FROM T1\")\n    rset, err := stmt.Qry()\n    for rset.Next() {\n    \tfmt.Println(rset.Index, rset.Row[0], rset.Row[1], rset.Row[2])\n    }\n\nOr, *Rset may be passed to Stmt.Exe when prepared with a stored procedure\naccepting an OUT SYS_REFCURSOR parameter:\n\n    // given:\n    // CREATE TABLE T1 (C1 NUMBER, C2 VARCHAR2(48 CHAR))\n    // CREATE OR REPLACE PROCEDURE PROC1(P1 OUT SYS_REFCURSOR) AS\n    // BEGIN OPEN P1 FOR SELECT C1, C2 FROM T1 ORDER BY C1; END PROC1;\n    stmt, err = ses.Prep(\"CALL PROC1(:1)\")\n    rset := \u0026ora.Rset{}\n    stmt.Exe(rset)\n    if rset.IsOpen() {\n    \tfor rset.Next() {\n    \t\tfmt.Println(rset.Row[0], rset.Row[1])\n    \t}\n    }\n\nStored procedures with multiple OUT SYS_REFCURSOR parameters enable a single Exe\ncall to obtain multiple Rsets:\n\n    // given:\n    // CREATE TABLE T1 (C1 NUMBER, C2 VARCHAR2(48 CHAR))\n    // CREATE OR REPLACE PROCEDURE PROC1(P1 OUT SYS_REFCURSOR, P2 OUT SYS_REFCURSOR) AS\n    // BEGIN OPEN P1 FOR SELECT C1 FROM T1 ORDER BY C1; OPEN P2 FOR SELECT C2 FROM T1 ORDER BY C2;\n    // END PROC1;\n    stmt, err = ses.Prep(\"CALL PROC1(:1, :2)\")\n    rset1 := \u0026ora.Rset{}\n    rset2 := \u0026ora.Rset{}\n    stmt.Exe(rset1, rset2)\n    // read from first cursor\n    if rset1.IsOpen() {\n    \tfor rset1.Next() {\n    \t\tfmt.Println(rset1.Row[0])\n    \t}\n    }\n    // read from second cursor\n    if rset2.IsOpen() {\n    \tfor rset2.Next() {\n    \t\tfmt.Println(rset2.Row[0])\n    \t}\n    }\n\nThe types of values assigned to Row may be configured in StmtCfg.Rset. For\nconfiguration to take effect, assign StmtCfg.Rset prior to calling Stmt.Qry or\nStmt.Exe.\n\nRset prefetching may be controlled by StmtCfg.PrefetchRowCount and\nStmtCfg.PrefetchMemorySize. PrefetchRowCount works in coordination with\nPrefetchMemorySize. When PrefetchRowCount is set to zero only PrefetchMemorySize\nis used; otherwise, the minimum of PrefetchRowCount and PrefetchMemorySize is\nused. The default uses a PrefetchMemorySize of 134MB.\n\nOpening and closing Rsets is managed internally. Rset does not have an Open\nmethod or Close method.\n\nIntervalYM may be be inserted and selected:\n\n    // insert IntervalYM slice\n    // given: CREATE TABLE T1 (C1 INTERVAL YEAR TO MONTH)\n    a := make([]ora.IntervalYM, 5)\n    a[0] = ora.IntervalYM{Year: 1, Month: 1}\n    a[1] = ora.IntervalYM{Year: 99, Month: 9}\n    a[2] = ora.IntervalYM{IsNull: true}\n    a[3] = ora.IntervalYM{Year: -1, Month: -1}\n    a[4] = ora.IntervalYM{Year: -99, Month: -9}\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (:C1)\")\n    stmt.Exe(a)\n\n    // query IntervalYM\n    stmt, err = ses.Prep(\"SELECT C1 FROM T1\")\n    rset, err := stmt.Qry()\n    for rset.Next() {\n    \tfmt.Println(rset.Row[0])\n    }\n\nIntervalDS may be be inserted and selected:\n\n    // insert IntervalDS slice\n    // given: CREATE TABLE T1 (C1 INTERVAL DAY TO SECOND)\n    a := make([]ora.IntervalDS, 5)\n    a[0] = ora.IntervalDS{Day: 1, Hour: 1, Minute: 1, Second: 1, Nanosecond: 123456789}\n    a[1] = ora.IntervalDS{Day: 59, Hour: 59, Minute: 59, Second: 59, Nanosecond: 123456789}\n    a[2] = ora.IntervalDS{IsNull: true}\n    a[3] = ora.IntervalDS{Day: -1, Hour: -1, Minute: -1, Second: -1, Nanosecond: -123456789}\n    a[4] = ora.IntervalDS{Day: -59, Hour: -59, Minute: -59, Second: -59, Nanosecond: -123456789}\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (:C1)\")\n    stmt.Exe(a)\n\n    // query IntervalDS\n    stmt, err = ses.Prep(\"SELECT C1 FROM T1\")\n    rset, err := stmt.Qry()\n    for rset.Next() {\n    \tfmt.Println(rset.Row[0])\n    }\n\nTransactions on an Oracle server are supported. DML statements auto-commit\nunless a transaction has started:\n\n    // given: CREATE TABLE T1 (C1 NUMBER)\n\n    // rollback\n    tx, err := ses.StartTx()\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (3)\")\n    stmt.Exe()\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (5)\")\n    stmt.Exe()\n    tx.Rollback()\n\n    // commit\n    tx, err = ses.StartTx()\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (7)\")\n    stmt.Exe()\n    stmt, err = ses.Prep(\"INSERT INTO T1 (C1) VALUES (9)\")\n    stmt.Exe()\n    tx.Commit()\n\n    // fetch records\n    stmt, err = ses.Prep(\"SELECT C1 FROM T1\")\n    rset, err := stmt.Qry()\n    for rset.Next() {\n    \tfmt.Println(rset.Row[0])\n    }\n\nSes.PrepAndExe, Ses.PrepAndQry, Ses.Ins, Ses.Upd, and Ses.Sel are convenient\none-line methods.\n\nSes.PrepAndExe offers a convenient one-line call to Ses.Prep and Stmt.Exe.\n\n    rowsAffected, err := ses.PrepAndExe(\"CREATE TABLE T1 (C1 NUMBER)\")\n\nSes.PrepAndQry offers a convenient one-line call to Ses.Prep and Stmt.Qry.\n\n    rset, err := ses.PrepAndQry(\"SELECT CURRENT_TIMESTAMP FROM DUAL\")\n\nSes.Ins composes, prepares and executes a sql INSERT statement. Ses.Ins is\nuseful when you have to create and maintain a simple INSERT statement with a\nlong list of columns. As table columns are added and dropped over the lifetime\nof a table Ses.Ins is easy to read and revise.\n\n    err = ses.Ins(\"T1\",\n    \t\"C2\", e.C2,\n    \t\"C3\", e.C3,\n    \t\"C4\", e.C4,\n    \t\"C5\", e.C5,\n    \t\"C6\", e.C6,\n    \t\"C7\", e.C7,\n    \t\"C8\", e.C8,\n    \t\"C9\", e.C9,\n    \t\"C10\", e.C10,\n    \t\"C11\", e.C11,\n    \t\"C12\", e.C12,\n    \t\"C13\", e.C13,\n    \t\"C14\", e.C14,\n    \t\"C15\", e.C15,\n    \t\"C16\", e.C16,\n    \t\"C17\", e.C17,\n    \t\"C18\", e.C18,\n    \t\"C19\", e.C19,\n    \t\"C20\", e.C20,\n    \t\"C21\", e.C21,\n    \t\"C1\", \u0026e.C1)\n\nSes.Upd composes, prepares and executes a sql UPDATE statement. Ses.Upd is\nuseful when you have to create and maintain a simple UPDATE statement with a\nlong list of columns. As table columns are added and dropped over the lifetime\nof a table Ses.Upd is easy to read and revise.\n\n    err = ses.Upd(\"T1\",\n    \t\"C2\", e.C2*2,\n    \t\"C3\", e.C3*2,\n    \t\"C4\", e.C4*2,\n    \t\"C5\", e.C5*2,\n    \t\"C6\", e.C6*2,\n    \t\"C7\", e.C7*2,\n    \t\"C8\", e.C8*2,\n    \t\"C9\", e.C9*2,\n    \t\"C10\", e.C10*2,\n    \t\"C11\", e.C11*2,\n    \t\"C12\", e.C12*2,\n    \t\"C13\", e.C13*2,\n    \t\"C14\", e.C14*2,\n    \t\"C15\", e.C15*2,\n    \t\"C16\", e.C16*2,\n    \t\"C17\", e.C17*2,\n    \t\"C18\", e.C18*2,\n    \t\"C19\", e.C19*2,\n    \t\"C20\", e.C20*2,\n    \t\"C21\", e.C21*2,\n    \t\"C1\", e.C1)\n\nSes.Sel composes, prepares and queries a sql SELECT statement. Ses.Sel is useful\nwhen you have to create and maintain a simple SELECT statement with a long list\nof columns that have non-default GoColumnTypes. As table columns are added and\ndropped over the lifetime of a table Ses.Sel is easy to read and revise.\n\n    rset, err := ses.Sel(\"T1\",\n    \t\"C1\", ora.U64,\n    \t\"C2\", ora.F64,\n    \t\"C3\", ora.I8,\n    \t\"C4\", ora.I16,\n    \t\"C5\", ora.I32,\n    \t\"C6\", ora.I64,\n    \t\"C7\", ora.U8,\n    \t\"C8\", ora.U16,\n    \t\"C9\", ora.U32,\n    \t\"C10\", ora.U64,\n    \t\"C11\", ora.F32,\n    \t\"C12\", ora.F64,\n    \t\"C13\", ora.I8,\n    \t\"C14\", ora.I16,\n    \t\"C15\", ora.I32,\n    \t\"C16\", ora.I64,\n    \t\"C17\", ora.U8,\n    \t\"C18\", ora.U16,\n    \t\"C19\", ora.U32,\n    \t\"C20\", ora.U64,\n    \t\"C21\", ora.F32)\n\nThe Ses.Ping method checks whether the client's connection to an Oracle server\nis valid. A call to Ping requires an open Ses. Ping will return a nil error when\nthe connection is fine:\n\n    // open a session before calling Ping\n    ses, _ := srv.OpenSes(\"username\", \"password\")\n    err := ses.Ping()\n    if err == nil {\n    \tfmt.Println(\"Ping successful\")\n    }\n\nThe Srv.Version method is available to obtain the Oracle server version. A call\nto Version requires an open Ses:\n\n    // open a session before calling Version\n    ses, err := srv.OpenSes(\"username\", \"password\")\n    version, err := srv.Version()\n    if version != \"\" \u0026\u0026 err == nil {\n    \tfmt.Println(\"Received version from server\")\n    }\n\nFurther code examples are available in the [example\nfile](https://github.com/rana/ora/blob/master/z_example_test.go), test files and\n[samples folder](https://github.com/rana/ora/tree/master/samples).\n\n\n### Logging\n\nThe ora package provides a simple ora.Logger interface for logging. Logging is\ndisabled by default. Specify one of three optional built-in logging packages to\nenable logging; or, use your own logging package.\n\nora.Cfg().Log offers various options to enable or disable logging of specific\nora driver methods. For example:\n\n    // enable logging of the Rset.Next method\n    ora.Cfg().Log.Rset.Next = true\n\nTo use the standard Go log package:\n\n    import (\n    \t\"gopkg.in/rana/ora.v4\"\n    \t\"gopkg.in/rana/ora.v4/lg\"\n    )\n\n    func main() {\n    \t// use an optional log package for ora logging\n    \tora.Cfg().Log.Logger = lg.Log\n    }\n\nwhich produces a sample log of:\n\n    ORA I 2015/05/23 16:54:44.615462 drv.go:411: OpenEnv 1\n    ORA I 2015/05/23 16:54:44.626443 drv.go:411: OpenEnv 2\n    ORA I 2015/05/23 16:54:44.627465 env.go:115: E2] OpenSrv (dbname orcl)\n    ORA I 2015/05/23 16:54:44.643449 env.go:150: E2] OpenSrv (srvId 1)\n    ORA I 2015/05/23 16:54:44.643449 srv.go:113: E2S1] OpenSes (username test)\n    ORA I 2015/05/23 16:54:44.665451 ses.go:163: E2S1S1] Prep: SELECT CURRENT_TIMESTAMP FROM DUAL\n    ORA I 2015/05/23 16:54:44.666451 rset.go:205: E2S1S1S1R0] open\n    ORA I 2015/05/23 16:54:44.666451 ses.go:74: E2S1S1] Close\n    ORA I 2015/05/23 16:54:44.666451 stmt.go:78: E2S1S1S1] Close\n    ORA I 2015/05/23 16:54:44.666451 rset.go:57: E2S1S1S1R0] close\n    ORA I 2015/05/23 16:54:44.666451 srv.go:63: E2S1] Close\n    ORA I 2015/05/23 16:54:44.667451 env.go:68: E2] Close\n\nMessages are prefixed with 'ORA I' for information or 'ORA E' for an error. The\nlog package is configured to write to os.Stderr by default. Use the ora/lg.Std\ntype to configure an alternative io.Writer.\n\nTo use the glog package:\n\n    import (\n    \t\"flag\"\n    \t\"gopkg.in/rana/ora.v4\"\n    \t\"gopkg.in/rana/ora.v4/glg\"\n    )\n\n    func main() {\n\n    \t// parse flags for glog (required)\n    \t// consider specifying cmd line arg -alsologtostderr=true\n    \tflag.Parse()\n\n    \t// use the optional glog package for ora logging\n    \tcfg := ora.Cfg()\n    \tcfg.Log.Logger = glg.Log\n    \tora.SetCfg(cfg)\n    }\n\nwhich produces a sample log of:\n\n    I0523 17:31:41.702365   97708 drv.go:411] OpenEnv 1\n    I0523 17:31:41.728377   97708 drv.go:411] OpenEnv 2\n    I0523 17:31:41.728377   97708 env.go:115] E2] OpenSrv (dbname orcl)\n    I0523 17:31:41.741390   97708 env.go:150] E2] OpenSrv (srvId 1)\n    I0523 17:31:41.741390   97708 srv.go:113] E2S1] OpenSes (username test)\n    I0523 17:31:41.762366   97708 ses.go:163] E2S1S1] Prep: SELECT CURRENT_TIMESTAMP FROM DUAL\n    I0523 17:31:41.762366   97708 rset.go:205] E2S1S1S1R0] open\n    I0523 17:31:41.762366   97708 ses.go:74] E2S1S1] Close\n    I0523 17:31:41.762366   97708 stmt.go:78] E2S1S1S1] Close\n    I0523 17:31:41.762366   97708 rset.go:57] E2S1S1S1R0] close\n    I0523 17:31:41.763365   97708 srv.go:63] E2S1] Close\n    I0523 17:31:41.763365   97708 env.go:68] E2] Close\n\nTo use the log15 package:\n\n    import (\n    \t\"gopkg.in/rana/ora.v4\"\n    \t\"gopkg.in/rana/ora.v4/lg15\"\n    )\n    func main() {\n    \t// use the optional log15 package for ora logging\n    \tcfg := ora.Cfg()\n    \tcfg.Log.Logger = lg15.Log\n    \tora.SetCfg(cfg)\n    }\n\nwhich produces a sample log of:\n\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"OpenEnv 1\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"OpenEnv 2\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2] OpenSrv (dbname orcl)\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2] OpenSrv (srvId 1)\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2S1] OpenSes (username test)\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2S1S1] Prep: SELECT CURRENT_TIMESTAMP FROM DUAL\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2S1S1S1R0] open\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2S1S1] Close\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2S1S1S1] Close\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2S1S1S1R0] close\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2S1] Close\" lib=ora\n    t=2015-05-23T17:08:32-0700 lvl=info msg=\"E2] Close\" lib=ora\n\nSee https://github.com/rana/ora/tree/master/samples/lg15/main.go for sample code\nwhich uses the log15 package.\n\n\n### Test Database Setup\n\nTests are available and require some setup. Setup varies depending on whether\nthe Oracle server is configured as a container database or non-container\ndatabase. It's simpler to setup a non-container database. An example for each\nsetup is explained.\n\nNon-container test database setup steps:\n\n    // 1. login to an Oracle server with SqlPlus as sysdba:\n    SQLPLUS / AS SYSDBA\n\n    // 2. create a file for the test database use\n    CREATE TABLESPACE test_ts NOLOGGING DATAFILE 'test.dat' SIZE 100M AUTOEXTEND ON;\n\n    // 3. create a test database\n    CREATE USER test IDENTIFIED BY test DEFAULT TABLESPACE test_ts;\n\n    // 4. grant permissions to the database\n    GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE,\n    CREATE PROCEDURE, UNLIMITED TABLESPACE TO test;\n\n    // 5. increase the number allowable open cursors\n    ALTER SYSTEM SET OPEN_CURSORS = 400 SCOPE=BOTH;\n\n    // 6. create OS environment variables\n    // specify your_database_name; varies based on installation; may be 'orcl'\n    GO_ORA_DRV_TEST_DB = your_database_name\n    GO_ORA_DRV_TEST_USERNAME = test\n    GO_ORA_DRV_TEST_PASSWORD = test\n\nContainer test database setup steps:\n\n    // 1. login to an Oracle server with SqlPlus as sysdba:\n    SQLPLUS / AS SYSDBA\n\n    // 2. create a test pluggable database and permissions\n    // you will need to change the FILE_NAME_CONVERT file paths for your database installation\n    CREATE PLUGGABLE DATABASE go_driver_test\n    ADMIN USER test IDENTIFIED BY test\n    ROLES = (DBA)\n    FILE_NAME_CONVERT = ('d:\\oracle\\data\\orcl\\pdbseed\\', 'd:\\oracle\\data\\go_driver_test\\');\n\n    // 3. modify the pluggable database settings\n    ALTER PLUGGABLE DATABASE go_driver_test OPEN;\n    ALTER SESSION SET CONTAINER = go_driver_test;\n    GRANT DBA TO test;\n\n    // 4. add new database service to the tnsnames.ora file:\n    // located on your client machine in $ORACLE_HOME\\network\\admin\\tnsnames.ora\n    GO_DRIVER_TEST =\n      (DESCRIPTION =\n        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))\n        (CONNECT_DATA =\n          (SERVER = DEDICATED)\n          (SERVICE_NAME = go_driver_test)\n        )\n      )\n\n    // 5. create OS environment variables\n    GO_ORA_DRIVER_TEST_DB = go_driver_test\n    GO_ORA_DRIVER_TEST_USERNAME = test\n    GO_ORA_DRIVER_TEST_PASSWORD = test\n\nSome helpful SQL maintenance statements:\n\n    // delete all tables in a non-container database\n    BEGIN\n    FOR c IN (SELECT table_name FROM user_tables) LOOP\n    EXECUTE IMMEDIATE ('DROP TABLE \"' || c.table_name || '\" CASCADE CONSTRAINTS');\n    END LOOP;\n    END;\n\n    // delete the non-container test database; use SqlPlus as sysdba\n    DROP USER test CASCADE;\n\nRun the tests.\n\n\n### Limitations\n\ndatabase/sql method Stmt.QueryRow is not supported.\n\nGo 1.6 introduced stricter cgo (call C from Go) rules, and introduced runtime\nchecks. This is good, as the possibility of C code corrupting Go code is almost\ncompletely eliminated, but it also means a severe call overhead grow.\n[Sometimes](https://groups.google.com/forum/#!topic/golang-nuts/ccMkPG6Bi5k)\nthis can be 22x the go 1.5.3 call time!\n\nSo if you need performance more than correctness, start your programs with\n\"GODEBUG=cgocheck=0\" environment setting.\n\n\n### License\n\nCopyright 2017 Rana Ian, Tamás Gulácsi. All rights reserved. Use of this source\ncode is governed by The MIT License found in the accompanying LICENSE file.\n\n## Usage\n\n```go\nconst (\n\t// The driver name registered with the database/sql package.\n\tName string = \"ora\"\n\n\t// The driver version sent to an Oracle server and visible in\n\t// V$SESSION_CONNECT_INFO or GV$SESSION_CONNECT_INFO.\n\tVersion string = \"v4.1.13\"\n)\n```\n\n```go\nconst (\n\tNoPool  = PoolType(0)\n\tDRCPool = PoolType(1)\n\tSPool   = PoolType(2)\n\tCPool   = PoolType(3)\n)\n```\n\n```go\nconst (\n\tDefaultPoolSize      = 4\n\tDefaultEvictDuration = time.Minute\n)\n```\n\n```go\nconst (\n\tMaxFetchLen        = 1024\n\tDefaultFetchLen    = 128\n\tDefaultLOBFetchLen = 8\n)\n```\n\n```go\nconst (\n\t// SysDefault is the default, normal session mode.\n\tSysDefault = SessionMode(iota)\n\t// SysDba is for connecting as SYSDBA.\n\tSysDba\n\t// SysOper is for connectiong as SYSOPER.\n\tSysOper\n)\n```\n\n```go\nvar Schema string\n```\nSchema may optionally be specified to prefix a table name in the sql generated\nby the ora.Ins, ora.Upd, ora.Del, and ora.Sel methods.\n\n#### func  AddTbl\n\n```go\nfunc AddTbl(v interface{}, tblName string) (err error)\n```\nAddTbl maps a table name to a struct type when a struct type name is not\nidentitcal to an Oracle table name.\n\nAddTbl is optional and used by the orm-like methods ora.Ins, ora.Upd, ora.Del,\nand ora.Sel.\n\nAddTbl may be called once during the lifetime of the driver.\n\n#### func  Del\n\n```go\nfunc Del(v interface{}, ses *Ses) (err error)\n```\nDel deletes a struct from an Oracle table returning a possible error.\n\nSpecify a struct, or struct pointer to parameter 'v' and an open Ses to\nparameter 'ses'.\n\nDel requires one struct field tagged with `db:\"pk\"`. The field tagged with\n`db:\"pk\"` is used in a sql WHERE clause.\n\nBy default, Del generates and executes a sql DELETE statement based on the\nstruct name and one exported field name tagged with `db:\"pk\"`. A struct name is\nused for the table name and a field name is used for a column name. Prior to\ncalling Del, you may specify an alternative table name to ora.AddTbl. An\nalternative column name may be specified to the field tag `db:\"column_name\"`.\n\nSet ora.Schema to specify an optional table name prefix.\n\n#### func  DescribeQuery\n\n```go\nfunc DescribeQuery(db *sql.DB, qry string) ([]DescribedColumn, error)\n```\nDescribeQuery parses the query and returns the column types, as\nDBMS_SQL.describe_column does.\n\n#### func  GctName\n\n```go\nfunc GctName(gct GoColumnType) string\n```\n\n#### func  GetCompileErrors\n\n```go\nfunc GetCompileErrors(ses *Ses, all bool) ([]CompileError, error)\n```\nGetCompileErrors returns the slice of the errors in user_errors.\n\nIf all is false, only errors are returned; otherwise, warnings, too.\n\n#### func  Ins\n\n```go\nfunc Ins(v interface{}, ses *Ses) (err error)\n```\nIns inserts a struct into an Oracle table returning a possible error.\n\nSpecify a struct, or struct pointer to parameter 'v' and an open Ses to\nparameter 'ses'.\n\nOptional struct field tags `db:\"column_name,id,-\"` may be specified to control\nhow the sql INSERT statement is generated.\n\nBy default, Ins generates and executes a sql INSERT statement based on the\nstruct name and all exported field names. A struct name is used for the table\nname and a field name is used for a column name. Prior to calling Ins, you may\nspecify an alternative table name to ora.AddTbl. An alternative column name may\nbe specified to the field tag `db:\"column_name\"`. Specifying the `db:\"-\"` tag\nwill remove a field from the INSERT statement.\n\nThe optional `db:\"id\"` field tag may combined with the `db:\"pk\"` tag. A field\ntagged with `db:\"pk,id\"` indicates a field is a primary key backed by an Oracle\nidentity sequence. `db:\"pk,id\"` may be tagged to one field per struct. When\n`db:\"pk,id\"` is tagged to a field Ins generates a RETURNING clause to recevie a\ndb generated identity value. The `db:\"id\"` tag is not required and Ins will\ninsert a struct to a table without returning an identity value.\n\nSet ora.Schema to specify an optional table name prefix.\n\n#### func  NumEnv\n\n```go\nfunc NumEnv() int\n```\nNumEnv returns the number of open Oracle environments.\n\n#### func  Register\n\n```go\nfunc Register(cfg DrvCfg)\n```\nRegister used to register the ora database driver with the database/sql package,\nbut this is automatic now - so this function is deprecated, has the same effect\nas SetCfg.\n\n#### func  Sel\n\n```go\nfunc Sel(v interface{}, rt ResType, ses *Ses, where string, whereParams ...interface{}) (result interface{}, err error)\n```\nSel selects structs from an Oracle table returning a specified container of\nstructs and a possible error.\n\nSpecify a struct, or struct pointer to parameter 'v' to indicate the struct\nreturn type. Specify a ResType to parameter 'rt' to indicate the container\nreturn type. Possible container return types include a slice of structs, slice\nof struct pointers, map of structs, and map of struct pointers. Specify an open\nSes to parameter 'ses'. Optionally specify a where clause to parameter 'where'\nand where parameters to variadic parameter 'whereParams'.\n\nOptional struct field tags `db:\"column_name,omit\"` may be specified to control\nhow the sql SELECT statement is generated. Optional struct field tags\n`db:\"pk,fk1,fk2,fk3,fk4\"` control how a map return type is generated.\n\nA slice may be returned by specifying one of the 'SliceOf' ResTypes to parameter\n'rt'. Specify a SliceOfPtr to return a slice of struct pointers. Specify a\nSliceOfVal to return a slice of structs.\n\nA map may be returned by specifying one of the 'MapOf' ResTypes to parameter\n'rt'. The map key type is based on a struct field type tagged with one of\n`db:\"pk\"`, `db:\"fk1\"`, `db:\"fk2\"`, `db:\"fk3\"`, or `db:\"fk4\"` matching the\nspecified ResType suffix Pk, Fk1, Fk2, Fk3, or Fk4. The map value type is a\nstruct pointer when a 'MapOfPtr' ResType is specified. The map value type is a\nstruct when a 'MapOfVal' ResType is specified. For example, tagging a uint64\nstruct field with `db:\"pk\"` and specifying a MapOfPtrPk generates a map with a\nkey type of uint64 and a value type of struct pointer.\n\nResTypes available to specify to parameter 'rt' are MapOfPtrPk, MapOfPtrFk1,\nMapOfPtrFk2, MapOfPtrFk3, MapOfPtrFk4, MapOfValPk, MapOfValFk1, MapOfValFk2,\nMapOfValFk3, and MapOfValFk4.\n\nSet ora.Schema to specify an optional table name prefix.\n\n#### func  SetCfg\n\n```go\nfunc SetCfg(cfg DrvCfg)\n```\nSetCfg applies the specified cfg to the ora database driver.\n\n#### func  SplitDSN\n\n```go\nfunc SplitDSN(dsn string) (username, password, sid string)\n```\nSplitDSN splits the user/password@dblink string to username, password and\ndblink, to be used as SesCfg.Username, SesCfg.Password, SrvCfg.Dblink.\n\n#### func  Upd\n\n```go\nfunc Upd(v interface{}, ses *Ses) (err error)\n```\nUpd updates a struct to an Oracle table returning a possible error.\n\nSpecify a struct, or struct pointer to parameter 'v' and an open Ses to\nparameter 'ses'.\n\nUpd requires one struct field tagged with `db:\"pk\"`. The field tagged with\n`db:\"pk\"` is used in a sql WHERE clause. Optional struct field tags\n`db:\"column_name,-\"` may be specified to control how the sql UPDATE statement is\ngenerated.\n\nBy default, Upd generates and executes a sql UPDATE statement based on the\nstruct name and all exported field names. A struct name is used for the table\nname and a field name is used for a column name. Prior to calling Upd, you may\nspecify an alternative table name to ora.AddTbl. An alternative column name may\nbe specified to the field tag `db:\"column_name\"`. Specifying the `db:\"-\"` tag\nwill remove a field from the UPDATE statement.\n\nSet ora.Schema to specify an optional table name prefix.\n\n#### func  WithStmtCfg\n\n```go\nfunc WithStmtCfg(ctx context.Context, cfg StmtCfg) context.Context\n```\nWithStmtCfg returns a new context, with the given cfg that can be used to\nconfigure several parameters.\n\nWARNING: the StmtCfg must be derived from Cfg(), or NewStmtCfg(), as an empty\nStmtCfg is not usable!\n\n#### type Bfile\n\n```go\ntype Bfile struct {\n\tIsNull         bool\n\tDirectoryAlias string\n\tFilename       string\n}\n```\n\nBfile represents a nullable BFILE Oracle value.\n\n#### func (Bfile) Equals\n\n```go\nfunc (this Bfile) Equals(other Bfile) bool\n```\nEquals returns true when the receiver and specified Bfile are both null, or when\nthe receiver and specified Bfile are both not null, DirectoryAlias are equal and\nFilename are equal.\n\n#### type Bool\n\n```go\ntype Bool struct {\n\tIsNull bool\n\tValue  bool\n}\n```\n\nBool is a nullable bool.\n\n#### func (Bool) Equals\n\n```go\nfunc (this Bool) Equals(other Bool) bool\n```\nEquals returns true when the receiver and specified Bool are both null, or when\nthe receiver and specified Bool are both not null and Values are equal.\n\n#### func (Bool) MarshalJSON\n\n```go\nfunc (this Bool) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Bool) UnmarshalJSON\n\n```go\nfunc (this *Bool) UnmarshalJSON(p []byte) error\n```\n\n#### type Column\n\n```go\ntype Column struct {\n\tName      string\n\tType      C.ub2\n\tLength    uint32\n\tPrecision C.sb2\n\tScale     C.sb1\n}\n```\n\n\n#### type CompileError\n\n```go\ntype CompileError struct {\n\tOwner, Name, Type    string\n\tLine, Position, Code int64\n\tText                 string\n\tWarning              bool\n}\n```\n\nCompileError represents a compile-time error as in user_errors view.\n\n#### func (CompileError) Error\n\n```go\nfunc (ce CompileError) Error() string\n```\n\n#### type Con\n\n```go\ntype Con struct {\n}\n```\n\nCon is an Oracle connection associated with a server and session.\n\nImplements the driver.Conn interface.\n\n#### func (*Con) Begin\n\n```go\nfunc (con *Con) Begin() (driver.Tx, error)\n```\nBegin starts a transaction.\n\nBegin is a member of the driver.Conn interface.\n\n#### func (*Con) BeginTx\n\n```go\nfunc (con *Con) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error)\n```\nBeginTx starts and returns a new transaction. The provided context should be\nused to roll the transaction back if it is cancelled.\n\nIf the driver does not support setting the isolation level and one is set or if\nthere is a set isolation level but the set level is not supported, an error must\nbe returned.\n\nIf the read-only value is true to either set the read-only transaction property\nif supported or return an error if it is not supported.\n\n#### func (*Con) Close\n\n```go\nfunc (con *Con) Close() (err error)\n```\nClose ends a session and disconnects from an Oracle server.\n\nClose is a member of the driver.Conn interface.\n\n#### func (*Con) IsOpen\n\n```go\nfunc (con *Con) IsOpen() bool\n```\nIsOpen returns true when the connection to the Oracle server is open; otherwise,\nfalse.\n\nCalling Close will cause IsOpen to return false. Once closed, a connection\ncannot be re-opened. To open a new connection call Open on a driver.\n\n#### func (*Con) Name\n\n```go\nfunc (s *Con) Name(calc func() string) string\n```\nName sets the name to the result of calc once, then returns that result forever.\n(Effectively caches the result of calc().)\n\n#### func (*Con) Ping\n\n```go\nfunc (con *Con) Ping(ctx context.Context) error\n```\nPing makes a round-trip call to an Oracle server to confirm that the connection\nis active.\n\n#### func (*Con) Prepare\n\n```go\nfunc (con *Con) Prepare(query string) (driver.Stmt, error)\n```\nPrepare readies a sql string for use.\n\nPrepare is a member of the driver.Conn interface.\n\n#### func (*Con) PrepareContext\n\n```go\nfunc (con *Con) PrepareContext(ctx context.Context, query string) (driver.Stmt, error)\n```\nPrepareContext returns a prepared statement, bound to this connection. context\nis for the preparation of the statement, it must not store the context within\nthe statement itself.\n\n#### type Date\n\n```go\ntype Date struct {\n\tdate.Date\n}\n```\n\nDate is a nullable date, for low (second) precisions (OCIDate)\n\n#### type DescribedColumn\n\n```go\ntype DescribedColumn struct {\n\tColumn\n\n\tSchema                 string\n\tNullable               bool\n\tCharsetID, CharsetForm int\n}\n```\n\nDescribedColumn type for describing a column (see DescribeQuery).\n\n#### type Drv\n\n```go\ntype Drv struct {\n\tsync.RWMutex\n}\n```\n\nDrv represents an Oracle database driver.\n\nDrv is not meant to be called by user-code.\n\nDrv implements the driver.Driver interface.\n\n#### func (*Drv) Cfg\n\n```go\nfunc (drv *Drv) Cfg() DrvCfg\n```\n\n#### func (*Drv) Open\n\n```go\nfunc (drv *Drv) Open(conStr string) (driver.Conn, error)\n```\nOpen opens a connection to an Oracle server with the database/sql environment.\n\nThis is intended to be called by the database/sql package only.\n\nAlternatively, you may call Env.OpenCon to create an *ora.Con.\n\nOpen is a member of the driver.Driver interface.\n\n#### func (*Drv) SetCfg\n\n```go\nfunc (drv *Drv) SetCfg(cfg DrvCfg)\n```\n\n#### type DrvCfg\n\n```go\ntype DrvCfg struct {\n\tStmtCfg\n\tLog LogDrvCfg\n}\n```\n\nDrvCfg represents configuration values for the ora package.\n\n#### func  Cfg\n\n```go\nfunc Cfg() DrvCfg\n```\nCfg returns the ora database driver's cfg.\n\n#### func  NewDrvCfg\n\n```go\nfunc NewDrvCfg() DrvCfg\n```\nNewDrvCfg creates a DrvCfg with default values.\n\n#### func (DrvCfg) SetBinaryDouble\n\n```go\nfunc (c DrvCfg) SetBinaryDouble(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetBinaryFloat\n\n```go\nfunc (c DrvCfg) SetBinaryFloat(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetBlob\n\n```go\nfunc (c DrvCfg) SetBlob(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetByteSlice\n\n```go\nfunc (c DrvCfg) SetByteSlice(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetChar\n\n```go\nfunc (c DrvCfg) SetChar(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetChar1\n\n```go\nfunc (c DrvCfg) SetChar1(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetClob\n\n```go\nfunc (c DrvCfg) SetClob(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetDate\n\n```go\nfunc (c DrvCfg) SetDate(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetFloat\n\n```go\nfunc (c DrvCfg) SetFloat(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetLobBufferSize\n\n```go\nfunc (c DrvCfg) SetLobBufferSize(size int) DrvCfg\n```\n\n#### func (DrvCfg) SetLogger\n\n```go\nfunc (c DrvCfg) SetLogger(lgr Logger) DrvCfg\n```\n\n#### func (DrvCfg) SetLong\n\n```go\nfunc (c DrvCfg) SetLong(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetLongBufferSize\n\n```go\nfunc (c DrvCfg) SetLongBufferSize(size uint32) DrvCfg\n```\n\n#### func (DrvCfg) SetLongRaw\n\n```go\nfunc (c DrvCfg) SetLongRaw(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetLongRawBufferSize\n\n```go\nfunc (c DrvCfg) SetLongRawBufferSize(size uint32) DrvCfg\n```\n\n#### func (DrvCfg) SetNumberBigFloat\n\n```go\nfunc (c DrvCfg) SetNumberBigFloat(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetNumberBigInt\n\n```go\nfunc (c DrvCfg) SetNumberBigInt(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetNumberFloat\n\n```go\nfunc (c DrvCfg) SetNumberFloat(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetNumberInt\n\n```go\nfunc (c DrvCfg) SetNumberInt(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetPrefetchMemorySize\n\n```go\nfunc (c DrvCfg) SetPrefetchMemorySize(prefetchMemorySize uint32) DrvCfg\n```\n\n#### func (DrvCfg) SetPrefetchRowCount\n\n```go\nfunc (c DrvCfg) SetPrefetchRowCount(prefetchRowCount uint32) DrvCfg\n```\n\n#### func (DrvCfg) SetRaw\n\n```go\nfunc (c DrvCfg) SetRaw(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetStmtCfg\n\n```go\nfunc (cfg DrvCfg) SetStmtCfg(stmtCfg StmtCfg) DrvCfg\n```\n\n#### func (DrvCfg) SetStringPtrBufferSize\n\n```go\nfunc (c DrvCfg) SetStringPtrBufferSize(size int) DrvCfg\n```\n\n#### func (DrvCfg) SetTimestamp\n\n```go\nfunc (c DrvCfg) SetTimestamp(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetTimestampLtz\n\n```go\nfunc (c DrvCfg) SetTimestampLtz(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetTimestampTz\n\n```go\nfunc (c DrvCfg) SetTimestampTz(gct GoColumnType) DrvCfg\n```\n\n#### func (DrvCfg) SetVarchar\n\n```go\nfunc (c DrvCfg) SetVarchar(gct GoColumnType) DrvCfg\n```\n\n#### type DrvExecResult\n\n```go\ntype DrvExecResult struct {\n}\n```\n\nDrvExecResult is an Oracle execution result.\n\nDrvExecResult implements the driver.Result interface.\n\n#### func (*DrvExecResult) LastInsertId\n\n```go\nfunc (er *DrvExecResult) LastInsertId() (int64, error)\n```\nLastInsertId returns the identity value from an insert statement.\n\nThere are two setup steps required to reteive the LastInsertId. One, specify a\n'returning into' clause in the SQL insert statement. And, two, specify a nil\nparameter to DB.Exec or DrvStmt.Exec.\n\nFor example:\n\n    db, err := sql.Open(\"ora\", \"scott/tiger@orcl\")\n\n    db.Exec(\"CREATE TABLE T1 (C1 NUMBER(19,0) GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), C2 VARCHAR2(48 CHAR))\")\n\n    result, err := db.Exec(\"INSERT INTO T1 (C2) VALUES ('GO') RETURNING C1 /*lastInsertId*/ INTO :C1\", nil)\n\n    id, err := result.LastInsertId()\n\n#### func (*DrvExecResult) RowsAffected\n\n```go\nfunc (er *DrvExecResult) RowsAffected() (int64, error)\n```\nRowsAffected returns the number of rows affected by the exec statement.\n\n#### type DrvQueryResult\n\n```go\ntype DrvQueryResult struct {\n}\n```\n\nDrvQueryResult contains methods to retrieve the results of a SQL select\nstatement.\n\nDrvQueryResult implements the driver.Rows interface.\n\n#### func (*DrvQueryResult) Close\n\n```go\nfunc (qr *DrvQueryResult) Close() error\n```\nClose performs no operations.\n\nClose is a member of the driver.Rows interface.\n\n#### func (*DrvQueryResult) ColumnTypeDatabaseTypeName\n\n```go\nfunc (qr *DrvQueryResult) ColumnTypeDatabaseTypeName(index int) string\n```\nColumnTypeDatabaseTypeName returns the database system type name without the\nlength, in uppercase.\n\n#### func (*DrvQueryResult) ColumnTypeLength\n\n```go\nfunc (qr *DrvQueryResult) ColumnTypeLength(index int) (length int64, ok bool)\n```\nColumnTypeLength returns the length of the column type if the column is a\nvariable length type. If the column is not a variable length type ok should\nreturn false. If length is not limited other than system limits, it should\nreturn math.MaxInt64.\n\n#### func (*DrvQueryResult) ColumnTypeNullable\n\n```go\nfunc (qr *DrvQueryResult) ColumnTypeNullable(index int) (nullable, ok bool)\n```\nColumnTypeNullable returns true if it is known the column may be null, or false\nif the column is known to be not nullable. If the column nullability is unknown,\nok should be false.\n\n#### func (*DrvQueryResult) ColumnTypePrecisionScale\n\n```go\nfunc (qr *DrvQueryResult) ColumnTypePrecisionScale(index int) (precision, scale int64, ok bool)\n```\nColumnTypePrecisionScale return the precision and scale for decimal types. If\nnot applicable, ok should be false.\n\n#### func (*DrvQueryResult) ColumnTypeScanType\n\n```go\nfunc (qr *DrvQueryResult) ColumnTypeScanType(index int) reflect.Type\n```\n\n#### func (*DrvQueryResult) Columns\n\n```go\nfunc (qr *DrvQueryResult) Columns() []string\n```\nColumns returns query column names.\n\nColumns is a member of the driver.Rows interface.\n\n#### func (*DrvQueryResult) HasNextResultSet\n\n```go\nfunc (qr *DrvQueryResult) HasNextResultSet() bool\n```\nHasNextResultSet reports whether there is another result set after the current\none.\n\n#### func (*DrvQueryResult) Next\n\n```go\nfunc (qr *DrvQueryResult) Next(dest []driver.Value) (err error)\n```\nNext populates the specified slice with the next row of data.\n\nReturns io.EOF when there are no more rows.\n\nNext is a member of the driver.Rows interface.\n\n#### func (*DrvQueryResult) NextResultSet\n\n```go\nfunc (qr *DrvQueryResult) NextResultSet() error\n```\nNextResultSet advances the driver to the next result set even if there are\nremaining rows in the current result set.\n\n#### type DrvStmt\n\n```go\ntype DrvStmt struct {\n}\n```\n\nDrvStmt is an Oracle statement associated with a session.\n\nDrvStmt wraps Stmt and is intended for use by the database/sql/driver package.\n\nDrvStmt implements the driver.Stmt interface.\n\n#### func (*DrvStmt) Close\n\n```go\nfunc (ds *DrvStmt) Close() error\n```\nClose closes the SQL statement.\n\nClose is a member of the driver.Stmt interface.\n\n#### func (*DrvStmt) Exec\n\n```go\nfunc (ds *DrvStmt) Exec(values []driver.Value) (driver.Result, error)\n```\nExec executes an Oracle SQL statement on a server. Exec returns a driver.Result\nand a possible error.\n\nExec is a member of the driver.Stmt interface.\n\n#### func (*DrvStmt) ExecContext\n\n```go\nfunc (ds *DrvStmt) ExecContext(ctx context.Context, values []driver.NamedValue) (driver.Result, error)\n```\nExecContext enhances the Stmt interface by providing Exec with context.\nExecContext must honor the context timeout and return when it is cancelled.\n\n#### func (*DrvStmt) NumInput\n\n```go\nfunc (ds *DrvStmt) NumInput() int\n```\nNumInput returns the number of placeholders in a sql statement.\n\nNumInput is a member of the driver.Stmt interface.\n\n#### func (*DrvStmt) Query\n\n```go\nfunc (ds *DrvStmt) Query(values []driver.Value) (driver.Rows, error)\n```\nQuery runs a SQL query on an Oracle server. Query returns driver.Rows and a\npossible error.\n\nQuery is a member of the driver.Stmt interface.\n\n#### func (*DrvStmt) QueryContext\n\n```go\nfunc (ds *DrvStmt) QueryContext(ctx context.Context, values []driver.NamedValue) (driver.Rows, error)\n```\nQueryContext enhances the Stmt interface by providing Query with context.\nQueryContext must honor the context timeout and return when it is cancelled.\n\n#### type EmpLgr\n\n```go\ntype EmpLgr struct{}\n```\n\n\n#### func (EmpLgr) Errorf\n\n```go\nfunc (e EmpLgr) Errorf(format string, v ...interface{})\n```\n\n#### func (EmpLgr) Errorln\n\n```go\nfunc (e EmpLgr) Errorln(v ...interface{})\n```\n\n#### func (EmpLgr) Infof\n\n```go\nfunc (e EmpLgr) Infof(format string, v ...interface{})\n```\n\n#### func (EmpLgr) Infoln\n\n```go\nfunc (e EmpLgr) Infoln(v ...interface{})\n```\n\n#### type Env\n\n```go\ntype Env struct {\n\tsync.RWMutex\n}\n```\n\nEnv represents an Oracle environment.\n\n#### func  NewEnvSrvSes\n\n```go\nfunc NewEnvSrvSes(dsn string) (*Env, *Srv, *Ses, error)\n```\nNewEnvSrvSes is a comfort function which opens the environment, creates a\nconnection (Srv) to the server, and opens a session (Ses), in one call.\n\nIdeal for simple use cases.\n\n#### func  OpenEnv\n\n```go\nfunc OpenEnv() (env *Env, err error)\n```\nOpenEnv opens an Oracle environment.\n\nOptionally specify a cfg parameter. If cfg is nil, default cfg values are\napplied.\n\n#### func (*Env) Cfg\n\n```go\nfunc (env *Env) Cfg() StmtCfg\n```\n\n#### func (*Env) Close\n\n```go\nfunc (env *Env) Close() (err error)\n```\nClose disconnects from servers and resets optional fields.\n\n#### func (*Env) IsOpen\n\n```go\nfunc (env *Env) IsOpen() bool\n```\nIsOpen returns true when the environment is open; otherwise, false.\n\nCalling Close will cause IsOpen to return false. Once closed, the environment\nmay be re-opened by calling Open.\n\n#### func (*Env) Name\n\n```go\nfunc (s *Env) Name(calc func() string) string\n```\nName sets the name to the result of calc once, then returns that result forever.\n(Effectively caches the result of calc().)\n\n#### func (*Env) NewPool\n\n```go\nfunc (env *Env) NewPool(srvCfg SrvCfg, sesCfg SesCfg, size int) *Pool\n```\nNewPool returns an idle session pool, which evicts the idle sessions every\nminute, and automatically manages the required new connections (Srv).\n\nThis is done by maintaining a 1-1 pairing between the Srv and its Ses.\n\nThis pool does NOT limit the number of active connections, just helps reuse\nalready established connections and sessions, lowering the resource usage on the\nserver.\n\nIf size \u003c= 0, then DefaultPoolSize is used.\n\n#### func (*Env) NewSrvPool\n\n```go\nfunc (env *Env) NewSrvPool(srvCfg SrvCfg, size int) *SrvPool\n```\nNewSrvPool returns a connection pool, which evicts the idle connections in every\nminute. The pool holds at most size idle Srv. If size is zero, DefaultPoolSize\nwill be used.\n\n#### func (*Env) NumCon\n\n```go\nfunc (env *Env) NumCon() int\n```\nNumCon returns the number of open Oracle connections.\n\n#### func (*Env) NumSrv\n\n```go\nfunc (env *Env) NumSrv() int\n```\nNumSrv returns the number of open Oracle servers.\n\n#### func (*Env) OCINumberFromFloat\n\n```go\nfunc (env *Env) OCINumberFromFloat(dest *C.OCINumber, value float64, byteLen int) error\n```\n\n#### func (*Env) OCINumberFromInt\n\n```go\nfunc (env *Env) OCINumberFromInt(dest *C.OCINumber, value int64, byteLen int) error\n```\n\n#### func (*Env) OCINumberFromUint\n\n```go\nfunc (env *Env) OCINumberFromUint(dest *C.OCINumber, value uint64, byteLen int) error\n```\n\n#### func (*Env) OCINumberToFloat\n\n```go\nfunc (env *Env) OCINumberToFloat(src *C.OCINumber, byteLen int) (float64, error)\n```\n\n#### func (*Env) OCINumberToInt\n\n```go\nfunc (env *Env) OCINumberToInt(src *C.OCINumber, byteLen int) (int64, error)\n```\n\n#### func (*Env) OCINumberToUint\n\n```go\nfunc (env *Env) OCINumberToUint(src *C.OCINumber, byteLen int) (uint64, error)\n```\n\n#### func (*Env) OpenCon\n\n```go\nfunc (env *Env) OpenCon(dsn string) (con *Con, err error)\n```\nOpenCon starts an Oracle session on a server returning a *Con and possible\nerror.\n\nThe connection string has the form username/password@dblink e.g.,\nscott/tiger@orcl For connecting as SYSDBA or SYSOPER, append \" AS SYSDBA\" to the\nend of the connection string: \"sys/sys as sysdba\".\n\ndblink is a connection identifier such as a net service name, full connection\nidentifier, or a simple connection identifier. The dblink may be defined in the\nclient machine's tnsnames.ora file.\n\n#### func (*Env) OpenSrv\n\n```go\nfunc (env *Env) OpenSrv(cfg SrvCfg) (srv *Srv, err error)\n```\nOpenSrv connects to an Oracle server returning a *Srv and possible error.\n\n#### func (*Env) SetCfg\n\n```go\nfunc (env *Env) SetCfg(cfg StmtCfg)\n```\n\n#### type Float32\n\n```go\ntype Float32 struct {\n\tIsNull bool\n\tValue  float32\n}\n```\n\nFloat32 is a nullable float32.\n\n#### func (Float32) Equals\n\n```go\nfunc (this Float32) Equals(other Float32) bool\n```\nEquals returns true when the receiver and specified Float32 are both null, or\nwhen the receiver and specified Float32 are both not null and Values are equal.\n\n#### func (Float32) MarshalJSON\n\n```go\nfunc (this Float32) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Float32) UnmarshalJSON\n\n```go\nfunc (this *Float32) UnmarshalJSON(p []byte) error\n```\n\n#### type Float64\n\n```go\ntype Float64 struct {\n\tIsNull bool\n\tValue  float64\n}\n```\n\nFloat64 is a nullable float64.\n\n#### func (Float64) Equals\n\n```go\nfunc (this Float64) Equals(other Float64) bool\n```\nEquals returns true when the receiver and specified Float64 are both null, or\nwhen the receiver and specified Float64 are both not null and Values are equal.\n\n#### func (Float64) MarshalJSON\n\n```go\nfunc (this Float64) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Float64) UnmarshalJSON\n\n```go\nfunc (this *Float64) UnmarshalJSON(p []byte) error\n```\n\n#### type GoColumnType\n\n```go\ntype GoColumnType uint\n```\n\nGoColumnType defines the Go type returned from a sql select column.\n\n```go\nconst (\n\t// D defines a sql select column based on its default mapping.\n\tD GoColumnType = iota + 1\n\t// I64 defines a sql select column as a Go int64.\n\tI64\n\t// I32 defines a sql select column as a Go int32.\n\tI32\n\t// I16 defines a sql select column as a Go int16.\n\tI16\n\t// I8 defines a sql select column as a Go int8.\n\tI8\n\t// U64 defines a sql select column as a Go uint64.\n\tU64\n\t// U32 defines a sql select column as a Go uint32.\n\tU32\n\t// U16 defines a sql select column as a Go uint16.\n\tU16\n\t// U8 defines a sql select column as a Go uint8.\n\tU8\n\t// F64 defines a sql select column as a Go float64.\n\tF64\n\t// F32 defines a sql select column as a Go float32.\n\tF32\n\t// OraI64 defines a sql select column as a nullable Go ora.Int64.\n\tOraI64\n\t// OraI32 defines a sql select column as a nullable Go ora.Int32.\n\tOraI32\n\t// OraI16 defines a sql select column as a nullable Go ora.Int16.\n\tOraI16\n\t// OraI8 defines a sql select column as a nullable Go ora.Int8.\n\tOraI8\n\t// OraU64 defines a sql select column as a nullable Go ora.Uint64.\n\tOraU64\n\t// OraU32 defines a sql select column as a nullable Go ora.Uint32.\n\tOraU32\n\t// OraU16 defines a sql select column as a nullable Go ora.Uint16.\n\tOraU16\n\t// OraU8 defines a sql select column as a nullable Go ora.Uint8.\n\tOraU8\n\t// OraF64 defines a sql select column as a nullable Go ora.Float64.\n\tOraF64\n\t// OraF32 defines a sql select column as a nullable Go ora.Float32.\n\tOraF32\n\t// T defines a sql select column as a Go time.Time.\n\tT\n\t// OraT defines a sql select column as a nullable Go ora.Time.\n\tOraT\n\t// S defines a sql select column as a Go string.\n\tS\n\t// OraS defines a sql select column as a nullable Go ora.String.\n\tOraS\n\t// B defines a sql select column as a Go bool.\n\tB\n\t// OraB defines a sql select column as a nullable Go ora.Bool.\n\tOraB\n\t// Bin defines a sql select column or bind parmeter as a Go byte slice.\n\tBin\n\t// OraBin defines a sql select column as a nullable Go ora.Binary.\n\tOraBin\n\t// N defines a sql select column as a Go string for number.\n\tN\n\t// OraN defines a sql select column as a nullable Go string for number.\n\tOraN\n\t// L defins an sql select column as an ora.Lob.\n\tL\n)\n```\ngo column types\n\n#### func (GoColumnType) String\n\n```go\nfunc (gct GoColumnType) String() string\n```\n\n#### type Id\n\n```go\ntype Id struct {\n}\n```\n\n\n#### type Int16\n\n```go\ntype Int16 struct {\n\tIsNull bool\n\tValue  int16\n}\n```\n\nInt16 is a nullable int16.\n\n#### func (Int16) Equals\n\n```go\nfunc (this Int16) Equals(other Int16) bool\n```\nEquals returns true when the receiver and specified Int16 are both null, or when\nthe receiver and specified Int16 are both not null and Values are equal.\n\n#### func (Int16) MarshalJSON\n\n```go\nfunc (this Int16) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Int16) UnmarshalJSON\n\n```go\nfunc (this *Int16) UnmarshalJSON(p []byte) error\n```\n\n#### type Int32\n\n```go\ntype Int32 struct {\n\tIsNull bool\n\tValue  int32\n}\n```\n\nInt32 is a nullable int32.\n\n#### func (Int32) Equals\n\n```go\nfunc (this Int32) Equals(other Int32) bool\n```\nEquals returns true when the receiver and specified Int32 are both null, or when\nthe receiver and specified Int32 are both not null and Values are equal.\n\n#### func (Int32) MarshalJSON\n\n```go\nfunc (this Int32) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Int32) UnmarshalJSON\n\n```go\nfunc (this *Int32) UnmarshalJSON(p []byte) error\n```\n\n#### type Int64\n\n```go\ntype Int64 struct {\n\tIsNull bool\n\tValue  int64\n}\n```\n\nInt64 is a nullable int64.\n\n#### func (Int64) Equals\n\n```go\nfunc (this Int64) Equals(other Int64) bool\n```\nEquals returns true when the receiver and specified Int64 are both null, or when\nthe receiver and specified Int64 are both not null and Values are equal.\n\n#### func (Int64) MarshalJSON\n\n```go\nfunc (this Int64) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Int64) UnmarshalJSON\n\n```go\nfunc (this *Int64) UnmarshalJSON(p []byte) error\n```\n\n#### type Int8\n\n```go\ntype Int8 struct {\n\tIsNull bool\n\tValue  int8\n}\n```\n\nInt8 is a nullable int8.\n\n#### func (Int8) Equals\n\n```go\nfunc (this Int8) Equals(other Int8) bool\n```\nEquals returns true when the receiver and specified Int8 are both null, or when\nthe receiver and specified Int8 are both not null and Values are equal.\n\n#### func (Int8) MarshalJSON\n\n```go\nfunc (this Int8) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Int8) UnmarshalJSON\n\n```go\nfunc (this *Int8) UnmarshalJSON(p []byte) error\n```\n\n#### type IntervalDS\n\n```go\ntype IntervalDS struct {\n\tIsNull     bool\n\tDay        int32\n\tHour       int32\n\tMinute     int32\n\tSecond     int32\n\tNanosecond int32\n}\n```\n\nIntervalDS represents a nullable INTERVAL DAY TO SECOND Oracle value.\n\n#### func (IntervalDS) Equals\n\n```go\nfunc (this IntervalDS) Equals(other IntervalDS) bool\n```\nEquals returns true when the receiver and specified IntervalDS are both null, or\nwhen the receiver and specified IntervalDS are both not null, and all other\nfields are equal.\n\n#### func (IntervalDS) ShiftTime\n\n```go\nfunc (this IntervalDS) ShiftTime(t time.Time) time.Time\n```\nShiftTime returns a new Time with IntervalDS applied.\n\n#### func (IntervalDS) String\n\n```go\nfunc (this IntervalDS) String() string\n```\n\n#### type IntervalYM\n\n```go\ntype IntervalYM struct {\n\tIsNull bool\n\tYear   int32\n\tMonth  int32\n}\n```\n\nIntervalYM represents a nullable INTERVAL YEAR TO MONTH Oracle value.\n\n#### func (IntervalYM) Equals\n\n```go\nfunc (this IntervalYM) Equals(other IntervalYM) bool\n```\nEquals returns true when the receiver and specified IntervalYM are both null, or\nwhen the receiver and specified IntervalYM are both not null, Year are equal and\nMonth are equal.\n\n#### func (IntervalYM) ShiftTime\n\n```go\nfunc (this IntervalYM) ShiftTime(t time.Time) time.Time\n```\nShiftTime returns a new Time with IntervalYM applied.\n\n#### func (IntervalYM) String\n\n```go\nfunc (this IntervalYM) String() string\n```\n\n#### type Lob\n\n```go\ntype Lob struct {\n\tio.Reader\n\tio.Closer\n\tC bool\n}\n```\n\nLob Reader is sent to the DB on bind, if not nil. The Reader can read the LOB if\nwe bind a *Lob, Closer will close the LOB. Set Lob.C = true to make this a CLOB\nreader!\n\n#### func (*Lob) Bytes\n\n```go\nfunc (this *Lob) Bytes() ([]byte, error)\n```\nBytes will read the contents of the Lob.Reader, and will keep that for future.\n\n#### func (*Lob) Close\n\n```go\nfunc (this *Lob) Close() error\n```\n\n#### func (*Lob) Equals\n\n```go\nfunc (this *Lob) Equals(other Lob) bool\n```\nEquals returns true when the receiver and specified Lob are both null, or when\nthey both not null and share the same Reader.\n\n#### func (*Lob) MarshalJSON\n\n```go\nfunc (this *Lob) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Lob) Read\n\n```go\nfunc (this *Lob) Read(p []byte) (int, error)\n```\n\n#### func (*Lob) Scan\n\n```go\nfunc (this *Lob) Scan(src interface{}) error\n```\n\n#### func (*Lob) String\n\n```go\nfunc (this *Lob) String() string\n```\n\n#### func (*Lob) UnmarshalJSON\n\n```go\nfunc (this *Lob) UnmarshalJSON(p []byte) error\n```\n\n#### func (*Lob) Value\n\n```go\nfunc (this *Lob) Value() (driver.Value, error)\n```\nValue returns what Lob.Bytes returns.\n\n#### type LogConCfg\n\n```go\ntype LogConCfg struct {\n\t// Close determines whether the Con.Close method is logged.\n\t//\n\t// The default is true.\n\tClose bool\n\n\t// Prepare determines whether the Con.Prepare method is logged.\n\t//\n\t// The default is true.\n\tPrepare bool\n\n\t// Begin determines whether the Con.Begin method is logged.\n\t//\n\t// The default is true.\n\tBegin bool\n\n\t// Ping determines whether the Con.Ping method is logged.\n\t//\n\t// The default is true.\n\tPing bool\n}\n```\n\nLogConCfg represents Con logging configuration values.\n\n#### func  NewLogConCfg\n\n```go\nfunc NewLogConCfg() LogConCfg\n```\nNewLogConCfg creates a LogTxCfg with default values.\n\n#### type LogDrvCfg\n\n```go\ntype LogDrvCfg struct {\n\t// Logger writes log messages.\n\t// Logger can be replaced with any type implementing the Logger interface.\n\t//\n\t// The default implementation uses the standard lib's log package.\n\t//\n\t// For a glog-based implementation, see gopkg.in/rana/ora.v4/glg.\n\t// LogDrvCfg.Logger = glg.Log\n\t//\n\t// For an gopkg.in/inconshreveable/log15.v2-based, see gopkg.in/rana/ora.v4/lg15.\n\t// LogDrvCfg.Logger = lg15.Log\n\tLogger Logger\n\n\t// OpenEnv determines whether the ora.OpenEnv method is logged.\n\t//\n\t// The default is true.\n\tOpenEnv bool\n\n\t// Ins determines whether the ora.Ins method is logged.\n\t//\n\t// The default is true.\n\tIns bool\n\n\t// Upd determines whether the ora.Upd method is logged.\n\t//\n\t// The default is true.\n\tUpd bool\n\n\t// Del determines whether the ora.Del method is logged.\n\t//\n\t// The default is true.\n\tDel bool\n\n\t// Sel determines whether the ora.Sel method is logged.\n\t//\n\t// The default is true.\n\tSel bool\n\n\t// AddTbl determines whether the ora.AddTbl method is logged.\n\t//\n\t// The default is true.\n\tAddTbl bool\n\n\tEnv  LogEnvCfg\n\tSrv  LogSrvCfg\n\tSes  LogSesCfg\n\tStmt LogStmtCfg\n\tTx   LogTxCfg\n\tCon  LogConCfg\n\tRset LogRsetCfg\n}\n```\n\nLogDrvCfg represents package-level logging configuration values.\n\n#### func  NewLogDrvCfg\n\n```go\nfunc NewLogDrvCfg() LogDrvCfg\n```\nNewLogDrvCfg creates a LogDrvCfg with default values.\n\n#### func (LogDrvCfg) IsEnabled\n\n```go\nfunc (c LogDrvCfg) IsEnabled(enabled bool) bool\n```\nIsEnabled returns whether the logger is enabled (and enabled is true).\n\n#### type LogEnvCfg\n\n```go\ntype LogEnvCfg struct {\n\t// Close determines whether the Env.Close method is logged.\n\t//\n\t// The default is true.\n\tClose bool\n\n\t// OpenSrv determines whether the Env.OpenSrv method is logged.\n\t//\n\t// The default is true.\n\tOpenSrv bool\n\n\t// OpenCon determines whether the Env.OpenCon method is logged.\n\t//\n\t// The default is true.\n\tOpenCon bool\n}\n```\n\nLogEnvCfg represents Env logging configuration values.\n\n#### func  NewLogEnvCfg\n\n```go\nfunc NewLogEnvCfg() LogEnvCfg\n```\nNewLogEnvCfg creates a LogEnvCfg with default values.\n\n#### type LogRsetCfg\n\n```go\ntype LogRsetCfg struct {\n\t// Close determines whether the Rset.close method is logged.\n\t//\n\t// The default is true.\n\tClose bool\n\n\t// BeginRow determines whether the Rset.beginRow method is logged.\n\t//\n\t// The default is false.\n\tBeginRow bool\n\n\t// EndRow determines whether the Rset.endRow method is logged.\n\t//\n\t// The default is false.\n\tEndRow bool\n\n\t// Next determines whether the Rset.Next method is logged.\n\t//\n\t// The default is false.\n\tNext bool\n\n\t// Open determines whether the Rset.open method is logged.\n\t//\n\t// The default is true.\n\tOpen bool\n\n\t// OpenDefs determines whether Select-list definitions with the Rset.open method are logged.\n\t//\n\t// The default is true.\n\tOpenDefs bool\n}\n```\n\nLogRsetCfg represents Rset logging configuration values.\n\n#### func  NewLogRsetCfg\n\n```go\nfunc NewLogRsetCfg() LogRsetCfg\n```\nNewLogTxCfg creates a LogRsetCfg with default values.\n\n#### type LogSesCfg\n\n```go\ntype LogSesCfg struct {\n\t// Close determines whether the Ses.Close method is logged.\n\t//\n\t// The default is true.\n\tClose bool\n\n\t// PrepAndExe determines whether the Ses.PrepAndExe method is logged.\n\t//\n\t// The default is true.\n\tPrepAndExe bool\n\n\t// PrepAndQry determines whether the Ses.PrepAndQry method is logged.\n\t//\n\t// The default is true.\n\tPrepAndQry bool\n\n\t// Prep determines whether the Ses.Prep method is logged.\n\t//\n\t// The default is true.\n\tPrep bool\n\n\t// Ins determines whether the Ses.Ins method is logged.\n\t//\n\t// The default is true.\n\tIns bool\n\n\t// Upd determines whether the Ses.Upd method is logged.\n\t//\n\t// The default is true.\n\tUpd bool\n\n\t// Sel determines whether the Ses.Sel method is logged.\n\t//\n\t// The default is true.\n\tSel bool\n\n\t// StartTx determines whether the Ses.StartTx method is logged.\n\t//\n\t// The default is true.\n\tStartTx bool\n\n\t// Ping determines whether the Ses.Ping method is logged.\n\t//\n\t// The default is true.\n\tPing bool\n\n\t// Break determines whether the Ses.Break method is logged.\n\t//\n\t// The default is true.\n\tBreak bool\n}\n```\n\nLogSesCfg represents Ses logging configuration values.\n\n#### func  NewLogSesCfg\n\n```go\nfunc NewLogSesCfg() LogSesCfg\n```\nNewLogSesCfg creates a LogSesCfg with default values.\n\n#### type LogSrvCfg\n\n```go\ntype LogSrvCfg struct {\n\t// Close determines whether the Srv.Close method is logged.\n\t//\n\t// The default is true.\n\tClose bool\n\n\t// OpenSes determines whether the Srv.OpenSes method is logged.\n\t//\n\t// The default is true.\n\tOpenSes bool\n\n\t// Version determines whether the Srv.Version method is logged.\n\t//\n\t// The default is true.\n\tVersion bool\n}\n```\n\nLogSrvCfg represents Srv logging configuration values.\n\n#### func  NewLogSrvCfg\n\n```go\nfunc NewLogSrvCfg() LogSrvCfg\n```\nNewLogSrvCfg creates a LogSrvCfg with default values.\n\n#### type LogStmtCfg\n\n```go\ntype LogStmtCfg struct {\n\t// Close determines whether the Stmt.Close method is logged.\n\t//\n\t// The default is true.\n\tClose bool\n\n\t// Exe determines whether the Stmt.Exe method is logged.\n\t//\n\t// The default is true.\n\tExe bool\n\n\t// Qry determines whether the Stmt.Qry method is logged.\n\t//\n\t// The default is true.\n\tQry bool\n\n\t// Bind determines whether the Stmt.bind method is logged.\n\t//\n\t// The default is true.\n\tBind bool\n}\n```\n\nLogStmtCfg represents Stmt logging configuration values.\n\n#### func  NewLogStmtCfg\n\n```go\nfunc NewLogStmtCfg() LogStmtCfg\n```\nNewLogStmtCfg creates a LogStmtCfg with default values.\n\n#### type LogTxCfg\n\n```go\ntype LogTxCfg struct {\n\t// Commit determines whether the Tx.Commit method is logged.\n\t//\n\t// The default is true.\n\tCommit bool\n\n\t// Rollback determines whether the Tx.Rollback method is logged.\n\t//\n\t// The default is true.\n\tRollback bool\n}\n```\n\nLogTxCfg represents Tx logging configuration values.\n\n#### func  NewLogTxCfg\n\n```go\nfunc NewLogTxCfg() LogTxCfg\n```\nNewLogTxCfg creates a LogTxCfg with default values.\n\n#### type Logger\n\n```go\ntype Logger interface {\n\tInfof(format string, args ...interface{})\n\tInfoln(args ...interface{})\n\tErrorf(format string, args ...interface{})\n\tErrorln(args ...interface{})\n}\n```\n\nLogger interface is for logging.\n\n#### type MultiErr\n\n```go\ntype MultiErr struct {\n}\n```\n\nMultiErr holds multiple errors in a single string.\n\n#### func (MultiErr) Error\n\n```go\nfunc (m MultiErr) Error() string\n```\nError returns one or more errors.\n\nError is a member of the 'error' interface.\n\n#### type Num\n\n```go\ntype Num string\n```\n\n\n#### type OCINum\n\n```go\ntype OCINum struct {\n\tnum.OCINum\n}\n```\n\n\n#### func (*OCINum) FromC\n\n```go\nfunc (num *OCINum) FromC(x C.OCINumber)\n```\nFromC converts from the given C.OCINumber.\n\n#### func (OCINum) String\n\n```go\nfunc (n OCINum) String() string\n```\n\n#### func (OCINum) ToC\n\n```go\nfunc (num OCINum) ToC(x *C.OCINumber)\n```\nToC converts the OCINum into the given *C.OCINumber.\n\n#### func (OCINum) Value\n\n```go\nfunc (n OCINum) Value() (driver.Value, error)\n```\nValue returns the driver.Value as required by database/sql. So OCINum is allowed\nas a parameter to Scan.\n\n#### type ORAError\n\n```go\ntype ORAError struct {\n}\n```\n\n\n#### func (ORAError) Code\n\n```go\nfunc (e ORAError) Code() int\n```\n\n#### func (*ORAError) Error\n\n```go\nfunc (e *ORAError) Error() string\n```\n\n#### type OraNum\n\n```go\ntype OraNum struct {\n\tIsNull bool\n\tValue  string\n}\n```\n\n\n#### func (OraNum) Equals\n\n```go\nfunc (this OraNum) Equals(other OraNum) bool\n```\nEquals returns true when the receiver and specified OraNum are both null, or\nwhen the receiver and specified OraNum are both not null and Values are equal.\n\n#### func (OraNum) MarshalJSON\n\n```go\nfunc (this OraNum) MarshalJSON() ([]byte, error)\n```\n\n#### func (OraNum) String\n\n```go\nfunc (this OraNum) String() string\n```\n\n#### func (*OraNum) UnmarshalJSON\n\n```go\nfunc (this *OraNum) UnmarshalJSON(p []byte) error\n```\n\n#### type OraOCINum\n\n```go\ntype OraOCINum struct {\n\tIsNull bool\n\tValue  num.OCINum\n}\n```\n\n\n#### func (OraOCINum) Equals\n\n```go\nfunc (this OraOCINum) Equals(other OraOCINum) bool\n```\nEquals returns true when the receiver and specified OraOCINum are both null, or\nwhen the receiver and specified OraOCINum are both not null and Values are\nequal.\n\n#### func (OraOCINum) MarshalJSON\n\n```go\nfunc (this OraOCINum) MarshalJSON() ([]byte, error)\n```\n\n#### func (OraOCINum) String\n\n```go\nfunc (this OraOCINum) String() string\n```\n\n#### func (*OraOCINum) UnmarshalJSON\n\n```go\nfunc (this *OraOCINum) UnmarshalJSON(p []byte) error\n```\n\n#### type Pool\n\n```go\ntype Pool struct {\n\tsync.Mutex\n}\n```\n\n\n#### func  NewPool\n\n```go\nfunc NewPool(dsn string, size int) (*Pool, error)\n```\nNewPool returns a new session pool with default config.\n\n#### func (*Pool) Close\n\n```go\nfunc (p *Pool) Close() (err error)\n```\nClose all idle sessions and connections.\n\n#### func (*Pool) Get\n\n```go\nfunc (p *Pool) Get() (ses *Ses, err error)\n```\nGet a session - either an idle session, or if such does not exist, then a new\nsession on an idle connection; if such does not exist, then a new session on a\nnew connection.\n\n#### func (*Pool) Put\n\n```go\nfunc (p *Pool) Put(ses *Ses)\n```\nPut the session back to the session pool. Ensure that on ses Close (eviction),\nsrv is put back on the idle pool.\n\n#### func (Pool) SetEvictDuration\n\n```go\nfunc (p Pool) SetEvictDuration(dur time.Duration)\n```\nSet the eviction duration to the given. Also starts eviction if not yet started.\n\n#### type PoolCfg\n\n```go\ntype PoolCfg struct {\n\tType           PoolType\n\tName           string\n\tUsername       string\n\tPassword       string\n\tMin, Max, Incr uint32\n}\n```\n\n\n#### func  DSNPool\n\n```go\nfunc DSNPool(str string) PoolCfg\n```\nDSNPool returns the Pool config from dsn.\n\n#### type PoolType\n\n```go\ntype PoolType uint8\n```\n\n\n#### type Raw\n\n```go\ntype Raw struct {\n\tIsNull bool\n\tValue  []byte\n}\n```\n\nRaw represents a nullable byte slice for RAW or LONG RAW Oracle values.\n\n#### func (Raw) Equals\n\n```go\nfunc (this Raw) Equals(other Raw) bool\n```\nEquals returns true when the receiver and specified Raw are both null, or when\nthe receiver and specified Raw are both not null and Values are equal.\n\n#### func (Raw) MarshalJSON\n\n```go\nfunc (this Raw) MarshalJSON() ([]byte, error)\n```\n\n#### func (*Raw) UnmarshalJSON\n\n```go\nfunc (this *Raw) UnmarshalJSON(p []byte) error\n```\n\n#### type ResType\n\n```go\ntype ResType int\n```\n\nResType represents a result type returned by the ora.Sel method.\n\n```go\nconst (\n\t// SliceOfPtr indicates a slice of struct pointers will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\tSliceOfPtr ResType = iota\n\n\t// SliceOfVal indicates a slice of structs will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\tSliceOfVal\n\n\t// MapOfPtrPk indicates a map of struct pointers will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"pk\"`.\n\tMapOfPtrPk\n\n\t// MapOfPtrFk1 indicates a map of struct pointers will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk1\"`.\n\tMapOfPtrFk1\n\n\t// MapOfPtrFk2 indicates a map of struct pointers will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk2\"`.\n\tMapOfPtrFk2\n\n\t// MapOfPtrFk3 indicates a map of struct pointers will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk3\"`.\n\tMapOfPtrFk3\n\n\t// MapOfPtrFk4 indicates a map of struct pointers will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk4\"`.\n\tMapOfPtrFk4\n\n\t// MapOfValPk indicates a map of structs will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"pk\"`.\n\tMapOfValPk\n\n\t// MapOfValFk1 indicates a map of structs will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk1\"`.\n\tMapOfValFk1\n\n\t// MapOfValFk2 indicates a map of structs will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk2\"`.\n\tMapOfValFk2\n\n\t// MapOfValFk3 indicates a map of structs will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk3\"`.\n\tMapOfValFk3\n\n\t// MapOfValFk4 indicates a map of structs will be returned by the ora.Sel method.\n\t// The struct type is specified to ora.Sel by the user.\n\t// The map key is determined by a struct field tagged with `db:\"fk4\"`.\n\tMapOfValFk4\n)\n```\n\n#### type Rset\n\n```go\ntype Rset struct {\n\tsync.RWMutex\n\n\tRow     []interface{}\n\tColumns []Column\n}\n```\n\nRset represents a result set used to obtain Go values from a SQL select\nstatement.\n\nOpening and closing a Rset is managed internally. Rset doesn't have an Open\nmethod or Close method.\n\n#### func (*Rset) Err\n\n```go\nfunc (rset *Rset) Err() error\n```\nErr returns the last error of the reesult set.\n\n#### func (*Rset) Exhaust\n\n```go\nfunc (rset *Rset) Exhaust()\n```\nExhaust will cycle to the end of the Rset, to autoclose it.\n\n#### func (*Rset) IsOpen\n\n```go\nfunc (rset *Rset) IsOpen() bool\n```\nIsOpen returns true when a result set is open; otherwise, false.\n\n#### func (*Rset) Len\n\n```go\nfunc (rset *Rset) Len() int\n```\nLen returns the number of rows retrieved.\n\n#### func (*Rset) Name\n\n```go\nfunc (s *Rset) Name(calc func() string) string\n```\nName sets the name to the result of calc once, then returns that result forever.\n(Effectively caches the result of calc().)\n\n#### func (*Rset) Next\n\n```go\nfunc (rset *Rset) Next() bool\n```\nNext attempts to load a row of data from an Oracle buffer. True is returned when\na row of data is retrieved. False is returned when no data is available.\n\nRetrieve the loaded row from the Rset.Row field. Rset.Row is updated on each\ncall to Next. Rset.Row is set to nil when Next returns false.\n\nWhen Next returns false check Rset.Err() for any error that may have occured.\n\n#### func (*Rset) NextRow\n\n```go\nfunc (rset *Rset) NextRow() []interface{}\n```\nNextRow attempts to load a row from the Oracle buffer and return the row. Nil is\nreturned when there's no data.\n\nWhen NextRow returns nil check Rset.Err() for any error that may have occured.\n\n#### type RsetCfg\n\n```go\ntype RsetCfg struct {\n\n\t// TrueRune is rune a Go bool true value from SQL select-list character column.\n\t//\n\t// The is default is '1'.\n\tTrueRune rune\n\n\t// Err is the error from the last Set... method.\n\tErr error\n}\n```\n\nRsetCfg affects the association of Oracle select-list columns to Go types.\n\nThough it is unlucky, an empty RsetCfg is unusable! Please use NewRsetCfg().\n\nRsetCfg is immutable, so all Set... methods returns a new copy!\n\n#### func  NewRsetCfg\n\n```go\nfunc NewRsetCfg() RsetCfg\n```\nNewRsetCfg returns a RsetCfg with default values.\n\n#### func (RsetCfg) BinaryDouble\n\n```go\nfunc (c RsetCfg) BinaryDouble() GoColumnType\n```\nBinaryDouble returns a GoColumnType associated to an Oracle select-list\nBINARY_DOUBLE column.\n\nThe default is F64.\n\nBinaryDouble is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, BinaryDouble is used.\n\n#### func (RsetCfg) BinaryFloat\n\n```go\nfunc (c RsetCfg) BinaryFloat() GoColumnType\n```\nBinaryFloat returns a GoColumnType associated to an Oracle select-list\nBINARY_FLOAT column.\n\nThe default for the database/sql package is F64.\n\nThe default for the ora package is F32.\n\nBinaryFloat is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, BinaryFloat is used.\n\n#### func (RsetCfg) Blob\n\n```go\nfunc (c RsetCfg) Blob() GoColumnType\n```\nBlob returns a GoColumnType associated to an Oracle select-list BLOB column.\n\nThe default is Bits.\n\nBlob is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, Blob is used.\n\n#### func (RsetCfg) Char\n\n```go\nfunc (c RsetCfg) Char() GoColumnType\n```\nChar returns a GoColumnType associated to an Oracle select-list CHAR column and\nNCHAR column.\n\nThe default is S.\n\nChar is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, Char is used.\n\n#### func (RsetCfg) Char1\n\n```go\nfunc (c RsetCfg) Char1() GoColumnType\n```\nChar1 returns a GoColumnType associated to an Oracle select-list CHAR column\nwith length 1 and NCHAR column with length 1.\n\nThe default is B.\n\nChar1 is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, Char1 is used.\n\n#### func (RsetCfg) Clob\n\n```go\nfunc (c RsetCfg) Clob() GoColumnType\n```\nClob returns a GoColumnType associated to an Oracle select-list CLOB column and\nNCLOB column.\n\nThe default is S.\n\nClob is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, Clob is used.\n\n#### func (RsetCfg) Date\n\n```go\nfunc (c RsetCfg) Date() GoColumnType\n```\nDate returns a GoColumnType associated to an Oracle select-list DATE column.\n\nThe default is T.\n\nDate is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, Date is used.\n\n#### func (RsetCfg) Float\n\n```go\nfunc (c RsetCfg) Float() GoColumnType\n```\nFloat returns a GoColumnType associated to an Oracle select-list FLOAT column.\n\nThe default is F64.\n\nFloat is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, Float is used.\n\n#### func (RsetCfg) IsZero\n\n```go\nfunc (c RsetCfg) IsZero() bool\n```\n\n#### func (RsetCfg) Long\n\n```go\nfunc (c RsetCfg) Long() GoColumnType\n```\nLong returns a GoColumnType associated to an Oracle select-list LONG column.\n\nThe default is S.\n\nLong is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, Long is used.\n\n#### func (RsetCfg) LongRaw\n\n```go\nfunc (c RsetCfg) LongRaw() GoColumnType\n```\nLongRaw returns a GoColumnType associated to an Oracle select-list LONG RAW\ncolumn.\n\nThe default is Bits.\n\nLongRaw is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, LongRaw is used.\n\n#### func (RsetCfg) NumberBigFloat\n\n```go\nfunc (c RsetCfg) NumberBigFloat() GoColumnType\n```\nNumberBigFloat returns a GoColumnType associated to an Oracle select-list NUMBER\ncolumn defined with a scale greater than zero and precision unknown or \u003e 15.\n\nThe default is N.\n\nNumberBugFloat is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, NumberFloat is used.\n\n#### func (RsetCfg) NumberBigInt\n\n```go\nfunc (c RsetCfg) NumberBigInt() GoColumnType\n```\nNumberBigInt returns a GoColumnType associated to an Oracle select-list NUMBER\ncolumn defined with scale zero and precision unknown or \u003e 19.\n\nThe default is N.\n\nThe database/sql package uses NumberBigInt.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, NumberInt is used.\n\n#### func (RsetCfg) NumberFloat\n\n```go\nfunc (c RsetCfg) NumberFloat() GoColumnType\n```\nNumberFloat returns a GoColumnType associated to an Oracle select-list NUMBER\ncolumn defined with a scale greater than zero.\n\nThe default is F64.\n\nNumberFloat is used by the database/sql package.\n\nWhen using the ora package directly, custom GoColumnType associations may be\nspecified to the Ses.Prep method. If no custom GoColumnType association is\nspecified, NumberFloat is used.\n\n#### func (RsetCfg) NumberInt\n\n```go\nfunc (c RsetCfg) NumberInt() GoColumnType\n```\nNumberInt returns a GoColumnType associated to an Oracle s","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frana%2Fora","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frana%2Fora","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frana%2Fora/lists"}