Получи случайную криптовалюту за регистрацию!

Функции SQL vs Функции PL/SQL Всем привет! Вы уже задумывалис | Oracle Developer👨🏻‍💻

Функции SQL vs Функции PL/SQL

Всем привет!
Вы уже задумывались о различиях между стандартными SQL и PL/SQL функциями? «А разве, между ними существуют различия?» - спросит новичок.
Да, это разные функции и иногда они ведут себя по-разному.

В Oracle Database, как известно, есть два разных движка: для выполнения SQL-запросов и для PL/SQL-кода. Как все знают, следует избегать лишних переключения между этими движками. Чтобы таких переключений происходило как можно меньше, для SQL и PLSQL имеются свои реализации стандартных функций, описанных в документации. Они работают почти всегда одинаково и в обычной практике мы их не различаем, Например:
declare
my_var integer;
begin
select nvl(c.a, c.b) into my_var from my_table c; -- Вызов SQL-функции
my_var := nvl(my_var, 0); -- Вызов PL/SQL-функции
end;
/
Зачем нам нужно помнить о разных функциях? Причин несколько:
В PL/SQL может не оказаться соответствующей функции из SQL. Например, вы не сможете в PL/SQL-коде напрямую вызвать SQL-функции NVL2 и DECODE. Видимо, разработчики не стали включать в состав языка эти функции посчитав достаточно универсальной конструкцию CASE. Наличие интересующей функции можно проверить в пакете SYS.STANDARD. Также можно обратиться к документации на язык PL/SQL и проверить вызов на практике в обычном анонимном PL/SQL-блоке.

В SQL может не оказаться "своей" вызываемой функции. В таком случае можно попробовать обратиться к PL/SQL-функции напрямую через пакет SYS.STANDARD. Например:
select sys.standard.sqlcode from dual
В таком случае произойдёт то самое переключение контекста. Но не всякая PL/SQL-функция доступна в SQL из-за различий в поддерживаемых типах данных (Движок SQL ничего не знает о типе BOOLEAN).

Одноимённые реализации функции в SQL и PL/SQL-движках могут выдавать разные результаты. К сожалению, такое иногда встречается, поскольку каждую из реализаций внутри Oracle Database писали и поддерживали разные люди. Я натыкался на различия в результатах для функции TO_CHAR(left number, format varchar2, parms varchar2). Функции применяли разное выравнивание пробелами и приходилось прилагать дополнительные усилия, чтобы преобразование везде работало одинаково.

Пожалуйста, напишите в комментариях, встречалось ли вам что-то подобное.

Автор: @alexeionin

#функции