Запросы, планы, оптимизация запросов, ...
Модераторы: 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
Ясно.
Удалять планирую максимум несколько тысяч записей.
К тому же сверхпроизводительность не требуется, ибо запускаться это будет не чаще раза в сутки.
Огромное спасибо за идею!