Reviewing Oracle To Postgres Migration
GitHubOfficialFirst committed by PrimedPaulDistributed by GitHub
- Skill
- Workflow
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a systematic approach to managing database migrations from Oracle to PostgreSQL. It centers on a reference-based workflow that helps developers identify behavioral differences—such as empty string handling, type coercion, and pagination logic—during the planning phase and verify that these risks are addressed during the validation phase. By cross-referencing migration artifacts against known technical discrepancies, it ensures that application logic and database schemas are correctly adapted for the PostgreSQL environment.
What it does
- Provides a risk assessment workflow for planning database migrations.
- Offers a validation workflow to confirm migration work meets PostgreSQL requirements.
- Maintains a library of known behavioral differences between Oracle and PostgreSQL.
- Guides users through documenting risks and recommended fix patterns.
- Ensures integration tests cover critical Oracle-to-PostgreSQL behavioral gaps.
- Supports decision-making for handling specific database object migrations.
When to use it
- When planning the migration of database objects like procedures, triggers, or views.
- When reviewing completed migration artifacts to ensure all behavioral risks are mitigated.
- When validating that integration tests adequately cover Oracle-to-PostgreSQL differences.
- When you need a structured checklist to gate the success of a database migration task.
Advantages
- Reduces the risk of runtime errors caused by subtle database behavioral differences.
- Standardizes the migration process across different database objects.
- Provides clear, actionable guidance for common migration pitfalls.
- Facilitates thorough testing by highlighting specific scenarios that require validation.
Usage examples
- “I am planning to migrate a set of Oracle stored procedures to PostgreSQL. How should I start?”
- The agent will guide you through the Risk Assessment workflow, helping you list affected objects and screen them against the reference index to document necessary changes.
- “I have finished migrating a query that uses ROWNUM. How do I validate this?”
- The agent will initiate the Validation workflow, prompting you to map the artifact, check it against the ROWNUM-specific reference, and verify that your integration tests cover the new LIMIT/OFFSET logic.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/github/reviewing-oracle-to-postgres-migration/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip reviewing-oracle-to-postgres-migration.zip -d .agents/skills
Documentation by PrimedPaul
Oracle-to-PostgreSQL Database Migration
Surfaces migration risks and validates migration work against known Oracle/PostgreSQL behavioral differences documented in the references/ folder.
When to use
Planning — Before starting migration work on a procedure, trigger, query, or refcursor client. Identify which reference insights apply so risks are addressed up front.
Validating — After migration work is done, confirm every applicable insight was addressed and integration tests cover the new PostgreSQL semantics.
Workflow
Determine the task type:
Planning a migration? Follow the risk assessment workflow. Validating completed work? Follow the validation workflow.
Risk assessment workflow (planning)
Risk Assessment:
- [ ] Step 1: Identify the migration scope
- [ ] Step 2: Screen each insight for applicability
- [ ] Step 3: Document risks and recommended actionsStep 1: Identify the migration scope
List the affected database objects (procedures, triggers, queries, views) and the application code that calls them.
Step 2: Screen each insight for applicability
Review the reference index in references/REFERENCE.md. For each entry, determine whether the migration scope contains patterns affected by that insight. Read the full reference file only when the insight is potentially relevant.
Step 3: Document risks and recommended actions
For each applicable insight, note the specific risk and the recommended fix pattern from the reference file. Flag any insight that requires a design decision (e.g., whether to preserve Oracle empty-string-as-NULL semantics or adopt PostgreSQL behavior).
Validation workflow (post-migration)
Validation:
- [ ] Step 1: Map the migration artifact
- [ ] Step 2: Cross-check applicable insights
- [ ] Step 3: Verify integration test coverage
- [ ] Step 4: Gate the resultStep 1: Map the migration artifact
Identify the migrated object and summarize the change set.
Step 2: Cross-check applicable insights
For each reference in references/REFERENCE.md, confirm the behavior or test requirement is acknowledged and addressed in the migration work.
Step 3: Verify integration test coverage
Confirm tests exercise both the happy path and the failure scenarios highlighted in applicable insights (exceptions, sorting, UNION ALL behavior/performance risks, refcursor consumption, concurrent transactions, timestamps, materialized-view freshness, etc.).
Step 4: Gate the result
Return a checklist asserting each applicable insight was addressed, migration scripts run, and integration tests pass.
Files
- ATTRIBUTION.mdAdded by AutoGineer913 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md3.1 KiB
- references/REFERENCE.md2.8 KiB
- references/empty-strings-handling.md2.0 KiB
- references/no-data-found-exceptions.md2.6 KiB
- references/oracle-nvl-decode-functions.md2.4 KiB
- references/oracle-parentheses-from-clause.md4.8 KiB
- references/oracle-rownum-pagination.md2.1 KiB
- references/oracle-sysdate-sequences-dual.md3.2 KiB
- references/oracle-to-postgres-sorting.md2.7 KiB
- references/oracle-to-postgres-timestamp-timezone.md8.4 KiB
- references/oracle-to-postgres-to-char-numeric.md4.2 KiB
- references/oracle-to-postgres-type-coercion.md4.9 KiB
- references/postgres-concurrent-transactions.md9.4 KiB
- references/postgres-materialized-view-refresh.md1.4 KiB
- references/postgres-refcursor-handling.md5.7 KiB
- references/postgres-union-all-planner.md1.6 KiB
references/oracle-to-postgres-to-char-numeric.md
Oracle to PostgreSQL: TO_CHAR() Numeric Conversions
Contents
Problem
Root Cause
Solution Patterns — CAST, format string, concatenation
Migration Checklist
Application Code Review
Testing Recommendations
Common Locations
Error Messages to Watch For
Problem
Oracle allows TO_CHAR() to convert numeric types to strings without a format specifier:
-- Oracle: Works fine
SELECT TO_CHAR(vessel_id) FROM vessels;
SELECT TO_CHAR(fiscal_year) FROM certificates;PostgreSQL requires a format string when using TO_CHAR() with numeric types, otherwise it raises:
42883: function to_char(numeric) does not existRoot Cause
Oracle:
TO_CHAR(number)without a format mask implicitly converts the number to a string using default formattingPostgreSQL:
TO_CHAR()always requires an explicit format string for numeric types (e.g.,'999999','FM999999')
Solution Patterns
Pattern 1: Use CAST (Recommended)
The cleanest migration approach is to replace TO_CHAR(numeric_column) with CAST(numeric_column AS TEXT):
-- Oracle
SELECT TO_CHAR(vessel_id) AS vessel_item FROM vessels;
-- PostgreSQL (preferred)
SELECT CAST(vessel_id AS TEXT) AS vessel_item FROM vessels;Advantages:
More idiomatic in PostgreSQL
Clearer intent
No format string needed
Pattern 2: Provide Format String
If you need specific numeric formatting, use an explicit format mask:
-- PostgreSQL with format
SELECT TO_CHAR(vessel_id, 'FM999999') AS vessel_item FROM vessels;
SELECT TO_CHAR(amount, 'FM999999.00') AS amount_text FROM payments;Format masks:
'FM999999': Fixed-width integer (FM = Fill Mode, removes leading spaces)'FM999999.00': Decimal with 2 places'999,999.00': With thousand separators
Pattern 3: String Concatenation
For simple concatenation where numeric conversion is implicit:
-- Oracle
WHERE TO_CHAR(fiscal_year) = '2024'
-- PostgreSQL (using concatenation)
WHERE fiscal_year::TEXT = '2024'
-- or
WHERE CAST(fiscal_year AS TEXT) = '2024'Migration Checklist
When migrating SQL containing TO_CHAR():
Identify all TO_CHAR() calls: Search for
TO_CHAR\(in SQL strings, stored procedures, and application queriesCheck the argument type:
DATE/TIMESTAMP: Keep
TO_CHAR()with format string (e.g.,TO_CHAR(date_col, 'YYYY-MM-DD'))NUMERIC/INTEGER: Replace with
CAST(... AS TEXT)or add format string
Test the output: Verify that the string representation matches expectations (no unexpected spaces, decimals, etc.)
Update comparison logic: If comparing numeric-to-string, ensure consistent types on both sides
Application Code Review
C# Example
// Before (Oracle)
var sql = "SELECT TO_CHAR(id) AS id_text FROM entities WHERE TO_CHAR(status) = @status";
// After (PostgreSQL)
var sql = "SELECT CAST(id AS TEXT) AS id_text FROM entities WHERE CAST(status AS TEXT) = @status";Testing Recommendations
Unit Tests: Verify numeric-to-string conversions return expected values
[Fact] public void GetVesselNumbers_ReturnsVesselIdsAsStrings() { var results = dal.GetVesselNumbers(certificateType); Assert.All(results, item => Assert.True(int.TryParse(item.DISPLAY_MEMBER, out _))); }Integration Tests: Ensure queries with
CAST()execute without errorsComparison Tests: Verify WHERE clauses with numeric-to-string comparisons filter correctly
Common Locations
Search for TO_CHAR in:
✅ Stored procedures and functions (DDL scripts)
✅ Application data access layers (DAL classes)
✅ Dynamic SQL builders
✅ Reporting queries
✅ ORM/Entity Framework raw SQL
Error Messages to Watch For
Npgsql.PostgresException: 42883: function to_char(numeric) does not exist
Npgsql.PostgresException: 42883: function to_char(integer) does not exist
Npgsql.PostgresException: 42883: function to_char(bigint) does not existSee Also
oracle-to-postgres-type-coercion.md - Related type conversion issues
PostgreSQL Documentation: Data Type Formatting Functions
Requirements and compatibility
Written for: GitHub Copilot
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- First committed by
PrimedPaul
- Publisher
- GitHub (Official)
- Distributed by
- GitHub
- Source
- github/awesome-copilot · skills/reviewing-oracle-to-postgres-migration · commit 797337f
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Contributors
- PrimedPaul
AutoGineer is not affiliated with or endorsed by PrimedPaul or GitHub.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download reviewing-oracle-to-postgres-migration.zip