Рекурсивная процедура поиска элементов ветки дерева в FireBird и Interbase

Базы данных Interbase & FireBird

Время от времени приходится общаться с СУБД FireBird и Interbase. И вот недавно возникла необходимость поиска и выбора всех вложенных элементов дерева. В моём случае необходимо было удалить все вложенные группы дерева при удалении родительской группы и в дальнейшем организовать поиск всех вложенных элементов.

Удаление можно сделать на триггерах, а вот с поиском так не прокатит. Поэтому используем рекурсивную процедуру выборки. (заранее оговорюсь, рекурсия — это вариант для небольших и не очень нагруженных БД, если база большая и нагрузка на СУБД планируется существенная, то рекурсии лучше избежать, пример того как это можно сделать будет ниже)

Итак, мы имеем таблицу с тремя полями (идентификатор, идентификатор родителя, наименование):

CREATE TABLE TEST_TABLE (
    ID         INTEGER NOT NULL,
    ID_PARENT  INTEGER,
    NAME       VARCHAR(250)
);

Для такой таблицы процедура рекурсивного удаления элемента со всеми вложенными элементами будет выглядеть так:
CREATE PROCEDURE DELETE_NODES (
    ID_NODE INTEGER)
AS
DECLARE VARIABLE ID_KID INTEGER;
begin
  /* Выбираем вложения */
  for select ID from test_table where ID_PARENT = :ID_NODE INTO :ID_KID
    do begin
        /* Запускаем процедуру для всех вложенных групп поочереди (рекурсия) */
        execute procedure delete_nodes(id_kid);
    end
    /* Удаляем группу*/
    delete from test_table where ID = :ID_NODE;

  suspend;
end
Вот и всё, вместо удаления можем делать выборку или изменение данных, всё что угодно.

Читаль далее...

InterBase FireBird процедура рекурсия оптимизация

Работа с Postgresql в C#

Не так давно занялся разработкой приложения на C# работающего на базе PostreSQL, появилась информаци (читать далее...)

932  
Разрешаем ввод в TextBox только цифр.

Для того чтобы разрешить ввод в поле TextBox только цифр в C#, самый простой способ воспользоваться (читать далее...)

702  
Работа с MySQL в C#

Надеюсь данная публикация не даст читателям повторить мои ошибки и поможет сделать изначально правил (читать далее...)

682  
Разновидности терминалов Motorola Symbol MC3090

В этой публикации хотелось бы поделиться информацией о разновидностях терминалов сбора данных Symbol (читать далее...)

673  
Работа с XML в Oracle PL/SQL (Часть 1)

В этой публикации я приведу основные способы работы с XML в Oracle, которые сам использую. Здесь буд (читать далее...)

658  
Передача параметров между формами в C#

Часто возникает необходимость передать определённые параметры между формами в одном приложении, напр (читать далее...)

642  
OpenXML - Пример создания Excel файла на C#

В данной публикации приведен пример генерации Excel файла при помощи библиотеки OpenXML. Отличие это (читать далее...)

587  
Курсоры в MSSQL - перебор выборки в цикле.

Команды манипулирования данными SELECT, UPDATE, DELETE работают сразу с группами строк. Эти группы, (читать далее...)

528  
Руководство пользователя для терминала сбора данных SEUIC 7P

Поскольку на просторах Российского интернета информации по китайским терминалам сбора данных Seuic A (читать далее...)

487  
Подключение датчика температуры и влажности DHT11 к Arduino UNO R3

Подключение датчика температуры DHT11 задача довольно простая. Всё, что нам понадобится для подключе (читать далее...)

444