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.
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.
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.
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.