All skills
github avatar

/reviewing-oracle-to-postgres-migration

@0b950f9 official
by githubgithub/awesome-copilot40k stars
5,040

Identifies Oracle-to-PostgreSQL migration risks by cross-referencing code against known behavioral differences (empty strings, refcursors, type coercion, sorting/collations, UNION ALL planner risks, materialized-view refresh requirements, timestamps, concurrent transactions, etc.). Use when planning a database migration, reviewing migration artifacts, or validating that integration tests cover Oracle/PostgreSQL differences.

Use this Skill: https://skilld.dev/gh/github/awesome-copilot/reviewing-oracle-to-postgres-migration

This session only. Nothing lands on disk.

referencesoracle-sysdate-sequences-dual.md

≈815 tokens on demand. Your agent reads this file only when SKILL.md points to it.

Oracle to PostgreSQL: Date Functions, Sequences, and DUAL

Problem

Oracle relies on several built-in constructs — SYSDATE, SYSTIMESTAMP, sequence NEXTVAL syntax, and the DUAL dummy table — that do not exist in PostgreSQL. Each requires a direct substitution.

SYSDATE and SYSTIMESTAMP

Oracle:

  • SYSDATE — returns the current date and time (no time zone) as an Oracle DATE type
  • SYSTIMESTAMP — returns the current timestamp with time zone

PostgreSQL:

  • Use NOW() or CURRENT_TIMESTAMP for timestamp with time zone
  • Use CURRENT_DATE for date only
  • Use LOCALTIMESTAMP for timestamp without time zone (closer to Oracle's SYSDATE semantics)
-- Oracle
SELECT SYSDATE FROM DUAL;
INSERT INTO t (created_at) VALUES (SYSDATE);

-- PostgreSQL
SELECT NOW();
INSERT INTO t (created_at) VALUES (NOW());
-- or, if the column is DATE-only:
INSERT INTO t (created_at) VALUES (CURRENT_DATE);

Warning: Oracle DATE stores date and time; PostgreSQL DATE stores date only. If Oracle columns typed as DATE carry a time component, the PostgreSQL target column should be TIMESTAMP, not DATE.

Sequence NEXTVAL Syntax

Oracle:

SELECT my_sequence.NEXTVAL FROM DUAL;
INSERT INTO t (id) VALUES (my_sequence.NEXTVAL);

PostgreSQL:

SELECT nextval('my_sequence');
INSERT INTO t (id) VALUES (nextval('my_sequence'));

Key differences:

  • PostgreSQL nextval() is a function call with the sequence name as a quoted string argument
  • Oracle uses dot notation: sequence_name.NEXTVAL
  • Oracle also has CURRVAL → PostgreSQL currval('sequence_name')
  • If the column uses a DEFAULT nextval(...) constraint (set during Phase 4 DDL migration), application code can omit the sequence call entirely and omit the column from the INSERT

DUAL Table

Oracle requires a FROM DUAL clause in SELECT statements that evaluate expressions without a real table. PostgreSQL does not have DUAL — expressions can be selected without a FROM clause.

-- Oracle
SELECT 1 + 1 FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT my_sequence.NEXTVAL FROM DUAL;

-- PostgreSQL
SELECT 1 + 1;
SELECT NOW();
SELECT nextval('my_sequence');

orafce extension: If orafce is installed, it provides a DUAL view that makes Oracle-style FROM DUAL queries work without changes. This is a useful transitional aid but should not be relied on permanently.

Migration Actions

1. Stored Procedures

  • Replace all SYSDATE / SYSTIMESTAMP references with NOW() or CURRENT_TIMESTAMP (verify column type — use LOCALTIMESTAMP if the target is TIMESTAMP WITHOUT TIME ZONE)
  • Replace sequence_name.NEXTVAL with nextval('sequence_name')
  • Replace sequence_name.CURRVAL with currval('sequence_name')
  • Remove FROM DUAL from all expression-only SELECT statements

2. Application Code (inline SQL strings)

Search C# string literals for SYSDATE, SYSTIMESTAMP, .NEXTVAL, .CURRVAL, and FROM DUAL. Apply the same substitutions.

3. Tests

  • Verify datetime assertions use timezone-safe comparisons (see oracle-to-postgres-timestamp-timezone.md for Npgsql-specific behavior)
  • Verify sequence-dependent IDs are correctly populated in assertions

Source: SKILL.md on GitHub

1 warning16d5 checks · Risk SAFE
  • Gen Agent Trust Hub16d

    No security issues detected. The skill provides reference documentation and workflows for migrating databases from Oracle to PostgreSQL.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW · No issues

  • Runlayer6mo

    2/11 files flagged

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at 0b950f9. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated 3 months ago

README badge

README badge for github/awesome-copilot/reviewing-oracle-to-postgres-migration

Identifies Oracle-to-PostgreSQL migration risks by cross-referencing code against known behavioral differences in empty strings, refcursors, type coercion, sorting, timestamps, and concurrent transactions. Use this skill when planning a migration, reviewing completed migration work, or validating that integration tests cover the semantic differences between the two databases.

Generated from the current SKILL.md.

What Oracle-to-PostgreSQL differences does this skill cover?
The skill references known behavioral differences including empty strings, refcursors, type coercion, sorting, timestamps, and concurrent transactions. Specific insights are documented in the references/ folder and screened for applicability to your migration scope.
Should I use this for planning or validation?
Both. Use the risk assessment workflow before migration to identify which differences apply to your scope. Use the validation workflow after migration to confirm each applicable difference was addressed and is covered by integration tests.
Does this automatically fix migration code?
No. The skill identifies risks and surfaces reference documentation. You review the references, decide which insights apply, and determine the fix pattern for each applicable difference.
What if a reference insight requires a design decision?
Flag it during the risk assessment step. For example, the empty-string-as-NULL difference may require choosing whether to preserve Oracle semantics or adopt PostgreSQL behavior.

Generated from the current SKILL.md. These answers refresh after source changes.