Что в Oracle
В PostgreSQL
Работа
Что делаем
Что в OracleПакеты PL/SQLспецификация, тело, переменные пакета
В PostgreSQLСхема с функциями; в обычном PostgreSQL аналога пакета нет
РаботаПереписать
Что делаемРаскладываем по схемам, состояние пакета (переменные на время сессии) выносим в параметры, временные таблицы или настройки сессии; проверяем порядок инициализации
Что в OracleПроцедуры, функции, триггерыPL/SQL
В PostgreSQLPL/pgSQL
РаботаПереписать
Что делаемЯзык близкий, но не тот же: иначе устроены ошибки, курсоры, коллекции и триггеры. Конвертер даёт черновик, человек читает и переписывает; результаты сравниваем на одинаковых входных данных
Что в OracleАвтономные транзакцииPRAGMA AUTONOMOUS_TRANSACTION
В PostgreSQLВ обычном PostgreSQL встроенного аналога нет
РаботаПереосмыслить
Что делаемВыясняем, зачем они нужны (чаще всего для журнала и аудита), и заменяем отдельным соединением, очередью или переписанной логикой
Что в OracleИерархические запросыCONNECT BY, LEVEL
В PostgreSQLWITH RECURSIVE
РаботаПереписать
Что делаемПорядок обхода и защиту от циклов задаём явно: сами они не появятся
Что в OracleROWNUM, ROWID, DUALи функции NVL, DECODE, SYSDATE
В PostgreSQLLIMIT, coalesce, CASE, clock_timestamp()
РаботаЗаменить
Что делаемЧасть функций даёт расширение orafce. Заменяем в коде базы и в SQL приложений; если где-то используется ROWID, выясняем, чем заменить ключ. DECODE переносим в CASE осторожно: DECODE считает два NULL равными, а CASE нет
Что в OracleВнешние соединения (+) и MERGE
В PostgreSQLJOIN, INSERT … ON CONFLICT
РаботаПереписать
Что делаемMERGE появился в новых версиях PostgreSQL, но ведёт себя не во всём как в Oracle (уточняйте для своей версии). Проверяем под параллельной нагрузкой: именно там расходятся блокировки и обработка одновременных вставок (возможны ошибки уникальности, поэтому часто берут INSERT … ON CONFLICT)
Что в OracleПоследовательности и столбцы идентификации
В PostgreSQLSequence, identity
РаботаПеренести
Что делаемПереносим текущие значения с запасом и проверяем, что ключи не повторятся. Пропуски номеров допустимы и там, и там
Что в OracleТипы данныхNUMBER, DATE, VARCHAR2, CLOB, RAW
В PostgreSQLnumeric, integer, bigint, timestamp, varchar, text, bytea
РаботаПодобрать
Что делаемТип подбираем по реальным значениям и по тому, как столбец используется, а не по названию. NUMBER без точности «в лоб» в numeric — это медленнее целочисленных типов
Что в OracleСинонимы и ссылки на другие базыsynonym, database link
В PostgreSQLsearch_path, представления, postgres_fdw, dblink
РаботаЗаменить
Что делаемРешаем по каждой ссылке: убрать, заменить обменом или оставить через fdw. Смотрим, что фактически уходит на удалённую сторону
Что в OracleВстроенные пакетыDBMS_OUTPUT, DBMS_LOCK, UTL_FILE, UTL_HTTP, DBMS_SQL
В PostgreSQLЧастично расширение orafce и сама СУБД
РаботаЗаменить
Что делаемСнимаем список реально вызываемых, для каждого выбираем замену (расширение или логика в приложении) и проверяем её на данных
Что в OracleЗадания планировщикаDBMS_SCHEDULER, DBMS_JOB
В PostgreSQLpg_cron или внешний планировщик
РаботаПеренести
Что делаемВстроенного планировщика в ядре нет. Переносим расписания, добавляем защиту от двойного запуска и оповещение о неудачном запуске
Что в OracleСекционирование
В PostgreSQLДекларативные секции
РаботаНастроить
Что делаемДиапазонные, списочные и хэш-секции есть; автоматического создания секций по интервалу в ядре нет. Создание секций делаем заданием или расширением и проверяем планы запросов по секциям
Что в OracleПодсказки, планы, статистикаоптимизатор
В PostgreSQLПланы строятся иначе; подсказок в ядре нет
РаботаНастроить
Что делаемЕсть сторонние расширения вроде pg_hint_plan. Снимаем планы до и после, правим индексы, статистику и сами запросы; подсказки — последняя мера
Что в OracleКодировка и сортировкаNLS_CHARACTERSET, NLS_SORT
В PostgreSQLКодировка базы (обычно UTF-8), правила сортировки ОС или ICU
РаботаПроверить
Что делаемПроверяем длины полей (в байтах или в символах), порядок строк с кириллицей, регистронезависимый поиск и регистр имён объектов (без кавычек Oracle хранит их в верхнем регистре, PostgreSQL — в нижнем): на данных, а не по документации