powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекурсия + временные таблицы
5 сообщений из 30, страница 2 из 2
Рекурсия + временные таблицы
    #33691652
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
J-Pro

...

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

Бррр, стоп. Это в дебагере не удаляется, а если вызвать ф-цию - всё удаляется. Только почему-то больше, чем надо :)) Щас буду разбираться, спасибо за помощь большое. Хоть какой-то сдвиг.

ак разберусь - напишу окончательный результат.
...
Рейтинг: 0 / 0
Рекурсия + временные таблицы
    #33691851
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё отлично работает. CASCADE решил многие проблемы.

Спасибо огромное всем, кто помог. Я узнал много нового, к тому же решил поставленную задачу. Большое человеческое спасибо!

Окончательный результат ф-ции:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE OR REPLACE FUNCTION "public"."DeleteTask" (taskid integer) RETURNS bit AS
$body$

DECLARE rec RECORD;

BEGIN


FOR rec IN SELECT * FROM "TasksAssociations" WHERE "ParentTaskID" = taskid
LOOP
  PERFORM "public"."DeleteTask"(rec."ChildTaskID");
END LOOP;


DELETE FROM "Tasks"
WHERE "TaskID" = taskid;

RETURN  1 ;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


Ещё раз огромная благодарность всем, кто учавствовал в этой теме. Вы оень мне помогли, спасибо!
...
Рейтинг: 0 / 0
Рекурсия + временные таблицы
    #33691908
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1/ рад, что всё у вас получилось.

несколько комментариев пост факк тум
J-Pro 4321извините, фсё переврал (смешались в кучу кони, люди) - поправляюсь.
видимо так (логику уж проверьте сами):

....



Как я понял, фффф создаёт "поRECORDный" триггер, который выполняется уже ПОСЛЕ удаления. Отсюда первый вопрос: каскад уже сработает к моменту вызова триггера? Т.е. когда вызовется триггер, в таблице ассоциаций тасков уже не будет тех записей, в которых присутствовал удалённый таск? Иными словами, мы никак не узнаем информацию о детях и родителях этого удалённого таска?я кажецца несколько раз повторил, что триггер вешаете на табличку "таскСССС", т.е. табличку линков (см триннер в моей "поправке"). А он вызовется на любом удалении, будь то вызвано руками, буд - каскадом. Т.е. ваша посылка неверна.

J-Pro
Второй момент: писать триггер - всё равно, что писать хранимую процедуру. В том плане, что триггер нужен больше для того, если я работаю на уровне обычных SQL-запросов. Я же вызываю одни хранимые процедуры, у меня нет ни одного вызова простого запроса..все зависит от видимости таблиц снаружи (и из других процедур). Т.е. по триггеру вы 100% защищены от разрушения логической цельности (если триггер не врет, конечно). В процедуре - если озаботитесь, чтобы мимо процедур никто не ходил. В т.ч. вы сами и ваш код.
Но позаписные триггера как показали некие тесты обычно много медленнее (на больших объемах) чем хранимки с лупом по тому же набору (и теми же инструкциями внутре цикла). (почему - идей нет).

еще раз праздравляю с пабедай.
...
Рейтинг: 0 / 0
Рекурсия + временные таблицы
    #33691949
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
43211/ рад, что всё у вас получилось.

несколько комментариев пост факк тум
J-Pro

...

Как я понял, фффф создаёт "поRECORDный" триггер, который выполняется уже ПОСЛЕ удаления. Отсюда первый вопрос: каскад уже сработает к моменту вызова триггера? Т.е. когда вызовется триггер, в таблице ассоциаций тасков уже не будет тех записей, в которых присутствовал удалённый таск? Иными словами, мы никак не узнаем информацию о детях и родителях этого удалённого таска?я кажецца несколько раз повторил, что триггер вешаете на табличку "таскСССС", т.е. табличку линков (см триннер в моей "поправке"). А он вызовется на любом удалении, будь то вызвано руками, буд - каскадом. Т.е. ваша посылка неверна.
Ага, теперь понял. Я действительно думал, что триггер целяется в таблицу Tasks. Понял теперь. Да, действительно, Вы правы, оно и так будет работать, пасиб.



4321 J-Pro
Второй момент: писать триггер - всё равно, что писать хранимую процедуру. В том плане, что триггер нужен больше для того, если я работаю на уровне обычных SQL-запросов. Я же вызываю одни хранимые процедуры, у меня нет ни одного вызова простого запроса..все зависит от видимости таблиц снаружи (и из других процедур). Т.е. по триггеру вы 100% защищены от разрушения логической цельности (если триггер не врет, конечно). В процедуре - если озаботитесь, чтобы мимо процедур никто не ходил. В т.ч. вы сами и ваш код.
Но позаписные триггера как показали некие тесты обычно много медленнее (на больших объемах) чем хранимки с лупом по тому же набору (и теми же инструкциями внутре цикла). (почему - идей нет).
Спасибо за инфу, полезно. Всё доступно обьяснено. Спасибо ещё раз!



4321еще раз праздравляю с пабедай.

Пасиб, это благодаря вам всем ;)


P.S.: Кстати... на бдущее, по сабжу... что если действительно когда-нибудь придётся делать рекурсивную функцию, в которой создаётся временная таблица? На втором уровне, как упоминалось выше, сервак выругается и скажет, что подобная таблица уже существует. Как быть? Есть альтернативы? Допустим, создавать временные таблицы, видимые только на уровне одной ф-ции? Как-то можно такое осуществить?
...
Рейтинг: 0 / 0
Рекурсия + временные таблицы
    #33692042
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J-Pro P.S.: где-то рядом висит пост с (попыткой) удалением и обработкой исключений в ХП.
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекурсия + временные таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]