Мир InterBase

         

Реализация языка SQL


Здесь можно назвать сразу ряд новых возможностей, как-то: новые команды DDL (RECREATE <object>. CREATE OR ALTER <object>, ALTER VIEW), полноценную поддержку больших целых чисел (встроенный тип BIGINT, реализованный как 64-битное целое), универсальные триггеры на набор операций, возможность использования выражений в параметрах процедур, группировка по встроенным функциям (например, EXTRACT) и т. д.

Добавлены новые встроенные функции - CASE, COALESCE и NULLIF (все они являются частью SQL-стандарта). CASE является базовой для этого ряда функций и реализует условную выборку значений из списка, например:

SELECT CASE WHEN (О.TYPE = 0) THEN 'Доход' ELSE 'Расход' END FROM OPERATIONS 0

или так:

SELECT CASE 0.TYPE WHEN 0 THEN 'Доход' ELSE 'Расход' END FROM OPERATIONS 0

Стоит отметить, что у функции CASE может быть любое количество аргументов, т. е. она не ограничивается только простейшей проверкой типа "ЕСЛИ- ИНАЧЕ", например:

SELECT CASE О.TYPE WHEN О THEN 'Доход' WHEN 1 THEN 'Расход'

ELSE '---' END

FOM OPEPATIONS O

Функция COALESCE является упрощением CASE для проверки на NULL, например:

SELECT COALESCE(0. STATUS, '---') 

FROM OPERATIONS O

Результатом COALESCE будет являться первый аргумент, если он не NULL, или второй аргумент в противном случае. Функция NULLIF также является упрощением CASE, но для немного другого случая:



SELECT NULLIF(О.STATUS1, О.STATUS2) 

FROM OPERATIONS O

Результатом NULLIF будет являться NULL, если оба аргумента равны, или первый аргумент в противном случае.

Кроме встроенных функций, добавлены также новые системные переменные:

CONNECTION_ID - идентификатор текущего соединения; " TRANSACTION_ID - идентификатор текущей транзакции;

ROWS_AFFECTED - количество записей, затронутых (т. е. добавленных, исправленных или удаленных) последним выполненным оператором;

GDSCODE и SQLCODE - соответствующие коды исключений, перехваченных в блоках WHEN.

Переменные CONNECTION_ID и TRANSACTION_ID доступны во всех вариантах SQL, в то время как ROWS_AFFECTED, GDSCODE и SQLCODE - только в PSQL (т. е. в хранимых процедурах и триггерах). Клиентское приложение может получить значения упомянутых системных идентификаторов (CONNECTIONJDD и TRANSACTIONJD) через запрос, аналогичный следующему:


SELECT TRANSACTION_ID FROM RDB$DATABASE;

Также расширены возможности работы с исключениями в хранимых процедурах и триггерах с помощью команды EXCEPTION:

EXCEPTION (без параметров) - заново инициирует перехваченное в WHEN-блоке исключение;

EXCEPTION <name> <msg> - инициирует исключение с текстом, определяемым выражением msg.

Еще одним важным нововведением является поддержка точек сохранения (savepoints), действующих внутри транзакции. Этот стандартный механизм позволяет откатить не всю транзакцию, а только часть ее, выполненную после указанной точки сохранения. Для этого используются следующие SQL-команды:

SAVhPOINT <name>

и

ROLLBACK [WORK] TO [SAVEPOINT] <name>.

В настоящий момент эти команды недоступны в PSQL и могут быть вызваны только с клиентской стороны, при этом они выполняются в контексте клиентской транзакции.

Помимо всего перечисленного, интерес может представлять и возможность динамического выполнения SQL-выражений в хранимых процедурах и триггерах. Для этого используется новая команда EXECUTE STATEMENT <stmt>, где единственным параметром является строка, содержащая выполняемое SQL-выражение. Например:

stmt_var = 'update my_table set flag = 0 where parent_id = ' || 

cast (:param as varchar(10)); 

EXECUTE STATEMENT stmt_var;

Этим новые возможности в SQL не ограничиваются, но их описание выходит за рамки данной i лавы.


Содержание раздела