powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос
17 сообщений из 17, страница 1 из 1
Вопрос
    #32071948
ol2866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть иерархическая таблица типа:
ID -primary
ID_Parent -ссылка на верх. уров.
Num - номер в уровне
unique индекс ID_Parent, Num

в триггере before insert делаю:
select Max(Num) into :New.Num
where ID_Parent=:New.ID_Parent

Как культурно заблокировать уровень?
ибо при нескольких процессах нарушается
unique индекс.

Или вообще это делается иначе...
...
Рейтинг: 0 / 0
Вопрос
    #32071981
ol2866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select Max(Num)+1 - конечно.
...
Рейтинг: 0 / 0
Вопрос
    #32071988
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select max() - конечно универсально, но в Oracle лучше использовать sequence. Мало того что триггер будет тормозить вставку, да еще если ты будешь каждый раз max() определять. А если система типичная OLTP - то совсем неэффективно.
...
Рейтинг: 0 / 0
Вопрос
    #32071995
ol2866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, надо:
Num - порядковый номер в уровне ID_Parent
т.е. - 1, 2, 3 ...
а не - 10, 150, 10120 ...
...
Рейтинг: 0 / 0
Вопрос
    #32072002
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что логически означает этот номер уровня?
Дело в том, что если у всех у них ID_parent один и тот-же, то ты ошибаешь счтитая, что они находятся на уровнях 1, 2, 3 итд. С точки зрения иерархии все они находятся на одном и том же уровне, потому-что у них общий родитель.
Тогда здесь идёт речь о том что номера присваиваются последовательно в порядке возрастания по мере поступления строк. Но в этом случае можно ввести атрибут - дата вставки. И в запросе просто сортировать по дате.
Если же у тебя 2-ой это родитель 1-го, а 3-ий родитель второго, то этот атрибут Num вообще не нужен. Для этого просто для 2-го необходимо укзать 1-го в качестве ID_Parent итд. и можно просто использовать функцию LEVEL, которая и возвратит тебе иерархию с номерами уровней.
...
Рейтинг: 0 / 0
Вопрос
    #32072004
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон, я хотел сказать что 1-ый родитель 2-го, 2-ой родитель 3-го итд
...
Рейтинг: 0 / 0
Вопрос
    #32072023
ol2866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне неоходима возможность поиска по ID_Parent, Num
(для удобства навигации)
...
Рейтинг: 0 / 0
Вопрос
    #32072026
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, то что я долго и упорно писало ни в чём не убедило?
Жаль.
...
Рейтинг: 0 / 0
Вопрос
    #32072311
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, может быть это не правильно,
num - нужен для сортировки узлов дерева, принадлежащего одному уровню сквозную, по всему дереву.
Это единственно в чем я вижу смысл этого поля.
Просьба поправить если это не так.
Но если num - нужен для сортировки узлов принадлежащих одному Parent узлу
то смысл этого поля частично теряется поскольку:
-- если используются иерархические запросы в 8i то по спецификации
SQL сортировка невозможна
-- если используются иерархические запросы в 9i то мы действительно можем сортировать
используя ORDER SIBLINGS BY ...

Далее по существу триггера:
select Max(Num) into :New.Num where ID_Parent=:New.ID_Parent

такой триггер в принципе должен быть мутирующий!
> Как культурно заблокировать уровень?
> ибо при нескольких процессах нарушается
> unique индекс.
в этой ситуации вообще не имеет смысла.

Пример:

create or replace
trigger ai_bin_treeafter insert on bin_tree
for each row
declare n number;
begin
select max(num) into n from bin_tree where root_id=:new.root_id;
end;
/

SQL> insert into bin_tree values ( 1, 1 ); *ERROR at line 1:
ORA-04091: table TRAIN.BIN_TREE is mutating, trigger/function may not see it
ORA-06512: at "TRAIN.AI_BIN_TREE", line 4ORA-04088: error during execution of trigger 'TRAIN.AI_BIN_TREE'

единственный путь выполнения подобной задачи -
-применение прагмы автономной транзакии решает проблему,
но только частично, поскольку не позволяет применить последовательности операций INSERT и/или
UPDATE без промежуточных COMMIT.

следующая проблема этого select max() ...
он вообще не будет работать даже без мутации поскольку
при первом INSERT select max(null) вернет null.
и соответственно при следующих тоже.

должно быть:

select nvl(max(num),0) into ... from ...
...
Рейтинг: 0 / 0
Вопрос
    #32072321
Denis Tch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После остановки базы было произведено копирование файлов на другой компьютер. Скопировал в аналогичную структуру каталогов. При запуске база стартует, монтируется, но не открывается... Ругается: cannot open in exclusive mode. Если кто знает, пожалуйста, напишите последовательность действий приводящих к нормальному открыванию и работе БД? Заранее благодарен..
...
Рейтинг: 0 / 0
Вопрос
    #32072325
ol2866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на самом деле - Max(Num)+1
, хотя nvl(max(num),0) конечно правильно.
но в одном процессе все работает,
mutating- не ругается.

таблица небольшая и редко меняется.

Идея - засунуть в TreeView(delphi)
и при клике на него смотреть куда попал, для этого и делаю Num.
Было бы лучше в TreeView вставлять из unique поля, но этого нет.

возможно идея порочная, механизм громоздкий,
но ничего другого в голову не идет.
...
Рейтинг: 0 / 0
Вопрос
    #32072332
Алексей Филиппов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предложение ко всем учасникам форума: на вопросы с подобной темой не отвечать. Мне кажется, понятно должно быть, что тема должна быть информативной!!!!!
Denis, неужели тебе так в западло нормально тему задать?
...
Рейтинг: 0 / 0
Вопрос
    #32072336
Алексей Филиппов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередное предложение к учасникам форума: игнорировать вопросы с темой "вопрос", "проблемма", "помогите разобраться" и так далее... Я считаю создание вопросов с подобной темой неуважением ко всем учасникам форума !!!!
...
Рейтинг: 0 / 0
Вопрос
    #32072343
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
И export/import для дураков придумали...
...
Рейтинг: 0 / 0
Вопрос
    #32072633
notregistred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мдя. Идея лично мне непонятная. Если у тебя родитель вычисляется отнятием единицы, то зачем держать поле?
А если есть ссылка на родителя, то зачем нумеровать уровни? Ведь есть же замечательная конструкция SELECT...............CONNECT BY, а у нее есть полезный атрибут LEVEL, насколько я помню
...
Рейтинг: 0 / 0
Вопрос
    #32072654
notregistred
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения. Дошло
...
Рейтинг: 0 / 0
Вопрос
    #32072797
ol2866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И всё-таки:
Очень хочется иметь относительно ID_Parent, Num
1
--1
--2
--3
2
--1
----1
----2
--2
3
в триггере вычислять Num не получается.
а как сделать что бы получилось?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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