Преобразование кода PL/SQL в код PL/pgSQL

Автоматическое преобразование кода из PL/SQL Oracle в PL/pgSQL Postgres Pro требует доработки в ora2pgpro и некоторых ручных действий. Код Perl code, используемый для преобразования, хранится в специально модуле Perl Ora2Pgpro/PLSQL.pm.

PLSQL_PGSQL

Включает/отключает преобразование PL/SQL в PL/pgSQL. По умолчанию включено.

NULL_EQUAL_EMPTY

ora2pgpro может заменять все условия с тестом на NULL вызовом функции coalesce(), чтобы имитировать поведение Oracle, где пустые строки считаются равными NULL.

(field1 IS NULL) is replaced by (coalesce(field1::text, '') = '')
(field2 IS NOT NULL) is replaced by (field2 IS NOT NULL AND field2::text <> '')

Такая замена может потребоваться, чтобы приложение работало аналогично, но рекомендуется преобразовывать пустые строки в NULL, поскольку Postgres Pro воспринимает их по-разному.

EMPTY_LOB_NULL

Включает экспорт функций empty_clob() и empty_blob() как NULL вместо пустой строки для первой и \x для второй. Если использование NULL в столбце допускается, это поможет увеличить скорость экспорта при наличии большого количества пустых больших объектов. По умолчанию точно сохраняются данные из Oracle.

PACKAGE_AS_SCHEMA

Если необходимо экспортировать пакеты как простые функции, а не схемы, можно заменить все вызовы package_name.function_name. Если отключить директиву PACKAGE_AS_SCHEMA, ora2pgpro заменит все вызовы package_name.function_name() на package_name_function_name(). По умолчанию пакеты экспортируются как схемы.

Замена будет производиться во всех операциях DDL или коде, разбираемом при преобразовании кода PL/SQL в PL/pgSQL. При этом должна быть включена директива PLSQL_PGSQL, или в командной строке передан параметр -p.

REWRITE_OUTER_JOIN

Включите эту директиву, если не работает модификация стандартного синтаксиса Oracle для OUTER JOIN (+). В этом случае ora2pgpro не будет модифицировать такой код, по умолчанию сейчас производится модификация простой формы правого внешнего соединения.

UUID_FUNCTION

По умолчанию ora2pgpro преобразует вызов функции Oracle SYS_GUID() в вызов функции uuid_generate_v4 расширения uuid-ossp. Чтобы использовать вместо неё функцию gen_random_uuid расширения pgcrypto, можно задать в качестве значения этой директивы имя функции. По умолчанию используется uuid_generate_v4.

Обратите внимание, что если обнаруживаются столбцы типа RAW(16) и RAW(32) или в столбце типа RAW стоит значение по умолчанию SYS_GUID(), ora2pgpro автоматически преобразует тип столбца в uuid, что правильно в большинстве случаев. В этом случае данные автоматически переносятся как данные типа Postgres Pro uuid, предоставляемого модулем uuid-ossp.

FUNCTION_STABLE

По умолчанию функции Oracle помечаются как STABLE, поскольку они не изменяют данные, кроме как в PL/SQL с назначением переменных или в качестве условного выражения. Отключите эту директиву, чтобы утилита ora2pgpro создавала такие функции как VOLATILE.

COMMENT_COMMIT_ROLLBACK

По умолчанию ora2pgpro оставляет вызовы COMMIT/ROLLBACK без изменений, чтобы пользователь проверил логику функции. Включите эту директиву, когда исходный код Oracle исправлен или необходимо закомментировать эти вызовы.

COMMENT_SAVEPOINT

В процедурах PL/SQL вызовам SAVEPOINT часто сопутствуют команды ROLLBACK TO savepoint_name. Когда директива COMMENT_COMMIT_ROLLBACK включена и вызовы SAVEPOINT также нужно закомментировать, включите эту директиву.

STRING_CONSTANT_REGEXP

Во время преобразования кода PL/SQL в PL/pgSQL утилитаora2pgpro заменяет все строковые константы на текст в одинарных кавычках. Если в динамических вызовах используются местозаполнители в строках, в данной директиве можно задать список регулярных выражений, которые заменяются на время разбора. Например:

STRING_CONSTANT_REGEXP         <placeholder value=".*">

Регулярные выражения в списке разделяются точкой с запятой.

ALTERNATIVE_QUOTING_REGEXP

В данной директиве задайте в качестве значения регулярное выражение с поиском подходящих строк для извлечения текстовой части, чтобы включить поддержку механизма альтернативных кавычек ('Q' или 'q'). Например, для переменной, заданной как

c_sample VARCHAR2(100 CHAR) := q'{This doesn't work.}';

следует использовать регулярное выражение:

ALTERNATIVE_QUOTING_REGEXP     q'{(.*)}'

ora2pgpro использует разделитель $$, результат будет следующим:

c_sample varchar(100) := $$This doesn't work.$$;

Значение данной директивы представляет собой список регулярных выражений, разделённых точкой с запятой. Обязательно указать часть поиска подходящих строк (в скобках) для каждого выражения, если необходимо восстановить строковую константу.

USE_ORAFCE

Включите эту директиву, если необходимо использовать функции, определённые в библиотеке orafce, и не преобразовывать вызовы этих функций с помощью ora2pgpro.

По умолчанию ora2pgpro заменяет функции add_month(), add_year(), date_trunc() и to_char(), но можно использовать версии этих функций из orafce, которые не требуют преобразования кода.

INCLUDE_PACKAGES

Содержит список экспортируемых пакетов, разделённых запятыми. Используется только с типом экспорта PACKAGE и только последнее вхождение в файле конфигурации.

EXCLUDE_PACKAGES

Содержит список исключаемых из экспорта пакетов, разделённых запятыми. Используется только с типом экспорта PACKAGE и только последнее вхождение в файле конфигурации.

POSTGRESPRO_ATX

Если задано значение 1, автономные транзакции экспортируются напрямую как автономные транзакции Postgres Pro.