goracle
goracle/oracle is a package is a translated version of
cx_Oracle
(by Anthony Tuininga) converted from C (Python module) to Go.
goracle/godrv is a package which is a
database/sql/driver.Driver
compliant wrapper for goracle/oracle - passes github.com/bradfitz/go-sql-test
(as github.com/tgulacsi/go-sql-test).
There
CHAR, VARCHAR2, NUMBER, DATETIME, INTERVAL simple AND array bind/define.
CURSOR, CLOB, BLOB
Not working
Cannot input PLS_INTEGER, only INTEGER (this is OK, as PLS_INTEGER is a
PL/SQL type, not an SQL one).
Not working ATM
Nothing I know of.
Not tested (yet)
LONG, LONG RAW, BFILE
Usage and intentions
I haven't had the pressure to force me understanding database/sql - yet.
I've ported cx_Oracle because I'm using Python with Oracle most of,
and no featureful OCI binding has existed for Go that time.
Thus I'm fluent with cx_Oracle and that means goracle/oracle.
BUT I'd start and stick with database/sql as long as it is possible
- my impression is that Go's standard library is very high quality.
Of course if you need to use Oracle's non-standard features
(out bind variables, returning cursors, sending and receiving
PL/SQL associative tables...) then goracle/oracle is the straight choice.
For simple (connection, Ping, Select) usage, and testing connection
(DSN can be tricky), see conntest.
Changes
With b0219c8f we can reuse statements with different number of bind variables!
Debug
You can build the test executable (for debugging with gdb, for example) with
go test -c
You can build a tracing version with the "trace" build tag
(go build -tags=trace) that will print out everything before calling OCI
C functions.
See c for example.
Install
It is go get
'able with go get github.com/tgulacsi/goracle/godrv
iff you have
Oracle DB installed
OR the Oracle's
InstantClient
both the Basic Client and the SDK (for the header files), too!
For environment variables, you can try env
Linux
AND you have set proper environment variables:
export CGO_CFLAGS=-I$(dirname $(find $ORACLE_HOME -type f -name oci.h))
export CGO_LDFLAGS=-L$(dirname $(find $ORACLE_HOME -type f -name libclntsh.so\*))
go get github.com/tgulacsi/goracle/godrv
For example, with my XE:
ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
CGO_CFLAGS=-I/u01/app/oracle/product/11.2.0/xe/rdbms/public
CGO_LDFLAGS=-L/u01/app/oracle/product/11.2.0/xe/lib
With InstantClient:
CGO_CFLAGS=-I/usr/include/oracle/11.2/client64
CGO_LDFLAGS=-L/usr/include/oracle/11.2/client64
Mac OS X
For Mac OS X I did the following:
You have to get both the Instant Client Package Basic and the Instant Client Package SDK (for the header files).
Then set the env vars as this (note the SDK here was unpacked into the base directory of the Basic package)
export CGO_CFLAGS=-I/Users/dfils/src/oracle/instantclient_11_2/sdk/include
export CGO_LDFLAGS=-L/Users/dfils/src/oracle/instantclient_11_2
export DYLD_LIBRARY_PATH=/Users/dfils/src/oracle/instantclient_11_2:$DYLD_LIBRARY_PATH
Perhaps this export would work too, but I did not try it. I understand this is another way to do this
export DYLD_FALLBACK_LIBRARY_PATH=/Users/dfils/src/oracle/instantclient_11_2
The DYLD vars are needed to run the binary, not to compile it.
Windows 7 64-bit
Thanks to Johann Kropf!
Requirements
- mingw-w64
- msys
- go
- Oracle InstantClient Basic 64bit
- Oracle InstantClient SDK 64bit
github.com\tgulacsi\goracle
under %GOPATH%
Set CGO_CFLAGS=-IC:\Oracle64Instant\sdk\include
Set CGO_LDFLAGS=-LC:\Oracle64Instant\sdk\lib
On Windows the library libclntsh.so
does not exist.
So change the line in all the source files of github.com\tgulacsi\goracle\oracle
From
#cgo LDFLAGS: -lclntsh
to
#cgo LDFLAGS: -loci
Create the liboci.a file from the oci.dll by doing
- Install Msys from Mingw if not already done
- Download
gendef
utility from http://sourceforge.net/p/mingw-w64/code/HEAD/tree/stable/v3.x/
by "Download snapshot"
- Extract the zip-file and copy the folder
gendef
to your home-directory in Msys
- go to the folder
gendef
and execute ./configure
and ./make
- gendef.exe will be created
- Run:
gendef oci.dll
- oci.def
will be generated
- Run:
dlltool -D oci.dll -d oci.def -l liboci.a
- liboci.a
will be generated
copy liboci.a C:\Oracle64Instant\sdk\lib
Build oracle with
%GOPATH%\github.com\tgulacsi\goracle\oracle>go install
You can build now your program which imports "github.com/tgulacsi/goracle/oracle"!