Новости партнеров

Конвертировать в формат представления в 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() конвертируется в эквивалент в СУБД PostgreSQL RANDOM
  • REGEXP_LIKE($строка, $шаблон) меняется на выражение $строка LIKE $шаблон
  • SECOND($дата) конвертируется в EXTRACT(second from $дата)
  • SUBSTR($строка, $позиция, $длина) конвертируется в SUBSTRING($строка, $позиция, $длина)
  • SYSDATE конвертируется в эквивалент PostgreSQL CURRENT_DATE
  • В последних версиях PostgreSQL есть эквивалент для Oracle функции SYS_GUID(), это функция uuid_generate_v1(). В предыдущих версиях СУБД PostgreSQL (до 9.4) эта функция импортируется из библиотеки OSSP UUID. Универсальным решением для всех программных версий будет выражение:

    SELECT md5(random()::text || clock_timestamp()::text)::uuid
  • UCASE($строка) конвертируются в эквивалент UPPER($строка) в СУБД PostgreSQL
  • WEEK($дата) конвертируется в EXTRACT(week from $дата)
  • YEAR($дата) конвертируется в EXTRACT(year from $дата)

Узнать больше и прочитать другие полезные статьи про Oracle и СУБД PostgreSQL можно здесь в любое удобное время.

Автор: Олег Писарев
30.06.2017 (07:02)
Зеленые технологии

Лента новостей

Все права защищены © 2005-2017

"Supreme2.Ru" - новости для гиков

Контакты  | Policy  | Map Index

Использование любых материалов, размещенных на сайте, разрешается при условии ссылки на Supreme2.Ru. Для интернет-изданий - обязательна прямая открытая для поисковых систем гиперссылка. Ссылка должна быть размещена в независимости от полного либо частичного использования материалов. Материалы в рубрике "Новости партнеров" публикуются на правах рекламы.