![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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
очепятка :)