Pure Go · no Instant Client · bidirectional

    The Oracle ADBC driver

    Speaks the Oracle TNS/TTC wire protocol directly, so there is nothing to install but a wheel. Move data between Oracle and GizmoSQL bidirectionally — from Python or from DuckDB — with types intact and everything streamed as Apache Arrow.

    $ pip install adbc-driver-oracle

    No Instant Client

    Speaks the native Oracle TNS/TTC wire protocol, written from scratch in Go. Nothing to install but the Python wheel — no Instant Client, no environment variables, no native tar-balls.

    Bidirectional with GizmoSQL

    Stream a table from Oracle into GizmoSQL, or push data back — in Python (ADBC to ADBC) or entirely in SQL from DuckDB via adbc_scanner.

    Exact types, streamed

    NUMBER stays exact, TIMESTAMP keeps its zone, and results move as Arrow record batches — no dataframe, no ODBC round-trip, no precision loss.

    One C API. Every language.

    The examples on this page are in Python, but ADBC exposes each driver as a C-compatible shared library — so the same native core works from Go, Rust, Java, C#, C/C++, JavaScript, and more. One driver, every stack.

    PythonGoRustJavaC#C / C++JavaScriptRRubyKotlin
    Learn more about Apache Arrow ADBC

    Get started

    One pip install, one connection string. No Instant Client, no LD_LIBRARY_PATH, no native dependencies.

    1# pip install adbc-driver-oracle  — no Oracle Instant Client required
    2import adbc_driver_oracle.dbapi as oracle
    3
    4with oracle.connect(uri="oracle://scott:tiger@localhost:1521/FREEPDB1") as conn, \
    5     conn.cursor() as cur:
    6    cur.execute("SELECT order_id, amount FROM sales.orders WHERE ROWNUM <= 10")
    7    for batch in cur.fetch_record_batch():   # streamed as Apache Arrow
    8        print(batch)

    Oracle → GizmoSQL in Python

    Because both drivers are Arrow-native, the Oracle reader feeds GizmoSQL’s bulk ingest directly. The rows stream from source to target — no pandas, no ODBC, no Oracle Client, and nothing buffered on the client. Reverse the connections to push the other way.

    GizmoSQL is just one destination. Because the reader is standard Apache Arrow, the same code streams Oracle into any ADBC-enabled target — another warehouse, DuckDB, Postgres, SQLite, or another database entirely. One interface, any source, any sink.

    1# Oracle → GizmoSQL, ADBC to ADBC — nothing materialised on the client
    2import adbc_driver_oracle.dbapi as oracle
    3import adbc_driver_gizmosql.dbapi as gizmosql
    4
    5with oracle.connect(uri=oracle_uri) as src, \
    6     gizmosql.connect(gizmosql_uri, username="token", password=token) as dst:
    7    with src.cursor() as s, dst.cursor() as d:
    8        s.execute("SELECT * FROM sales.orders")
    9        rows = d.adbc_ingest(table_name="orders",
    10                             data=s.fetch_record_batch(),   # streamed, not buffered
    11                             mode="replace")
    12        dst.commit()
    13        print(f"Loaded {rows:,} rows")

    Query Oracle live from DuckDB & GizmoSQL

    The driver is a standard ADBC c-shared library, so DuckDB’s adbc_scanner extension — and GizmoSQL, which embeds DuckDB — can ATTACH Oracle and both read it live (with projection and filter pushdown) and write back with plain SQL (USE the Oracle schema, then CREATE TABLE … AS). Credentials live in a self-contained DuckDB secret:

    -- From DuckDB or GizmoSQL (which embeds DuckDB) — read AND write Oracle live
    INSTALL adbc_scanner FROM community;
    LOAD adbc_scanner;
    
    -- credentials once, in a DuckDB secret
    CREATE SECRET ora_secret (
        TYPE adbc,
        SCOPE 'oracle://db.example.com:1521/PROD',
        driver 'oracle',                       -- registered via: python -m adbc_driver_oracle install-manifest
        uri 'oracle://db.example.com:1521/PROD',
        username 'app',
        password 's3cret'
    );
    
    ATTACH 'oracle://db.example.com:1521/PROD' AS ora (TYPE adbc);
    
    -- READ: query Oracle live (projection + filter pushdown)
    SELECT * FROM ora.SALES.ORDERS WHERE AMT > 100;
    
    -- WRITE: push straight into Oracle with plain SQL
    USE ora.SALES;
    CREATE TABLE ORDERS_2024 AS SELECT * FROM memory.staged_orders;

    Prefer credentials out of your SQL? adbc_scanner also resolves ADBC connection profiles (profile://…), as does Columnar’s adbc extension.

    Independent reimplementation. This is an independent, from-scratch Go implementation of the Oracle network protocol, built from publicly available, openly-licensed references. It contains no Oracle source code and links against no Oracle libraries. It is not affiliated with, endorsed by, or sponsored by Oracle Corporation. Oracle and Oracle Database are trademarks of Oracle Corporation.

    Oracle ADBC driver — FAQ

    Does the Oracle ADBC driver need the Oracle Instant Client?

    No. It implements the Oracle TNS/TTC network protocol directly in Go, so it installs with a single pip command — no Instant Client, no client libraries, no environment setup.

    How do I move an Oracle table into GizmoSQL?

    Open both connections and hand the Oracle cursor's Arrow reader to GizmoSQL's adbc_ingest — the rows stream from Oracle to GizmoSQL without ever landing in a dataframe or a file. It works in the other direction too.

    Can I query Oracle from DuckDB or GizmoSQL?

    Yes. The driver is a standard ADBC c-shared library, so DuckDB's adbc_scanner extension can ATTACH Oracle and query it live with projection and filter pushdown — and write back with plain SQL (USE the attached schema, then CREATE TABLE … AS). Columnar's adbc extension does the same through connection profiles. GizmoSQL embeds DuckDB, so the same works server-side.

    Which Oracle versions and types are supported?

    Oracle Database 12.1+ including 23ai, over the native protocol. It handles NUMBER, DATE/TIMESTAMP (with time zone and local time zone), INTERVAL, RAW, ROWID, LOBs, JSON (OSON), object types, XMLType, SDO_GEOMETRY (to GeoArrow WKB), and Native Network Encryption.

    Is this an official Oracle driver?

    No. It is an independent, from-scratch reimplementation of the Oracle network protocol, built from publicly available, openly-licensed references. It is not affiliated with, endorsed by, or sponsored by Oracle Corporation; Oracle and Oracle Database are trademarks of Oracle Corporation.

    Ready to move your data?

    Install GizmoSQL Core for free, pip-install the Oracle driver, and stream your first table in minutes.