2015-09-19 17 views
5

Tworzę funkcję w języku skryptowym pgsql, a tym, co chcę zrobić w tym punkcie, jest iteracja wyników zapytania i dla każdego wiersza zrobić coś konkretnego. Moja obecna próba jest następująca, gdzie temprow jest zadeklarowana jako temprow user_data.users%rowtype. Kod w pytanie jest następujące:PostgreSQL - Iteracja wyników zapytania

FOR temprow IN 
     SELECT * FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
    LOOP 
     SELECT user_id,user_seasonpts INTO player_idd,season_ptss FROM temprow; 
     INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) VALUES (old_seasonnum,player_idd,season_ptss); 
    END LOOP; 

Jednak pojawia się następujący błąd z tego: ERROR: relation "temprow" does not exist. Jeśli jasne jest, co chcę zrobić, czy możesz wskazać mi właściwą drogę?

+2

Prawo sposobem na to byłoby: "dont't iterate". To, co wydaje się robić, jest całkowicie wykonalne za pomocą zwykłego SQL: 'wstaw do tabel wyników (a, b, c) wybierz x, y, z od użytkowników;' – wildplasser

+0

Jak zauważyłem w odpowiedzi, 'old_seasonnum' nie jest zaznaczone w tym miejscu z 'user_data.users', ale w poprzednim punkcie. –

+0

Dozwolone jest użycie stałej (lub zmiennej, w plpgsql lub w przygotowanych instrukcjach), gdzie potrzebne jest wyrażenie: 'wstaw do foo (a, b, c) wybierz 42, y, z z paska;' Uwaga: w Twój kod 'old_seasonnum' nie jest nawet zdefiniowany. – wildplasser

Odpowiedz

16

temprow to zmienna rekordowa, która z kolei jest przypisywana do każdego rekordu pierwszego SELECT.

Należy więc napisać:

FOR temprow IN 
     SELECT * FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
    LOOP 
     INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) VALUES (old_seasonnum,temprow.userd_id,temprow.season_ptss); 
    END LOOP; 

Ta pętla może być dalej uproszczone w jednym zapytaniu:

INSERT INTO user_data.leaderboards (season_num,player_id,season_pts) 
SELECT old_seasonnum,player_idd,season_ptss FROM user_data.users ORDER BY user_seasonpts DESC LIMIT 10 
+0

Czy 'FOR' /' temprow' jest kursorem? Czy robi jakieś blokowanie? – Ruslan

+1

Tak, to jest kursor, ale nie jest blokowane w tabeli 'users'. – Renzo

+0

Problem z uproszczoną pojedynczą zapytaniem jest,' old_seasonnum' nie jest wybierany z tabeli 'user_data.users', ale z poprzedniego wyboru i będzie używane w tym momencie. –