sqling Engine
Run PL/SQL on SQLite, DuckDB, or Postgres.
sqling Engine is a PL/SQL interpreter that does not need
Oracle underneath it. Procedures, packages, cursors, exception handlers,
collections, SQL/XML, SQL/JSON, row triggers, and the (+)
outer-join notation all accepted — because the interpreter implements
PL/SQL itself and translates the embedded SQL to whichever backend you
hand it.
Where this helps
-
CI without an Oracle box
PL/SQL regression tests that need an Oracle instance block every feature branch waiting for a slot. sqling Engine runs them in-process on a developer laptop or a CI worker — same packages, same cursors, same trigger lifecycle, no licensing drama.
-
Migration pipelines
You are translating a legacy schema to Postgres and need to verify that the stored functions still behave. The
--rewrite postgresflag emits the exact SQL text your target would see; the embedded interpreter runs the surrounding PL/SQL against SQLite in a test harness. -
Embeddable PL/SQL
Oracle Reports and Oracle Forms are built on PL/SQL. If you are writing a reader for either (or anything else that needs PL/SQL semantics in a non-Oracle context), sqling Engine is the piece you plug in instead of writing one.
What it accepts
-
The PL/SQL language
Anonymous blocks, packages and bodies, standalone procedures and functions, cursors (explicit and implicit),
FOR ... INloops, collections (VARRAY, nested table, index-by table), exception handlers (named andSQLCODE-based), records and%ROWTYPE. -
Oracle's SQL surface
SQL/XML (
XMLELEMENT,XMLAGG,XMLATTRIBUTES,EXTRACTVALUE), SQL/JSON (JSON_OBJECT,JSON_ARRAYAGG,JSON_TABLE,JSON_VALUE, …),MERGE,CONNECT BY's simpler forms,(+)outer joins, hierarchical cursors. -
Oracle's command surface
CREATE OR REPLACEfor procedures, functions, packages, views, triggers, sequences, directories;GRANT/REVOKEfor the DBA_* dictionary; row-level triggers with:NEW/:OLDonINSERT,UPDATEandDELETE;SET SERVEROUTPUT,SET SQLFORMAT,SET DEFINE,SPOOL.
Try it right now
PL/SQL Playground loads sqling Engine into your
browser and runs PL/SQL against SQLite or Postgres (pgLite) —
in your own tab, nothing uploaded. The
Translate button there is the same rewrite surface the CLI
exposes as --rewrite BACKEND: PL/SQL in, target-dialect
SQL out. Several examples (quick start, the language tour, SQL
cursors and transactions, SET SQLFORMAT, HTP web pages, SQL/XML and
SQL/JSON) are preloaded.
The CLI
For scripts and pipelines, sqling Engine ships as a signed Python
wheel we provide under a licence agreement. Installing it drops a
sqling command onto your PATH; from there
the usage is standard.
# Run a script against an in-memory SQLite: $ sqling script.sql # Persist to a file, pick the DuckDB backend: $ sqling -d app.db --engine duckdb script.sql # Translate PL/SQL to the backend you plan to migrate to: $ sqling --rewrite postgres -c "SELECT NVL(x,0), DECODE(c,1,'one','other') FROM t" SELECT COALESCE(x, 0), CASE WHEN (c) IS NOT DISTINCT FROM ( 1) THEN ( 'one') ELSE ( 'other') END FROM t;
Embed it
For a product that needs PL/SQL semantics in-process:
from sqling_engine import Interpreter # exact module name
# documented with the licence
db = Interpreter(database="app.db", capture_output=True)
db.run_source(open("procs.sql").read())
total = db.call("order_total", 1234)
for line in db.take_output():
log.info(line)
Point it at an existing driver connection with
Interpreter(connection=my_conn) and PL/SQL shares the
transaction with the host app.
Running PL/SQL where Oracle isn't an option?
Pilot licences, custom builds, and embedding support available for product teams and migration vendors. Contact Data Design Group.