2015-09-19 11 views
5

私はpgsqlスクリプト言語で関数を作成しています。この時点では、クエリの結果に対して繰り返しを行い、各行に対して何か具体的な処理を行います。私の現在の試行は、temprowtemprow user_data.users%rowtypeと宣言されている次のとおりです。問題のコードは、次のとおりです。PostgreSQL - クエリの結果を繰り返します。

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。私が何をしたいのかが明らかであれば、それを行う正しい方法を私に指摘できますか?

+2

それを行うための正しい方法は次のようになります。「dont'tの反復」。あなたがやっていることは、プレーンなSQLを使って完全に実現可能です: 'insert into leaderboards(a、b、c)usersからx、y、zを選択してください、 ' – wildplasser

+0

答えで気づいたように、' old_seasonnum'はこの時点では選択されていません'user_data.users'からではなく、前のポイントにあります。 –

+0

式を必要とする定数(または変数plpgsqlやプリペアドステートメントの変数)を使用することができます。 'insert into foo(a、b、c)barから42、y、zを選択します。あなたのコード 'old_seasonnum'は定義されていません。 – wildplasser

答えて

16

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 
+0

'FOR' /' temprow'はカーソルですか?何かロックしていますか? – Ruslan

+1

はい、カーソルですが、 'users'テーブルでロックされていません – Renzo

+0

簡略化された単一クエリの問題は、' old_seasonnum'が 'user_data.users'テーブルから選択されておらず、この時点で使用されます。 –

関連する問題