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
Еще одним важным нововведением является поддержка точек сохранения (savepoints), действующих внутри транзакции. Этот стандартный механизм позволяет откатить не всю транзакцию, а только часть ее, выполненную после указанной точки сохранения. Для этого используются следующие SQL-команды:
SAVhPOINT
и
ROLLBACK [WORK] TO [SAVEPOINT]
В настоящий момент эти команды недоступны в PSQL и могут быть вызваны только с клиентской стороны, при этом они выполняются в контексте клиентской транзакции.
Помимо всего перечисленного, интерес может представлять и возможность динамического выполнения SQL-выражений в хранимых процедурах и триггерах. Для этого используется новая команда EXECUTE STATEMENT
stmt_var = 'update my_table set flag = 0 where parent_id = ' ||
cast (:param as varchar(10));
EXECUTE STATEMENT stmt_var;
Этим новые возможности в SQL не ограничиваются, но их описание выходит за рамки данной i лавы.
Расширение механизма событий
Механизм оповещения о событиях (event alerters) является способом асинхронной передачи информации с сервера клиенту. Для этого клиент регистрирует свой интерес в конкретных именованных событиях и переходит в режим ожидания оповещений от сервера, который посылает ему их с помощью команды POST_EVENT, доступной в хранимых процедурах и триггерах. События посылаются сервером не сразу, а в момент подтверждения транзакции. При этом каждое событие имеет внутренний счетчик инициации, т. е. если в течение транзакции команда POST_EVENT для данного события была вызвана несколько раз, то клиенту будет доставлено оповещение только однажды, но его счетчик будет содержать количество инициации. Для работы с событиями на клиентской стороне используются следующие функции API: isc_event_block, isc_que_events, isc_wait_for_ event и isc_event_counts.