Skip to content
dbSlice®
Product Who it's for Performance Pricing Blog Guides Support Buy dbSlice

dbSlice / Migrate

Oracle to PostgreSQL data migration, on Windows

Copy Oracle tables into PostgreSQL from a Windows app or the command line, then keep PostgreSQL in sync with Oracle until the day you switch. No Oracle client to install, no Perl, no agents on the servers.

Try it free on the Microsoft Store ↗ See pricing

At a glance

  • What it does: copies Oracle tables into PostgreSQL from a Windows app or the command line, then keeps them in sync until cutover.
  • Engines: Oracle to PostgreSQL with no Oracle client to install; also works with SQL Server, MySQL, MariaDB, Firebird, SQLite and InterSystems IRIS.
  • What it does not do: convert PL/SQL, triggers, views or packages; capture changes in real time; or run the Windows app on Linux or macOS (for Linux servers there is a Docker edition, sold as a project: talk to us).
  • Free or paid: try it in the free Microsoft Store version (no license key); writing to a target database needs a Desktop or Server license.

Use dbSlice for the data, a converter for the code

An Oracle to PostgreSQL project has two halves:

  • Code: PL/SQL packages, procedures, triggers and views have to become PL/pgSQL. Tools such as ora2pg or AWS Schema Conversion Tool handle that, and some of it is manual work. dbSlice does not convert code.
  • Data: every row has to arrive with the right types, keys and counts, often more than once while the project runs. That is the part dbSlice does.
dbSlice Synchronize tab

What dbSlice does

  • Connects without an Oracle client. There is no Instant Client or tnsnames.ora to set up on your Windows machine.
  • Reads in small batches, so the production database keeps serving its users instead of carrying one long-running export.
  • Writes to PostgreSQL in bulk for initial and full loads.
  • Shows the target DDL. If the PostgreSQL table does not exist, dbSlice stops before writing and shows a CREATE TABLE translated from Oracle for your DBA to review and run. It does not create objects in your databases by itself.
  • Keeps ids safe. After copying rows with their original ids, a PostgreSQL sequence can be behind the highest id. dbSlice warns and shows the command to move it forward, and can apply it if you allow it.
  • Masks on the way when the copy is for development or testing.

Review these types in the suggested DDL

The suggested CREATE TABLE is a starting point. Two Oracle types need a decision from your DBA before you run it:

  • DATE in Oracle stores a date and a time, so dbSlice suggests TIMESTAMP. If a column only ever holds dates, you can change it to DATE.
  • NUMBER without precision is suggested as plain NUMERIC, which never cuts a value. For ids and counters, INTEGER or BIGINT is smaller and faster; pick them where you know the range.

Also worth knowing: Oracle stores an empty string as NULL, so those values arrive in PostgreSQL as NULL, not as ''.

How column types are suggested

OracleSuggested in PostgreSQLReview before running
NUMBER(p,s)NUMERIC(p,s)NUMBER(p,0) ids: INTEGER or BIGINT
NUMBER (no precision)NUMERICSee above
FLOAT, BINARY_FLOAT, BINARY_DOUBLEDOUBLE PRECISION—
DATETIMESTAMPDATE if there is never a time part
TIMESTAMP(n)TIMESTAMP—
TIMESTAMP WITH TIME ZONETIMESTAMPChange to TIMESTAMPTZ if the zone matters
VARCHAR2(n), NVARCHAR2(n), CHAR(n), NCHAR(n)VARCHAR(n)Length in characters; CHAR padding is not kept
CLOB, NCLOBTEXT—
BLOB, RAW, LONG RAWBYTEA—
LONGTEXT (from version 2.3.20261030.1528)—
INTERVAL, ROWID, XMLTYPE, spatial typesTEXTConvert in a SELECT source if you need the value

It is a starting point, not a final schema: keys, indexes and constraints are yours to add.

