pgrecon, an Apache-2.0 licensed Oracle to PostgreSQL migration assessment and schema conversion tool, is now public. The current release is 0.7.3.
pgrecon works entirely offline. A reviewable, read-only SQL*Plus script produces a dump, and the tool builds a local inventory from it; it never connects to either database. A deterministic rule engine runs 80 rules over the inventory, covering data types and length semantics, storage and partitioning, PL/SQL constructs (parsed with a full grammar, not pattern matching), supplied-package usage, schema objects, and performance posture, each with line-level evidence and remedy guidance. An effort estimator produces person-day ranges from named components with stated assumptions.
The converter emits plain PostgreSQL DDL for what it can prove: tables with native partition children, constraints, indexes, sequences, views (CONNECT BY hierarchies become WITH RECURSIVE), materialized views, comments, grants, simple DML triggers, and standalone routines, now including ROWNUM top-N bounds as LIMIT and MERGE statements. Everything it cannot carry faithfully is a named line in a residue report, never emitted DDL.
Verification: the full extraction path is verified nightly in CI against Oracle XE 11g, XE 21c, and Oracle Free 23ai; converted output is applied to PostgreSQL 16, 17, and 18 on every commit; a schema fuzzer generates adversarial Oracle estates nightly and checks that nothing crashes, nothing is lost silently, and the DDL applies; and the public benchmark row is measured by a workflow in the repository, which installs Oracle's HR, OE and CO samples plus utPLSQL, PLJSON, Logger and Alexandria into a live Oracle XE 21c, extracts, converts, and applies to PostgreSQL 16: 423 statements, zero rejected, at 0.7.3. Both extraction script tiers capture character versus byte length semantics, so VARCHAR2(30 CHAR) maps to varchar(30).
Oracle 9.2 through 23ai are supported through two extraction script tiers; Python 3.11 or newer on the analysis side.
Install: pip install pgrecon