Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

for select и delete [D6, FB]


O.O ©   (2006-12-17 06:26:00) 

Что-то делаю не так но так-как делаю это первыйраз то не понимаю что :)
Три связанные таблицы к первой привязана вторая (один ко многим) ко второй третья. Нужно удалить запись изпервой с соответсвующей очисткой второй и третьей. У каждой таблицы есть поле первичного ключа MyID и поле для привязки к предыдущей таблице IDT1 у Т2 и IDT2 у T3.  Пишу хранимую процедуру (IB Expert) приблизительно так:


SET TERM ^ ;

CREATE PROCEDURE DELETE_T1 (
  ID1 bigint)
as
declare variable ID2 bigint;
begin
 /* Procedure Text */
 for select MyID from T2 where IDT1 = :ID1 into :ID2 do begin
   delete from T3 where IDT2 = :ID2
 end
 delete from T2 where IDT1 = :ID1
 delete from T3 where MyID = :ID1
 suspend;
end^

SET TERM ; ^


Что я не так делаю ?


O.O   (2006-12-18 14:57:00) [1]

понятно


DrPass   (2006-12-18 13:36:00) [2]


> но всёж с точками с запятой хотелось-бы разобраться где
> нужно её писать а где нет

После end - не нужно


Sergey13   (2006-12-18 13:03:00) [3]

> [8] O.O   (18.12.06 12:43)
>  и действительно :) Отличная штука, уже проверил.
Только поосторожнее с ней. Одним delete можно всю базу потерять. 8-)


O.O   (2006-12-18 12:43:00) [4]

Sergey13 ©  и действительно :) Отличная штука, уже проверил.
Спасибо за подсказку, но всёж с точками с запятой хотелось-бы разобраться где нужно её писать а где нет


Sergey13   (2006-12-18 11:30:00) [5]

> [6] O.O   (18.12.06 11:24)

В констрейнте на внешний ключ поставить галочку в cascade delete.


O.O   (2006-12-18 11:24:00) [6]

Sergey13 © а это как?


Sergey13   (2006-12-18 08:30:00) [7]

> [0] O.O   (17.12.06 06:26)

А не проще сделать каскадное удаление по внешнему ключу? Сервер с этим и сам справится, без дополнительного кода.


O.O   (2006-12-18 06:03:00) [8]

Опять опечатался, в конце вместо

delete from T3 where MyID = :ID1;

надо читать так

delete from T1 where MyID = :ID1;


O.O   (2006-12-17 15:00:00) [9]

DrPass © спасибо, начинает получатььься :)
Конечно же насчёт SET TERM я просто взял полный текст который формирует IB Expert из закладки "Скрипт", в режиме "Редактор" всё проще, текст уже поправил, и ошибок IB Expert не выдаёт

begin
/* Procedure Text */
for select MyID from T2 where IDT1 = :ID1 into :ID2 do begin
  delete from T3 where IDT2 = :ID2;
end
delete from T2 where IDT1 = :ID1;
delete from T3 where MyID = :ID1;
end

Вызвал из Delphi - всё прекрасно!
Но не очень понятно по поводу точек с запятой. В Паскале на вскидку её нельзя поставить только перед ELSE оператора IF (или что забыл?).  Здесь получаю ошибку если ставлю ТСЗ после END или не ставлю после выражения в теле цыкла, какие на самом деле правила расстановки?


DrPass   (2006-12-17 12:55:00) [10]

а) Не забываем ставить точки с запятой в конце строки
б) Убираем SET TERM - это нужно только для компиляции через isql, и совершенно не годится в IBExpert
в) убираем Suspend - это нужно для процедур, возвращающих набор данных. А твоя только удаляет


O.O   (2006-12-17 06:30:00) [11]

исправление:
в конце вместо

delete from T3 where MyID = :ID1

надо

delete from T1 where MyID = :ID1

очепятка :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо