Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.045 c
15-1172066499
Двоишник
2007-02-21 17:01
2007.03.18
Assembler - программирование циклических процессов


15-1172418471
Dik59
2007-02-25 18:47
2007.03.18
Информация в БЛОБ-поле


6-1159770522
Виктор 5
2006-10-02 10:28
2007.03.18
не работает InternetSetFilePointer


2-1172317674
Novichok_New
2007-02-24 14:47
2007.03.18
"Непонятные" поля (mail)


15-1170999818
MBo
2007-02-09 08:43
2007.03.18
Пятничные задачки. Вася Пупкин потрясает интеллектом...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский