2015-09-19 18 views
5

Sto creando una funzione in linguaggio di script pgsql e quello che voglio fare in questo punto è iterare sui risultati di una query e ogni riga esegue qualcosa di specifico. Il mio attuale tentativo è il seguente, dove temprow è dichiarato come temprow user_data.users%rowtype. Il codice in questione è il seguente:PostgreSQL - Iterare sui risultati della query

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; 

Tuttavia ho il seguente errore da questo: ERROR: relation "temprow" does not exist. Se è chiaro cosa voglio fare, potresti indicarmi il modo giusto per farlo?

+2

Il modo giusto per farlo potrebbe essere: "Dont't iterate". Quello che sembra essere perfettamente fattibile usando un semplice SQL: 'inserisci nelle classifiche (a, b, c) seleziona x, y, z dagli utenti;' – wildplasser

+0

Come ho notato nella risposta, 'old_seasonnum' non è selezionato a questo punto da 'user_data.users', ma in un punto precedente. –

+0

È consentito utilizzare una costante (o una variabile, in plpgsql o in istruzioni preparate) dove è richiesta un'espressione: 'inserisci in foo (a, b, c) seleziona 42, y, z dalla barra;' Nota: in il tuo codice 'old_seasonnum' non è nemmeno definito. – wildplasser

risposta

16

temprow è una variabile di record che è associata a turno a ciascuna registrazione del primo SELECT.

Quindi si dovrebbe scrivere:

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; 

Questo ciclo potrebbe essere ulteriormente semplificato come una singola query:

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

È 'FOR' /' temprow' un cursore? Fa qualche blocco? – Ruslan

+1

Sì, si tratta di un cursore, ma nessun blocco viene eseguito sulla tabella 'users' – Renzo

+0

Il problema con la query singola semplificata è,' old_seasonnum' non è selezionato dalla tabella 'user_data.users', ma da una selezione precedente e sarà usato a questo punto. –