Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: selesct i kursory
Forum PHP.pl > Forum > Bazy danych > Oracle
izajash
zadanie polega na zrobieniu bazy danych, w ktorej zawarte beda dane na temat węzłów drzewa pokazanego poniżej



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

  1. CREATE TABLE drzewo (
  2. ID NUMBER(3) NOT NULL,
  3. numer_wezla varchar2 (30 CHAR) NOT NULL,
  4. nazwa_wezla varchar2 (30 CHAR) NOT NULL,
  5. numer_wezla_nadrzednego varchar2 (30 CHAR) NOT NULL,
  6. CONSTRAINT drzewo_pk PRIMARY KEY(klucz)
  7. );
  8.  
  9. CREATE SEQUENCE numerowanie
  10. START WITH 1
  11. INCREMENT BY 1
  12. nomaxvalue;
  13.  
  14. CREATE TRIGGER wyzwalacz
  15. BEFORE INSERT ON drzewo
  16. FOR each ROW
  17. BEGIN
  18. SELECT numerowanie.NEXTVAL INTO :NEW.ID FROM dual;
  19. END wyzwalacz;
  20. /


dodałem wszytskie dane

  1. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0', 'root','brak');
  2. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.0', 'ccit','0');
  3. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1', 'iso','0');
  4. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.2', 'iso-ccit','0');
  5. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.0', 'standard','0.1');
  6. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.1', 'Registratio-authority','0.1');
  7. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.2', 'member-body','0.1');
  8. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3', 'Indetified-organisation','0.1');
  9. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6', 'DOD','0.1.3');
  10. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6.1', 'Internet','0.1.3.6');
  11. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6.1.1', 'Directory','0.1.3.6.1');
  12. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6.1.2', 'mgmnt','0.1.3.6.1');
  13. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6.1.3', 'experimental','0.1.3.6.1');
  14. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6.1.4', 'private','0.1.3.6.1');
  15. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6.1.5', 'security','0.1.3.6.1');
  16. INSERT INTO drzewo (numer_wezla, nazwa_wezla, numer_wezla_nadrzednego) VALUES ('0.1.3.6.1.6', 'snmpV2','0.1.3.6.1');
  17. 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');
  18. 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');
  19. 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');
  20. 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');
  21. 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');
  22. 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');
  23. 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');
  24. 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');
  25. 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');
  26. 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');
  27. 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');
  28. 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)
  1. DECLARE
  2. cursor kursor IS SELECT * FROM drzewo;
  3. wiersz_drzewa drzewo%ROWTYPE;
  4. BEGIN
  5. OPEN kursor;
  6. loop
  7. fetch kursor INTO wiersz_drzewa;
  8. exit WHEN kursor%NOTFOUND;
  9. END loop;
  10. close kursor;
  11. 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
wiiir
pozwol kolego ze zapodam ci cos bardziej zaawansowanego, napewno ci sie przyda jak i innym uzytkownikom tego forum

Otoz w oracle-u mozna bardzo fajnie zbudowac drzewo po przez zapytanie sql nie uzywajac zadnych procedurów czy funkcji wylowywanych rekurencja.

Tabela musi sie skadac z kolumny okreslajacej rodzica. Fajnie ze masz juz sekwencje i trigery. Oczywiscie w kolumnie okreslajacej rodzica przetrzymujemy odpowiednie ID (klucz unikalny rodzica).

Jesli twoja tabela "drzewo" bedzie sie skadac z takich wartosci

ID | PARENT_ID | NAZWA | ..[inne kolumny]
1 | null |Root |...
2 | 1 | ccit | ...
3 | 1 | iso | ...
4 | 1 | iso-ccit | ...
5 | 3 | Standart | ...

Itd...

Wystarczy ze utworzysz sobie zapytanie


  1. SELECT level, d.nazwa, [inne kolumy]
  2. FROM drzewo d
  3. start WITH d.parent_id IS NULL
  4. connect BY prior d.id = d.parent_id


jak nie zadziala zamiast d.id = d.parent_id daj na odwrot d.parent_id = d.id tongue.gif ale powinno byc ok

i tym sposobem dostajesz wyniki na tacy wraz z level-em danej gałezi liczonej od 1 - chyba smile.gif

oczywiscie zapytanie mozesz modyfikowac dowolnie wstawiajac klauzule where itd (normalnie po from)

Dawno nie uzywalem tego zapytania wiec prosze o wyrozumialas jesli sa bledy smile.gif, mozesz szukac tez informacji pod haslem hierarchical retrieval w google smile.gif

PS mozna jeszcze to zrobic po przez indeksacje drzewa left i right... ale ja uzywam tego bo skoro oracle sam daje nam takie mozliwosci to... po co wymyslac jeszcze raz kolo?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.