Common errors and what they mean

  • numeric field overflow — a NUMBER value does not fit the precision chosen in the CREATE TABLE. Widen it, or use plain NUMERIC.
  • null value in column … violates not-null constraint — Oracle stored an empty string, which is NULL in Oracle. Allow NULL in that PostgreSQL column, or use a SELECT source with NVL(column, ' ').
  • duplicate key value violates unique constraint … _pkey after the copy — the sequence is behind the highest id. Run the command dbSlice shows, or tick "Adjust the id generator afterwards" before the run if your user is allowed to change the sequence.
  • ORA-01555: snapshot too old on a very long read — Oracle could not keep the read consistent for that long. Split the copy (a SELECT with a key range) or ask your DBA about undo retention.

Step by step

  1. Connect to Oracle (host, port, service name, user) and to PostgreSQL.
  2. Pick the source table or write a SELECT, and the target table.
  3. Choose the key column used to match rows.
  4. Choose the mode: Initial load the first time, then Upsert or Insert new.
  5. Check before writing: Record Diff compares keys on both sides.
  6. Run it, or save the job and run it from the CLI on a schedule.

Keep both in sync until cutover

Oracle usually stays in production while the new system is tested. Schedule an Upsert job every night; with a column that only grows (a timestamp or a sequence), each run reads only rows above the last value it saw. Deletes in Oracle are not detected by incremental runs, so plan a full comparison or a reload before the switch. Details: Sync Oracle to PostgreSQL.

What dbSlice does not do

  • Convert PL/SQL, triggers, views or packages.
  • Real-time change capture. Runs are batch jobs, on demand or scheduled.
  • Run on Linux or macOS. The Windows app and CLI run on Windows; for Linux servers there is a Docker edition, sold as a project (talk to us). The databases can be anywhere it can reach.

FAQ

Does dbSlice convert PL/SQL, packages or triggers?

No. Use ora2pg, AWS SCT or manual work for code; use dbSlice for the data and the sync until cutover.

Do I need the Oracle Instant Client?

No. dbSlice connects with host, port, service name and user.

Can Oracle stay in production during the migration?

Yes. dbSlice reads in small batches, and nightly Upsert or new-rows-only runs keep PostgreSQL close to Oracle until you switch.

Does it create the tables in PostgreSQL?

Not by default. It stops before writing and shows a CREATE TABLE for your DBA to review and run.

Can I try it before buying?

Yes. The free Microsoft Store version needs no license key; writing to a target database needs a Desktop or Server license.

Also works for

Oracle to SQL Server, MySQL, MariaDB, Firebird, SQLite or InterSystems IRIS, and back into Oracle. For SQL Server sources, see Sync SQL Server to PostgreSQL.

Try it on your own data: the free Microsoft Store version needs no license key.

Try free on the Microsoft Store ↗Buy dbSlice

Related guides

  • Sync SQL Server to PostgreSQL
  • Sync Oracle to PostgreSQL
  • Export InterSystems Caché and IRIS data to PostgreSQL
  • MySQL to PostgreSQL migration
  • Sync Oracle to PostgreSQL
  • Masked staging copy
dbSlice®

Professional data synchronization, migration and reconciliation — for Windows and Linux (Docker).

A Thinwork product

Product

Product Pricing Guides Linux (Docker) Release notes Free version (Microsoft Store) Support FAQ Renew maintenance CLI examples

Legal

Terms of Use Privacy Policy Refund Policy EULA

Company

THINWORK TECNOLOGIA DA INFORMACAO - LTDA
CNPJ 09.166.605/0001-21
Since 2007

Av. Paulista, 1471, Conj. 511, Anexo CP 1722
Bela Vista, São Paulo - SP, 01311-927, Brazil

Sales

+55 (11) 5197-7969 [email protected]

Support hours: Mon–Fri, 9:00–17:00 (UTC−3)

github.com/thinwork Follow @dbsliceapp
© 2026 dbSlice®. All rights reserved. Windows x64 · GUI + CLI · Linux (Docker) · Web

dbSlice® and the dbSlice pizza mascot logo are registered trademarks of Thinwork Tecnologia da Informação Ltda. with the Brazilian National Institute of Industrial Property (INPI).

All other product names, logos and brands are the property of their respective owners and appear here only to identify the systems dbSlice works with. dbSlice is an independent product, not affiliated with, sponsored or endorsed by them. Learn more