Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
3-1166511531
alsov
2006-12-19 09:58
2007.03.18
увеличение скорости удаления данных


15-1172230573
Cyrax
2007-02-23 14:36
2007.03.18
Индикатор клавиатуры языковой панели


1-1169504829
Дмитрий Белькевич
2007-01-23 01:27
2007.03.18
Насколько верен следующий код завершения программы:


3-1166370695
Jeeb
2006-12-17 18:51
2007.03.18
Проблема округления в DBGrid


4-1154764827
Multy
2006-08-05 12:00
2007.03.18
Можно ли ускорить BitBlt?