一連のクエリを実行し、そのセットをステートメントの句ids
で使用する必要があるストアド プロシージャがあります。PostgresQL 9.0+を使用しています。一連のステートメントに対してループを使用したり、複数のステートメントを発行したりしたくありません。これはあまり効率的ではありません。UPDATE
WHERE
ids
UPDATE
簡単な例を次に示します。
CREATE OR REPLACE FUNCTION test_it()
RETURNS VOID AS $$
DECLARE
cur_time TIMESTAMP;
ids a%ROWTYPE;
BEGIN
SELECT id FROM a INTO ids;
UPDATE b
SET state = 'foobar', updated_at = cur_time
WHERE id IN ids;
END;
$$ LANGUAGE plpgsql;
これはコンパイルさえしません。
私もSELECT -ingids
などを試しました...
CREATE OR REPLACE FUNCTION test_it()
RETURNS VOID AS $$
DECLARE
cur_time TIMESTAMP;
ids a%ROWTYPE;
BEGIN
SELECT id FROM a INTO ids;
UPDATE b
SET state = 'foobar', updated_at = cur_time
WHERE id IN (SELECT ids);
END;
$$ LANGUAGE plpgsql;
これによりエラーがスローされます: HINT: 指定された名前と引数の型に一致する演算子はありません。明示的な型キャストを追加する必要がある場合があります。
ids
セットの最初のクエリは実際には動的クエリであるため、実際のストアド プロシージャはもっと複雑です。
実際のエラー出力は次のとおりです(コンテキストが増えるだけです...):
ERROR: operator does not exist: integer = task_responses
LINE 3: WHERE id IN (SELECT task_response_ids)
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
QUERY: UPDATE task_responses
SET state = state, updated_at = cur_time, rejected_at = cur_time
WHERE id IN (SELECT task_response_ids)
CONTEXT: PL/pgSQL function "reject_submissions_with_comment" line 38 at SQL statement