Форум: "Базы";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Внизfor select и delete Найти похожие ветки
← →
O.O (2006-12-17 06:26) [0]Что-то делаю не так но так-как делаю это первыйраз то не понимаю что :)
Три связанные таблицы к первой привязана вторая (один ко многим) ко второй третья. Нужно удалить запись изпервой с соответсвующей очисткой второй и третьей. У каждой таблицы есть поле первичного ключа 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-17 06:30) [1]исправление:
в конце вместо
delete from T3 where MyID = :ID1
надо
delete from T1 where MyID = :ID1
очепятка :)
← →
DrPass © (2006-12-17 12:55) [2]а) Не забываем ставить точки с запятой в конце строки
б) Убираем SET TERM - это нужно только для компиляции через isql, и совершенно не годится в IBExpert
в) убираем Suspend - это нужно для процедур, возвращающих набор данных. А твоя только удаляет
← →
O.O (2006-12-17 15:00) [3]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 или не ставлю после выражения в теле цыкла, какие на самом деле правила расстановки?
← →
O.O (2006-12-18 06:03) [4]Опять опечатался, в конце вместо
delete from T3 where MyID = :ID1;
надо читать так
delete from T1 where MyID = :ID1;
← →
Sergey13 © (2006-12-18 08:30) [5]> [0] O.O (17.12.06 06:26)
А не проще сделать каскадное удаление по внешнему ключу? Сервер с этим и сам справится, без дополнительного кода.
← →
O.O (2006-12-18 11:24) [6]Sergey13 © а это как?
← →
Sergey13 © (2006-12-18 11:30) [7]> [6] O.O (18.12.06 11:24)
В констрейнте на внешний ключ поставить галочку в cascade delete.
← →
O.O (2006-12-18 12:43) [8]Sergey13 © и действительно :) Отличная штука, уже проверил.
Спасибо за подсказку, но всёж с точками с запятой хотелось-бы разобраться где нужно её писать а где нет
← →
Sergey13 © (2006-12-18 13:03) [9]> [8] O.O (18.12.06 12:43)
> и действительно :) Отличная штука, уже проверил.
Только поосторожнее с ней. Одним delete можно всю базу потерять. 8-)
← →
DrPass © (2006-12-18 13:36) [10]
> но всёж с точками с запятой хотелось-бы разобраться где
> нужно её писать а где нет
После end - не нужно
← →
O.O (2006-12-18 14:57) [11]понятно
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c