Rinka777 |
---|
roadster |
---|
слышал о том, что PL/SQL код ложится ровно, а вот с SQL придётся разобраться. | не может быть. |
не может быть, что он слышал?
Для начала, надо определиться, что есть plsql (plpgsql). Рассматривать его в отрыве от sql несколько странно, то есть переводить-то хранимки придется вместе с sql. То есть, чтобы plsql лег ровно, нужно, чтобы sql вообще лежал ровнее некуда.
Но даже в отрыве... Начнем с того, что в pg нет
процедур! В plpgsql нет управления транзакциями (commit, rollback, автономки). Из курсорных атрибутов доступен только безымянный FOUND. Пакеты? С точки зрения именования их отсутствие эмулируется размещением в отдельной схеме, но пакетных переменных от этого не появляется. Приведение типов в большинстве случаев требует явной конверсии, с одной стороны компилятор скажет о проблемах, с другой, при многообразии числовых типов, можно получить тихие неожиданности с целочисленным делением. NULL и пустая строка различны - вычищать все ||-конкатенации в коде с обрамлением nullable-аргументов coalesce(..., '') или заменой на concat.
Коллизия имен между переменными plpgsql и sql по умолчанию приводит к ошибке, это замечательно, но тело хранимки в ddl это строка(!), и просто так имя хранимки ничего не значит внутри этой строки (хотя передачу параметров по имени все же сделали), чтобы сослаться в запросе на ИмяФункции.Переменная нужно добавить к блоку метку <<ИмяФункции>>. Проверки зависмостей от объектов при компиляции нет, так что не экономьте на тестировании редкопроходимых ветвей, даже простых exception when ... Кстати, логику работы с ними тоже придется пересмотреть из-за различий в исключениях. К тому же, по умолчанию select into не рейзит исключений, что строк нет или их больше одной.
Еще особенность строково-литеральности тела функции - заголовок не хранится как его указали при создании. То есть реверс-ddl потеряет комментарии промеж параметров, форматирование и даже типы и выражения для default будут переписаны на эквиваленты по усмотрению клиентского инструмента. Последнее замечание, это уже к дисциплине процесса разработки...
Таких мелочей тонны. Ах да, нет поддержики вложенных функций и обсуждать на форуме это - оскорбление чувств верующих.