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);
...