Oracle Forms & PL/SQL modernization

The logic is in the
database. We get it out.

Oracle Forms applications put years of business rules where they were easiest to write: inside PL/SQL, in the database itself. It worked — and now the rules are hard to see, hard to test, and hard to change. We surface them as a modern SPA, an API, and explicit domain services one slice at a time, parity proven before any cutover.

The stack

A whole application living in the schema.

Oracle Forms made it natural to write the application close to the data: forms wired directly to tables, triggers on every block, and the real decision-making pushed down into PL/SQL packages, procedures, and database triggers. For a long time that was an advantage. The cost shows up later. The business logic is not in an application tier you can read top to bottom — it is distributed across the database, entangled with the data it operates on, and invoked from forms whose own triggers add another layer. New channels are hard to add without going through Forms, the desktop runtime and browser plug-in era it was built for is gone, and the people who can hold the whole schema in their head are increasingly rare.

What modern looks like

Out of the schema, into a readable stack.

Forms and Reports become a modern SPA over an explicit API layer, and the rules buried in PL/SQL packages, procedures, and triggers come up into domain services you can read and test. Whether the Oracle database itself is then upgraded or re-platformed is a separate decision, made on its own merits — not forced by the move off Forms.

Forms to a modern SPA
The Forms UI becomes a modern single-page frontend designed around the task — no desktop runtime, no browser plug-in, accessible from anywhere.
PL/SQL rules to domain services
Logic spread across packages, procedures, and triggers is lifted into explicit, testable domain services, so the rules are finally readable as code rather than discovered in the schema.
A clean API layer
A cloud-native API layer fronts the data, so new channels are built once and reused instead of routing every interaction back through Forms.
The database doing data
The data platform keeps what it is genuinely good at and sheds the application it was quietly running — leaving a model you can evolve without fear.
How we do it

The slice loop, applied to Oracle Forms.

A slice is a single behavior — one form, one business process. Each is analyzed, rebuilt as a modern UI and service, validated in shadow against the Forms application, and promoted only on parity. A strangler facade shifts traffic gradually; the legacy application retires last.

01
Analyze
AI deep-reads the Forms modules, their triggers, and the PL/SQL packages, procedures, and triggers in the database where most of the rules actually live — captured as a living spec. The pass runs 10× faster than manual review: typically 12 weeks down to 2.
02
Transform
One behavior at a time — a single form, a single business process — is rebuilt as a modern UI, an API, and an explicit domain service. The logic comes up out of the database into code you can test.
03
Validate
The new slice runs against the Forms application under shadow traffic until behavior, data integrity, and the edge cases match. The parity gate stands between every slice and production.
04
Cut over
A facade in front of the legacy application shifts traffic gradually. Diverge, and it rolls back. The Forms module is decommissioned only once the modern slice is proven.
Where the advice stops
Slice-by-slice depends on being able to isolate a behavior and observe it in production. Forms makes that hard in specific ways: a rule split between a form's WHEN-VALIDATE triggers and a shared PL/SQL package, fine-grained UI events the screen fired on every keystroke, or a form wired straight into a Reports job and the batch run behind it. Where the first slice meets one of these, untangling it takes more groundwork — and that is named in Discovery, up front, not surfaced once the work is already moving. The honest boundary is part of the method. Read the full approach →