Oracle 9i to 26ai in one binary — Thick mode auto-discovery explained
How Veesker bundles Oracle Instant Client, auto-detects Thick mode, and connects to every Oracle version from 9.2 to 26ai without driver gymnastics.

The most common Oracle connectivity failure mode is not a credentials problem or a firewall rule. It is a driver mismatch. An IDE that ships a Thin-mode JDBC driver silently fails to negotiate an 11g handshake. A tool that bundles node-oracledb in Thin mode simply cannot reach anything older than Oracle 12.1. The developer stares at ORA-12541: TNS: no listener or a bare connection timeout, and spends an afternoon suspecting the wrong layer.
Veesker takes a different position: ship the right Oracle Instant Client, always initialize Thick mode, let the OCI library handle the rest. This post explains what that means, how the auto-discovery works, and why the version spectrum from 9.2 to 26ai is a solved problem once you commit to the right architecture.
Thin mode and Thick mode: the actual difference
Oracle’s official drivers — including the current versions of node-oracledb, python-oracledb, and JDBC — offer two modes of operation.
Thin mode is a pure protocol reimplementation. No native library required, ships as a standard package dependency, works in any environment you can install npm or pip. The trade-off is that the reimplementation targets the modern Oracle wire protocol. At the time of writing, Thin mode in node-oracledb supports Oracle Database 12.1 and later. The 9.2, 10g, and 11g installations that still power significant enterprise Oracle estates are simply unreachable in Thin mode.
Thick mode uses the Oracle Call Interface (OCI): a C library that Oracle has shipped and kept backward-compatible for decades. When your driver initializes Thick mode, the OCI library owns the wire protocol negotiation with the server. Oracle Instant Client 21c and later can connect to Oracle Database 9.2. The compatibility window is the full span of Oracle versions that still receive kernel patches or for which someone still cuts paychecks.
The reason Thin mode cannot cover that range is not laziness on the driver maintainers’ part. Fully reimplementing a wire protocol that has accumulated twenty-plus years of backward-compatibility extensions is not a one-sprint project. Thick mode offloads that complexity to Oracle’s own library, which carries the obligation of preserving it.
Bundling the Instant Client: what Veesker actually ships
A standard Oracle Thick mode setup requires the user to install Oracle Client or Instant Client separately — a full product install on Windows, or a manual extraction of the BasicLite ZIP on macOS and Linux, followed by updating PATH, LD_LIBRARY_PATH, or DYLD_LIBRARY_PATH. That is a tractable operation for a veteran Oracle DBA. It is a significant friction point for the developer who wants to open a connection to an unfamiliar system without a half-day Oracle Client install ritual.
Veesker bundles the Instant Client libraries inside the application package. On first launch, the binary resolves the library path to that bundled location and calls the OCI initialization routine before any connection is attempted. From that point forward, every connection in the session runs in Thick mode automatically.
No user-facing configuration is required. No ORACLE_HOME environment variable. No tnsnames.ora in a system directory. The libraries are colocated with the Veesker executable, the path is resolved at startup, and the connection works.
The bundled client is the current Oracle Instant Client version, which covers 26ai features on new connections while retaining OCI’s full backward-compatibility range for legacy servers. That is not a Veesker design decision; it is the contract Oracle ships with every Instant Client release.
The version handshake and what Veesker reads from it
Once OCI negotiates the session, Oracle returns the server version in the connect packet. Veesker reads that version string immediately after the connection is established and attaches it to the connection object. A string like 11.2.0.4.0, 19.23.0.0.0, or 23.7.0.0.0 becomes the single source of truth for everything that follows in that session.
Two things branch on that version.
Feature gating in the UI. Oracle 12c introduced Pluggable Databases. Veesker’s object tree shows the CDB root and PDB list on 12c and later; on 11g and earlier, that layer is not present because the server has no concept of it. Oracle 21c added native binary JSON storage. Oracle 23ai and 26ai introduced vector data types and JSON Relational Duality Views. The schema browser reflects what the connected server actually has — not a generic 23ai superset that confuses a developer on 11g.
AI context. Veesker’s AI layer includes the detected server version in every prompt context sent to the model. If the database is 11g, the AI will not suggest FETCH FIRST N ROWS ONLY (12c syntax) or JSON functions that did not exist in 2011. If the database is 23ai, it will offer vector search patterns using VECTOR_DISTANCE and embedding column definitions. The model is grounded in what the server actually is, not what Oracle happens to be at peak marketing moment.
Edge cases that trip up other tools
TNS names resolution without a full Oracle Home. Standard client behavior resolves tnsnames.ora from $ORACLE_HOME/network/admin. When there is no Oracle Home — which is the common case when Instant Client is bundled or installed as a ZIP — the resolution fails silently, and the error looks like a network problem. Veesker resolves tnsnames.ora from a user-configurable directory (the same path where you drop a wallet). EZConnect strings in the form host:port/service_name work without any TNS file and are the default for new connection profiles.
Wallet-based mTLS. Many enterprise Oracle environments, and all Oracle Cloud infrastructure connections, require an Oracle wallet (cwallet.sso or ewallet.p12). Veesker accepts a wallet directory in the connection profile and passes it to OCI via the relevant SSL parameters. The wallet path is stored in the OS credential store — DPAPI on Windows, Keychain on macOS, Secret Service on Linux — alongside the password. Nothing goes in a plaintext config file.
SYSDBA and SYSOPER connections. Administrative session roles require Thick mode; Thin mode does not support AS SYSDBA at all. Veesker exposes the connection role as a dropdown: Normal, SYSDBA, SYSOPER, SYSBACKUP, SYSDG. The role is passed to OCI at connect time. The connection tab chrome changes visually to signal that the session carries elevated privileges — a small detail that matters when you have eight tabs open and one of them can DROP DATABASE.
Version-specific package signatures. Some Oracle built-in packages picked up new required parameters across major versions. DBMS_STATS.GATHER_TABLE_STATS is not the same procedure on 11g as on 19c. Veesker’s hover documentation for PL/SQL package calls is version-aware: the parameter list displayed corresponds to the version the connection reported, not the latest Oracle docs page.
What this looks like in a mixed estate
The representative scenario: a senior developer maintains four connections simultaneously. An 11g read replica for a legacy reporting system. A 19c production OLTP database. A 23ai sandbox for a vector search pilot. A 26ai Cloud instance for the next migration target.
In Veesker, those four connections live in the same window, each version-aware, each offering the correct feature set and AI grounding, none requiring a separate driver install or a different tool. The binary does not change. The Instant Client bundled inside it covers the full range. The version handshake at connection time does the rest.
That is the concrete definition of “9i to 26ai in one binary.” Not a bullet point on a feature grid, but an architecture decision made once — always Thick mode, always bundled client, always version-aware behavior downstream — so the developer never has to make it again.
Download Veesker and connect to your mixed-version Oracle estate without a separate client install: veesker.cloud/download.
— Veesker