我有一个存储过程,我需要在其中查询一组,ids
然后在UPDATE
语句的WHERE
子句中使用该组。我正在使用PostgresQL 9.0+。我宁愿不要在一组语句上使用循环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 -ing 之ids
类的......
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;
这会引发错误:提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
我的实际存储过程要复杂得多,因为该集合的初始查询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