2015-09-19 13 views
5

pgsql komut dilinde bir işlev oluşturuyorum ve bu noktada yapmak istediğim bir sorgunun sonuçları üzerinde yinelemeli ve her satır için belirli bir şey yapın. Şu anki denemem, temprow'un temprow user_data.users%rowtype olarak bildirildiği yerdir. PostgreSQL - Sorgu sonuçları üzerinde yineleyin

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; 

Ancak bundan aşağıdaki hatayı alıyorum: ERROR: relation "temprow" does not exist Söz konusu kod şudur. Ne yapmak istediğimi açıksa, bana doğru yolu gösterebilir misin?

+2

olurdu yapmanın doğru yolu: "dont't" döngü. Yaptığınız şey düz SQL kullanarak mükemmel bir şekilde yapılabilir: 'afişlere ekleme (a, b, c) kullanıcılardan x, y, z 'yi seçin,' – wildplasser

+0

Cevapta gördüğüm gibi, 'old_seasonnum' bu noktada seçili değil user_data.users 'dan, ancak önceki bir noktadan. –

+0

Bir ifadenin gerekli olduğu bir sabit (veya plpgsql veya hazır ifadelerde bir değişken) kullanılmasına izin verilir: 'foo'ya ekle (a, b, c) çubuktan 42, y, z öğesini seçin; 'old_seasonnum' kodunuz bile tanımlanmamış. – wildplasser

cevap

16

temprow, ilk SELECT'un her kaydına karşılık gelen bir kayıt değişkenidir.

Yani yazmalısınız:

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; 

Bu döngü ayrıca tek sorgu olarak basitleştirilmiş olabilir:

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" bir imleç mi? Kilitleme yapıyor mu? – Ruslan

+1

Evet, bu bir imleç ancak 'users' tablosunda kilitleme yapılmadı – Renzo

+0

Basitleştirilmiş tekli sorgu ile ilgili problem' old_seasonnum' 'user_data.users' tablosundan seçilmemiş, ancak önceki bu noktada kullanılır. –

İlgili konular