1

Temat: Problem z typami danych i funkcją

Witam
Z bazami miałem już kiedyś coś do czynienia... tzn. z prostymi zapytaniami SQL'owymi. Dziś przyszło mi napisać całą bazę, no i konieczne było stworzenie kilku triggerów i funkcji. No i pojawił się problem... (Funkcję piszę w języku PLPGSQL).

W pewnej funkcji A mam wywołanie innej funkcji B. Funkcja B przyjmuje jako argument liczbę integer będąca nr ID w danej tabeli Z, działanie funkcji jest proste: usuwa ona rekord z tabeli Z o ID przekazanym jako argument. W funkcji A, ID które przekazywane do funkcji B jest pobierane z tabeli X, problem jest taki, że nie jest to jedno ID tylko kolumna tabeli X składająca się z 0 lub więcej wierszy (0 lub więcej IDków).  Zastosował bym tu jakąś pętle, np. FOR. Tylko nie wiem w jaką zmienną (typ tej zmiennej) "zapakować" wynik zapytania zwracającego kolumnę IDków, które chce przekazać do funkcji B.

Oczywiście googlowałem co nieco i coś znalazłem: mianowicie %TYPE. Wtedy w ciele funckji mam cos takiego:

-- ...
-- ...
-- ...
DECLARE
    usuwane_rekordy X.id%TYPE
BEGIN

    SELECT id INTO usuwane_rekordy FROM X where <jakis warunek>
-- ....
-- ....
-- ....
END;

Nie wiem czy idę w dobrym kierunku... czy idzie się jakoś odnieść do pojedynczych rekordów zawartych w zmiennej usuwane_rekordy?
Tzn powiedzmy, że zapytanie pobrało 4 wyniki i zapisało do zmiennej usuwane_rekordy. Czy można teraz walnąć pętle FOR na 4 iteracje i w każdej z niej wykonać funkcję B z kolejnym nr ID?

Jeśli ktoś zrozumiał o co mi chodzi tongue i ma jakiś pomysł, propozycję, sugestię jak to ugryźć to dawać smile
Będe wdzięczny za jakikolwiek trop wink

2

Odp: Problem z typami danych i funkcją

Powinno być tak

for usuwane_rekordy in SELECT id FROM X where <jakis warunek> loop
...
<i w tej pętli po kolei pod zmienną usuwane_rekordy będą podstawiane wartości z kolumny id>
<więc wystarczy tu wywoałć funkcję kasującą z parametrem usuwane_rekordy.>
...


end loop;

Tyle że X w selecie powinien byc z góry znaną tabelą a nie zmienną.
Jeśli X miałoby być zmienną to powinieneś napisać

for usuwane_rekordy in execute 'SELECT id FROM '||X||' where <jakis warunek>' loop
...
<i w tej pętli po kolei pod zmienną usuwane_rekordy będą podstawiane wartości z kolumny id>
<więc wystarczy tu wywoałć funkcję kasującą z parametrem usuwane_rekordy.>
...


end loop;