Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Demiurg
- Сообщения: 14
- Зарегистрирован: 02 дек 2005, 13:25
Сообщение
Demiurg » 02 дек 2005, 13:34
Нужно убрать из рабочей таблицы записи с возрастом более Х дней.
Сваял такую процедуру:
BEGIN
FOR SELECT RDB$DB_KEY, current_date-cast(gmt as date) FROM data
INTO :rowid, :days
DO BEGIN
IF (:days>400) then
begin
insert into data_old
select * from data where RDB$DB_KEY=:rowid; <- вот тут засада
//тут будет удаление - пока в тесте не делаю
end
END
END
Короче нефига это решение не вставляет

Проблема в том, что не понятно какого типа должна быть переменная :rowid чтоб нормально с ней работать. Или любой другой способ идентификации строки в таблице, плиз.
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 02 дек 2005, 14:03
А primary key на табице иметь и пользовать - не кошерно?
-
Demiurg
- Сообщения: 14
- Зарегистрирован: 02 дек 2005, 13:25
Сообщение
Demiurg » 02 дек 2005, 14:16
Ну я типа так и извернулся в данном случае. Так что не серчай, всемогущий

Но вот если нет PK, то тогда как?
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 02 дек 2005, 14:25
Demiurg писал(а):
Но вот если нет PK, то тогда как?
Согласен с предыдущим оратором. Кстати, никто не мешает и на логе сделать синтетический ПК на генераторе и триггере. Жрать не просит, а пригодиться может. Но если душа уж очинно просит магии, то бегом на
http://www.cvalde.net , набрать там в поиске rdb$db_key и читать многотрюмную сагу известного волшебника по этому поводу.
-
Demiurg
- Сообщения: 14
- Зарегистрирован: 02 дек 2005, 13:25
Сообщение
Demiurg » 02 дек 2005, 15:32
Не в магии дело. Просто я в Оракле к rowid привык - вот и хотелось сходным образом задачку решить.
Ну всем спасибо за внимание - пойду стойку с серверами ронять - по одному что-то уже тоскливо

-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 02 дек 2005, 18:52
Я фигею, а что, простых путей мы не ищем ?
Код: Выделить всё
insert into data_old
select * from data
where current_date-cast(gmt as date) > 400
delete from data
where current_date-cast(gmt as date) > 400
Demiurg писал(а):Проблема в том, что не понятно какого типа должна быть переменная :rowid чтоб нормально с ней работать
char( 8 )