Перенос базы данных из СУБД Oracle в СУБД PostgreSQL должно включать в себя конвертирование представлений в целевой формат. Oracle и PostgreSQL имеют различный синтаксис и встроенный набор функций. Это приводит к тому, что возникает необходимость проводить преобразование каждого запроса перед тем, как перевести его в целевой СУБД. Некоторые модификаторы, которые используются в представлении СУБД Oracle, могут не поддерживаться СУБД. В этом случае фрагменты запросов должны быть переведены в формат СУБД PostgreSQL:
- DEFAULT
- FORCE / NO FORCE
- UNDER
- WITH CHECK OPTION
- WITH OBJECT IDENTIFIER
- WITH READ ONLY
- СУБД PostgreSQL не поддерживает представления XMLType
В Oracle существует оператор (+), являющийся синонимом для 'LEFT JOIN'. Этот оператор не поддерживается в СУБД PostgreSQL, поэтому выражения:
SELECT t1.f2, t2.f2 FROM t1, t2 WHERE t1.f1=t2.f1 (+)
необходимо преобразовать, используя 'LEFT JOIN' в соответствии со стандартом ANSI SQL:
SELECT t1.f2, t2.f2 FROM t1 LEFT JOIN t2 ON t1.f1=t2.f1
Заменить на соответствующие эквиваленты необходимо все внутренние функции Oracle, которые отсутствуют в СУБД PostgreSQL:
CURTIME()в СУБД PostgreSQL меняется наLOCALTIME(0)DAY($а)илиDAYOFMONTH($а)конвертируются вEXTRACT(day from date($а))::integerDateAdd($дата, $формат, $дней, $месяцев, $лет)заменяется на
$Дата + cast('$дней day' as interval) + cast('$месяцев months' as interval) + cast('$лет years' as interval)
HOUR($а)конвертируется вEXTRACT(hour from $А)- Функция определения позиции вхождения одной строки в другую
INSTR($строка1, $строка2)в простейшем случае конвертируется вPOSITION($строка2 in $строка1).
Более сложные преобразования подробно рассматриваются в соответствующей статье. LCASE($строка)конвертируются в эквивалентLOWER($строка)в СУБД PostgreSQL- Функция проверки вхождения одной строки в другую
LOCATE($строка1, $строка2)меняются наPOSITION($строка1 in $строка2) MINUTE($дата)конвертируется вEXTRACT(minute from $дата)MONTH($дата)конвертируется вEXTRACT(month from $дата)- Функция, заменяющая NULL на указанное значение,
NVL($выражение, $замена)преобразуется вCOALESCE($выражение, $замена) RAND()конвертируется в эквивалент в СУБД PostgreSQLRANDOMREGEXP_LIKE($строка, $шаблон)меняется на выражение$строка LIKE $шаблонSECOND($дата)конвертируется вEXTRACT(second from $дата)SUBSTR($строка, $позиция, $длина)конвертируется вSUBSTRING($строка, $позиция, $длина)SYSDATEконвертируется в эквивалент PostgreSQLCURRENT_DATE- В последних версиях PostgreSQL есть эквивалент для Oracle функции
SYS_GUID(), это функцияuuid_generate_v1(). В предыдущих версиях СУБД PostgreSQL (до 9.4) эта функция импортируется из библиотеки OSSP UUID. Универсальным решением для всех программных версий будет выражение:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
UCASE($строка)конвертируются в эквивалентUPPER($строка)в СУБД PostgreSQLWEEK($дата)конвертируется вEXTRACT(week from $дата)YEAR($дата)конвертируется вEXTRACT(year from $дата)
Узнать больше и прочитать другие полезные статьи про Oracle и СУБД PostgreSQL можно здесь в любое удобное время.
