FirebirdSQL logo

RESETTING

Доступно в

PSQL

Синтаксис
RESETTING
Тип возвращаемого результата

BOOLEAN

Контекстная переменная RESETTING доступна только коде триггеров на события ON CONNECT и ON DISCONNECT, и может использоваться в любом месте, где можно использовать логический предикат.Системная переменная RESETTING, позволяет обнаружить случай, когда триггер базы данных срабатывает из-за сброса сеанса, например с помощью оператора ALTER SESSION RESET.Её значение TRUE, если выполняется сброс сеанса, и FALSE в противном случае.

Example 1. Использование переменной RESETTING
...
IF (RESETTING) THEN
BEGIN
  -- выполняется сброс сеанса
END
...
См. также:

ALTER SESSION RESET.

ROW_COUNT

Доступно в

PSQL

Синтаксис
ROW_COUNT
Тип возвращаемого результата

BIGINT

Контекстная переменная ROW_COUNT содержит число строк, затронутых последним оператором DML(INSERT, UPDATE, DELETE, SELECT или FETCH) в текущем триггере, хранимой процедуре или исполняемом блоке.

Поведение с SELECT и FETCH:

  • После выполнения singleton SELECT запроса (запроса, который может вернуть не более одной строки данных),ROW_COUNT равна 1, если была получена строка данных и 0 в противном случае;

  • В цикле FOR SELECT переменная ROW_COUNT увеличивается на каждой итерации (начиная с 0 в качестве первого значения);

  • После выборки (FETCH) из курсора, ROW_COUNT равна 1, если была получена строка данных и 0 в противном случае. Выборка нескольких записей из одного курсора не увеличивает ROW_COUNT после 1.

Important

Переменная ROW_COUNT не может быть использована для определения количества строк, затронутых при выполненииоператоров EXECUTE STATEMENT или EXECUTE PROCEDURE.Для оператора MERGE переменная ROW_COUNT будет содержать 0 или 1, даже если было затронуто более записей

Warning

Не используйте переменную ROW_COUNT внутри DML операторов.Дело в том, что эта переменная сбрасывает своё значение в 0 перед началом выполнения любого DML оператора, а потому вы можете получить не то что ожидаете.

...
UPDATE t2 SET
    evt='upd',
    old_id = old.id, old_x = old.x,
    new_id = new.id, new_x = new.x
WHERE new_id = old.id;

INSERT INTO t2log(evt, affected_rows) VALUES('upd', ROW_COUNT);
...

В вышеприведённом примере в столбец affected_rows будут записаны нулевые значения, даже если оператором UPDATE были затронуты строки.Для того чтобы исправить эту ошибку, необходимо сохранить значение контекстной переменной ROW_COUNT в локальную переменную PSQL модуля и использовать эту локальную переменную в DML операторе.

...
DECLARE rc INT;
...
UPDATE t2 SET
    evt='upd',
    old_id = old.id, old_x = old.x,
    new_id = new.id, new_x = new.x
WHERE new_id = old.id;

rc = ROW_COUNT;
INSERT INTO t2log(evt, affected_rows) VALUES('upd', rc);
...
Example 1. Использование переменной ROW_COUNT
...
UPDATE Figures SET Number = 0 WHERE id = :id;
IF (row_count = 0) THEN
  INSERT INTO Figures (id, Number)
  VALUES (:id, 0);
...

SQLCODE

Доступно в

PSQL

Синтаксис
SQLCODE
Тип возвращаемого результата

INTEGER

В блоках обработки ошибок WHEN …​ DO контекстная переменная SQLCODE содержит текущий код ошибки SQL.До Firebird 2.0 значение SQLCODE можно было получить только в блоках обработки ошибок WHEN SQLCODE и WHEN ANY.Теперь она может быть отлична от нуля в блоках WHEN GDSCODE и WHEN EXCEPTION при условии, что ошибка, вызвавшее срабатывание блока, соответствует коду ошибки SQL.Вне обработчиков ошибок SQLCODE всегда равен 0, а вне PSQL не существует вообще.

Example 1. Использование переменной SQLCODE
...
WHEN ANY DO
BEGIN
  IF (SQLCODE <> 0) THEN
    MSG = 'Обнаружена ошибка SQL!';
  ELSE
    MSG = 'Ошибки нет!';
  EXCEPTION EX_CUSTOM MSG;
END
...

SQLSTATE

Доступно в

PSQL

Синтаксис
SQLSTATE
Тип возвращаемого результата

CHAR(5)

В блоках обработки ошибок WHEN …​ DO контекстная переменная SQLSTATE переменная содержит 5 символов SQL-2003 — совместимого кода состояния, переданного оператором, вызвавшим ошибку.Вне обработчиков ошибок SQLSTATE всегда равен '00000', а вне PSQL не существует вообще.

Note
  • SQLSTATE предназначен для замены SQLCODE. Последняя, в настоящее время устарела и буден удалена будущих версиях Firebird;

  • Любой код SQLSTATE состоит из двух символов класса и трёх символов подкласса. Класс 00 (успешное выполнение), 01 (предупреждение) и 02 (нет данных) представляют собой условия завершения. Каждый код статуса вне этих классов является исключением. Поскольку классы 00, 01 и 02 не вызывают ошибку, они никогда не будут обнаруживаться в переменной SQLSTATE.

Example 1. Использование переменной SQLSTATE
WHEN ANY DO
BEGIN
  MSG = CASE SQLSTATE
          WHEN '22003' THEN
            'Число вышло за пределы диапазона!'
          WHEN '22012' THEN
            'Деление на ноль!'
          WHEN '23000' THEN
            'Нарушение ограничения целостности!'
          ELSE 'Ошибок нет! SQLSTATE = ' || SQLSTATE;
        END;
  EXCEPTION EX_CUSTOM MSG;
END