2013-02-15 56 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; 
相關問題