Узнать число удаленных записей из хранимой процедуры

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
gelin
Сообщения: 13
Зарегистрирован: 17 дек 2004, 09:23

Узнать число удаленных записей из хранимой процедуры

Сообщение gelin » 29 дек 2004, 16:55

Код: Выделить всё

CREATE PROCEDURE some_proc
(
 ...
)
RETURNS (
  ...
  DELETED integer
)
AS
  ...  
BEGIN
  ...
    DELETE FROM some_table
    WHERE id = :some_id;
    DELETED = /*число удаленных строк*/;
    SUSPEND;
END;
Вообще реально ли получить в хранимой процедуре число удаленных предыдущим запросом строк?
Вариант с генератором и триггером на удаление очевиден, но не выглядит красивым.

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 29 дек 2004, 17:14

Если у тебя FB1.5, то тебе поможет ROW_COUNT (смотри рел.ноты).

gelin
Сообщения: 13
Зарегистрирован: 17 дек 2004, 09:23

Сообщение gelin » 30 дек 2004, 07:13

Эх. У меня Firebird 1.0.3. Значит, только триггеры?

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 30 дек 2004, 10:26

Как вариант, попробуй удалять по первичному ключу в цикле с подсчетом итераций

DELETED=0;
FOR SELECT some_table.id
FROM some_table
WHERE ........
INTO :p_id /*пк строки подлежащей удалению*/
DO
BEGIN
/*удаляем одну строку*/
DELETE FROM some_table WHERE some_table.id = :p_id;
DELETED=DELETED+1; /*число удаленных строк*/;
END
SUSPEND;

gelin
Сообщения: 13
Зарегистрирован: 17 дек 2004, 09:23

Сообщение gelin » 30 дек 2004, 10:34

sag писал(а):Как вариант, попробуй удалять по первичному ключу в цикле с подсчетом итераций
Хм. Здорово!
А производительность не сильно пострадает?

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 30 дек 2004, 10:42

Не думаю, что этот вариант будет на много тормозней, чем триггер+какой-нить счетчик-запоминатель удалений. Ты же не миллионы записей будешь удалять?
В любом случае, пробуй на реальных объемах данных.

gelin
Сообщения: 13
Зарегистрирован: 17 дек 2004, 09:23

Сообщение gelin » 30 дек 2004, 10:45

Ясно.
Удалять планирую максимум несколько тысяч записей.
К тому же сверхпроизводительность не требуется, ибо запускаться это будет не чаще раза в сутки.
Огромное спасибо за идею!

Ответить