Problem z pobraniem ścieżki w drzewie kategorii, Problem z rekurencyjnym wywołaniem funkcji zwracającej rekordy |
Problem z pobraniem ścieżki w drzewie kategorii, Problem z rekurencyjnym wywołaniem funkcji zwracającej rekordy |
24.07.2008, 08:42:12
Post
#1
|
|
Grupa: Moderatorzy Postów: 6 070 Pomógł: 860 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza |
Witam,
mam struktruę tabeli: p_category: id, parent_id, name czyli w zasadzie standardzik. Chciałbym napisać funkcję, która zwróci mi ścieżkę od danej kategorii do korzenia. Mam coś takiego:
Mam problem z rekurencyjnym wywołaniem tej funkcji. Jeśli odkomentuję linijkę w warunku otrzymuję: Kod ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function "f_get_category_path" line 7 at SQL statement SQL statement "SELECT * FROM f_get_category_path( $1 , $2 )" PL/pgSQL function "f_get_category_path" line 7 at SQL statement Jak to poprawnie zapisać? pion Ten post edytował phpion 24.07.2008, 16:31:28 |
|
|
24.07.2008, 12:59:40
Post
#2
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
Jak dobrze pamiętam, to PG nie lubi jak mus się wstawia SQL z parametrami... spróbuj coś w tym stylu:
Ogólnie o PREPARE: http://www.postgresql.org/docs/current/sta...ql-prepare.html Do tego moim zadaniem powinieneś użyć LOOP, będzie to moim zdaniem lepsze rozwiązanie, skoro jedynie będzie jedna gałąź rekurencji do tego z jednym elementem do zapamiętania. Trzeba zakładać, że nie pojawi się błąd pętli, bo to od razu zabije bazę (nie zależnie czy algorytm będzie rekurencyjny czy iteracyjny). -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
24.07.2008, 13:58:26
Post
#3
|
|
Grupa: Moderatorzy Postów: 6 070 Pomógł: 860 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza |
Dzięki za odpowiedź. Teraz ciało funkcji wygląda w ten sposób:
Wywołanie np.
powinno zwrócić (wg moich zamierzeń) 3 rekordy, natomiast zwraca tylko jeden (ten o id=7 czyli parametrze przekazanym w funkcji). Wygląda jakby albo nie wchodził w ogóle do warunku (co jest mało prawdopodobne bo na pewno jest spełniony) albo nie wyświetlał rezultatów kolejny wywołań. Jeśli mógłbyś mi pomóc w tej kwestii byłbym bardzo wdzięczny. |
|
|
24.07.2008, 15:18:27
Post
#4
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
Może nie za piękne... Ważne w deklaracji "SETOF "
EDIT: parę poprawek EDIT2: poprawiam to co napisał phpion, aby był poprawny przykład, jakby ktoś sszukał Ten post edytował Sedziwoj 24.07.2008, 16:53:35 -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
24.07.2008, 16:30:16
Post
#5
|
|
Grupa: Moderatorzy Postów: 6 070 Pomógł: 860 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza |
Działa wyśmienicie. Musiałem poprawić tylko jedną linijkę:
bo wywalało błędy. Naprawdę ogromne dzięki! PS: tworzę "abstrakcyjną" kategorię ROOT o id=0 i parent_id=NULL, natomiast później wszystkie kategorie główne mają ustawione parent_id=0 |
|
|
24.07.2008, 17:02:22
Post
#6
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
Ja zazwyczaj miałem las, Ty chcesz mieć drzewo, to już nie nazwę błędem Po prostu inna koncepcja (a mi się przypomniało jak było w bazie -1 jak nie było powiązania... i tylko dla tego wspomniałem)
Ciągle mam wrażenie że da się to lepiej napisać, ale bym musiał się tym pobawić, do tej pory nie miałem potrzeby robienia takich funkcji. -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
15.12.2008, 11:58:40
Post
#7
|
|
Grupa: Moderatorzy Postów: 6 070 Pomógł: 860 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza |
Odświeżam temat: mam problem z modyfikacją wyżej podanego rozwiązania. Aktualnie mam tabele:
category: id, parent_id, position locale: id, code category_i18n: category_id, locale_id, name i próbuję pobrać ścieżkę kategorii czyli np. Podkategoria -> Kategoria. Stworzyłem widok:
oraz zmodyfikowałem funkcję tak by (teoretycznie) działała poprawnie:
Wywłouję ją:
Nie działa ona jednak poprawnie. W wyniku otrzymuję wszystkie rekordy z widoku, które posiadają tłumaczenia dla kategorii 12 w wersji 'pl_PL', a nie tylko te wchodzące w skład ścieżki. Co robię źle :| Proszę o pomoc, pion PS: wiem, że lepiej to zrobić z użyciem RECORD a nie tworzyć specjalnie po to widok ale na razie chciałbym się uporać z tym aby to po prostu zaczęło działać... Ten post edytował phpion 15.12.2008, 12:05:04 |
|
|
Wersja Lo-Fi | Aktualny czas: 26.04.2024 - 22:13 |