SQL select i kursory

0

zadanie polega na zrobieniu bazy danych, w ktorej zawarte beda dane na temat węzłów drzewa pokazanego poniżej

[IMG]http://img404.imageshack.us/img404/5002/beztytuudvt.jpg[/IMG]

tak więc stworzyłem tabele, wzraz sekwencją i wyzwalaczem

 create table drzewo (
     ID number(3)  not null,
     numer_wezla varchar2 (30 char)  not null,
     nazwa_wezla varchar2 (30 char) not null,
     numer_wezla_nadrzednego varchar2 (30 char) not null, 
     constraint drzewo_pk primary key(klucz)
);

create sequence numerowanie
start with 1 
increment by 1 
nomaxvalue;

create trigger wyzwalacz
before insert on drzewo
for each row
begin
select numerowanie.nextval into :new.ID from dual;
end wyzwalacz;
/

dodałem wszytskie dane

 insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0', 'root','brak');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.0', 'ccit','0');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1', 'iso','0');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.2', 'iso-ccit','0');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.0', 'standard','0.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.1', 'Registratio-authority','0.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.2', 'member-body','0.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3', 'Indetified-organisation','0.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6', 'DOD','0.1.3');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1', 'Internet','0.1.3.6');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.1', 'Directory','0.1.3.6.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2', 'mgmnt','0.1.3.6.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.3', 'experimental','0.1.3.6.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.4', 'private','0.1.3.6.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.5', 'security','0.1.3.6.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.6', 'snmpV2','0.1.3.6.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1', 'Mib-2','0.1.3.6.1.2');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1.1', 'system','0.1.3.6.1.2.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1.2', 'Interfaces','0.1.3.6.1.2.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1.3', 'at','0.1.3.6.1.2.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1.4', 'ip','0.1.3.6.1.2.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1.5', 'icmp','0.1.3.6.1.2.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1.6', 'tcp','0.1.3.6.1.2.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.2.1.7', 'udp','0.1.3.6.1.2.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.4.1', 'enterprise','0.1.3.6.1.4');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.4.1.2', 'ibm','0.1.3.6.1.4.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.4.1.11400', 'HKIVE','0.1.3.6.1.4.1');
insert into drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) values ('0.1.3.6.1.4.1.9', 'cisco','0.1.3.6.1.4.1');

nastepnie należy uzywajac polecenia SELECT wyswietlic scięzke od wybrane liścia drzewa do korzenia, czego kompletnie nie wiem jak zrobić, a później za pomocą procedury i kursora zaprezentować zawartość utworzonej tabeli w następujący sposób :
ID = 1
nazwa węzla = Root node
numer węzla = 0
węze nadrzędny = null
ID = 2
nazwa węzla = CCITT
numer węzla = 0.0
węze nadrzędny = 0
ID = 3
nazwa węzla = ISO
numer węzla = 0.1
węze nadrzędny = 0

tak wieć zrobiłem kursor (nie wiem czy poprawnie, chociaz w tej formie się kompiluje)

 declare
cursor kursor is select * from drzewo;
wiersz_drzewa drzewo%ROWTYPE;
begin
open kursor;
loop
fetch kursor into wiersz_drzewa;
exit when kursor%NOTFOUND;
end loop;
close kursor;
end; 

i dalej nie mam pojecia jak to ugryźć, bo kompletnie nie wiem jak wziąć się za procedury
każda wskazówka lub pomoc będzie mile widziana
pozdrawiam z góry dzięki :)

0

a mozesz poza kolumnami, ktore stworzyles miec jeszcze jakies pomocnicze?
jesli tak zrob sobie dwie kolumny typu int np. lt i rt (left i right)
poszukaj sobie w necie algorytmow ktore oepruja na tym, zapytania wybierajace poddrzewo, czy siezke do korzenia staja sie banalne

ale jesli chcesz pozostac przy tym co masz, to:
wybierasz wiersz po id lub numer_wezla
dopuki numer_wezla_nadrzednego nie jest null petla sie kreci
nastepny_wiersz.numer_wezla = obecny_wiersz.numer_wezla_nadrzednego

0

zauważ, że te id są kluczowe(jeśli nie dałeś ich kluczowych Ty celowo)
przykładowo: id liścia(0.1.0) zawiera w sobie id wezła:(0.1) i roota(0). Tak więc ja bym wziął funkcjami oraclowymi do zabawy stringami podzielił te id i wyciągnął stąd tą ściażkę potem już w kursorze:
select * from drzewo where id in F_moja_sprytna_ścieżka()
;)
niestety nie mam czasu na pisanie Ci gotowca

1 użytkowników online, w tym zalogowanych: 0, gości: 1