2013-02-15 99 views
2

我想要做这样的事情。如何在准备好的语句中有两个sql查询?

PREPARE addFriend(INTEGER, INTEGER) AS 
    INSERT INTO friendRelation (u_id, friendid) VALUES ($1, $2), 
    INSERT INTO friendRelation (u_id, friendid) VALUES ($2, $1); 

我没有在文档中看到这个,所以要么不能完成,要么我做错了。如果你在准备好的语句中不能有两个查询,那么我还不知道postgres的其他一些功能可以做到这一点?

+0

你应该能够数组绑定到绑定变量。我认为这将是你最好的解决方案。 – haki 2013-02-15 20:53:25

回答

7

一个准备好的声明中不能包含多个语句......但这个特定的查询可以被改写:

PREPARE addFriend(INTEGER, INTEGER) AS 
    INSERT INTO friendRelation (u_id, friendid) VALUES ($1, $2), ($2, $1); 

或者,你可以写一个函数做相同的:

CREATE OR REPLACE FUNCTION addFriend(INTEGER, INTEGER) RETURNS VOID AS 
$$ 
BEGIN 
    INSERT INTO …; 
    INSERT INTO …; 
END 
$$ LANGUAGE plpgsql; 

请注意,您还需要在某处运行CREATE LANGUAGE plpgsql;以将plpgsql语言添加到数据库。

0

接受的答案部分为真,在您的特定情况下,您可以为多个行运行一个插入。 但万一如果你需要运行多个不同的查询,您可以使用WITH语法

WITH data_t (u1_id, u2_id) AS (
    VALUES($1::INTEGER, $2::INTEGER) 
), inserted1 AS (
    INSERT INTO friendRelation (u_id, friendid) SELECT u1_id, u2_id FROM data_t 
) 
INSERT INTO friendRelation (u_id, friendid) SELECT u2_id, u1_id FROM data_t;