web-dev-qa-db-ja.com

PostgreSQL-クエリの結果を反復処理する

私はpgsqlスクリプト言語で関数を作成していますが、この時点でやりたいことはクエリの結果を反復処理し、各行に対して特定のことを行います。私の現在の試みは次のとおりです。temprowtemprow user_data.users%rowtypeとして宣言されています。問題のコードは次のとおりです。

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;  

ただし、これから次のエラーが表示されます:ERROR: relation "temprow" does not exist。私が何をしたいのかが明確な場合、それを行う正しい方法を教えてください。

20
Noob Doob

temprowは、最初のSELECTの各レコードに順番にバインドされるレコード変数です。

だからあなたは書くべきです:

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;

このループは、単一のクエリとしてさらに簡略化できます。

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
35
Renzo