--- warning: DO NOT CHANGE THIS MANUALLY, THIS IS GENERATED BY https://github.com/duckdb/community-extensions repository, check README there title: orkidea excerpt: | DuckDB Community Extensions Read, write, upsert, and alter Oracle Database tables through a Rust ADBC driver, with no Oracle client extension: name: orkidea description: Read, write, upsert, and alter Oracle Database tables through a Rust ADBC driver, with no Oracle client version: '0.1.0' language: C++ build: cmake license: Apache-2.0 excluded_platforms: "wasm_mvp;wasm_eh;wasm_threads;windows_amd64_mingw;linux_amd64_musl;linux_arm64_musl" requires_toolchains: "rust" maintainers: - hc12r repo: github: Tnsor-Labs/duckdb-orkidea # The commit tagged v0.1.0, built for DuckDB v2.0.0. ref: 4ac753a0642d2be301106daaa45c7a336635a35c docs: hello_world: | -- Store the connection in a secret (or use CONNECT_STRING with a TNS alias) CREATE SECRET ora ( TYPE orkidea, HOST 'db.example.com', PORT 1521, SERVICE 'FREEPDB1', USER 'scott', PASSWORD 'tiger' ); -- Attach the database: filters, projections, LIMIT, and top-N run in Oracle ATTACH 'ora' AS ora (TYPE orkidea); SELECT ename, sal FROM ora.emp WHERE deptno = 10 ORDER BY sal DESC LIMIT 5; -- Write to it, inside DuckDB transactions CREATE TABLE ora.top_earners AS SELECT * FROM ora.emp WHERE sal > 3000; UPDATE ora.emp SET sal = sal * 1.1 WHERE deptno = 20; INSERT INTO ora.dept VALUES (50, 'RESEARCH', 'BOSTON') ON CONFLICT DO NOTHING; -- Or run Oracle SQL directly FROM orkidea_query('ora', 'SELECT * FROM v$version'); FROM orkidea_execute('ora', 'BEGIN dbms_stats.gather_table_stats(USER, ''EMP''); END;'); extended_description: | Orkidea makes an Oracle schema behave like a DuckDB database you can change, not just read: `INSERT`, `CREATE TABLE ... AS`, `UPDATE`, `DELETE`, `RETURNING`, `ON CONFLICT`, `INSERT OR REPLACE`, `MERGE INTO`, `CREATE`/`DROP TABLE`, and `ALTER TABLE` (add, drop, and rename columns, change types, defaults, `NOT NULL`, primary keys), all inside DuckDB transactions that commit or roll back on Oracle. Defaults and identity columns are left to Oracle, and `RETURNING` gives the rows as Oracle stored them. It is built on the [Orkidea ADBC driver](https://github.com/Tnsor-Labs/orkidea-adbc), a standalone Rust implementation of Oracle's network protocol that is linked into the extension, so there is no Instant Client, OCI, or ODBC to install. Results stream into DuckDB as Arrow record batches with exact types (`NUMBER(p,s)` as `DECIMAL`, `TIMESTAMP WITH TIME ZONE` as `TIMESTAMPTZ`, LOBs, intervals, `JSON`, and `VECTOR`). - **Secrets**: host/port/service, connect strings, `tnsnames.ora` aliases, wallets, and TLS. - **ATTACH**: filters, projections, `LIMIT`, and top-N queries are pushed down to Oracle. - **Parallel scans**: large tables are read by several sessions over ROWID ranges at one SCN, so the result is a consistent snapshot. - **Federation**: join Oracle with Postgres, Parquet, or any other source DuckDB reads. - `orkidea_query` and `orkidea_execute` run Oracle SQL and PL/SQL. Not affiliated with, sponsored by, or endorsed by Oracle Corporation. extension_star_count: 0 extension_star_count_pretty: 0 extension_download_count: 34 extension_download_count_pretty: 34 image: '/images/community_extensions/social_preview/preview_community_extension_orkidea.png' layout: community_extension_doc --- ### Compatibility Matrix This table covers all DuckDB releases that have not reached [end-of-life](https://duckdb.org/release_calendar), including LTS releases, and shows the 2 most recent patch releases of each. Older patch releases are not listed, but the extension may be available for them as well.
| Platform | 1.4.4 | 1.4.5 | 1.5.5 | 1.5.6 | 2.0.0 | | :--- | :---: | :---: | :---: | :---: | :---: | | Linux AMD64 | ❌ | ❌ | ❌ | ❌ | ✅ | | Linux ARM64 | ❌ | ❌ | ❌ | ❌ | ✅ | | macOS AMD64 | ❌ | ❌ | ❌ | ❌ | ❌ | | macOS ARM64 | ❌ | ❌ | ❌ | ❌ | ✅ | | Windows AMD64 | ❌ | ❌ | ❌ | ❌ | ✅ | | Windows ARM64 | ❌ | ❌ | ❌ | ❌ | ❌ | | WebAssembly | ❌ | ❌ | ❌ | ❌ | ❌ | ### Installing and Loading ```sql INSTALL {{ page.extension.name }} FROM community; LOAD {{ page.extension.name }}; ``` {% if page.docs.hello_world %} ### Example ```sql {{ page.docs.hello_world }}``` {% endif %} {% if page.docs.extended_description %} ### About {{ page.extension.name }} {{ page.docs.extended_description }} {% endif %} ### Added Functions
| function_name | function_type | description | comment | examples | |------------------------|---------------|-------------|---------|----------| | orkidea_execute | table | NULL | NULL | | | orkidea_oracle_default | scalar | NULL | NULL | | | orkidea_query | table | NULL | NULL | | | orkidea_version | scalar | NULL | NULL | | ### Overloaded Functions
This extension does not add any function overloads. ### Added Types
This extension does not add any types. ### Added Settings
| name | description | input_type | scope | aliases | typed_value | |--------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|--------|---------|-------------| | orkidea_parallel_scan | How many Oracle sessions one scan of an attached table may read through at once: -1 chooses (DuckDB's thread count, up to 8), 0 or 1 reads through one session | BIGINT | GLOBAL | [] | -1 | | orkidea_parallel_scan_min_rows | Oracle tables with fewer rows than this (by their optimizer statistics) are read through one session | UBIGINT | GLOBAL | [] | 500000 | | temp_directory | Set the directory to which temporary files are written. | VARCHAR | GLOBAL | [] | post.db.tmp |