Конвертировать в формат представления в Oracle в PostgreSQL
Перенос базы данных из СУБД 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($а))::integer
DateAdd($дата, $формат, $дней, $месяцев, $лет)
заменяется на
$Дата + 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()
конвертируется в эквивалент в СУБД PostgreSQLRANDOM
REGEXP_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 можно здесь в любое удобное время.
Читайте также
- Xiaomi представила маршрутизатор Redmi Router AX5400 с чипом Qualcomm
- Western Digital повысила цены на флеш-память NAND — это следствие загрязнения производства в январе
- 4 вида вооружения, которые отправили в Европу из-за Украины, но никогда не испытывали в деле
- Twitter позволит вешать ярлыки на ботов, чтобы люди могли отличать их от живых пользователей
- Найдена загадочная "невидимая" черная дыра: космическая аномалия
- Новая статья: Обзор игрового 4K-монитора ASUS TUF Gaming VG28UQL1A: лучше поздно, чем никогда