2013-10-04 30 views
0

所以,我試圖創建一個程序,它將在我的表中找到 特定的行,將結果中的行保存爲 返回,然後刪除行並返回結果。PostgreSQL存儲過程中的相同查詢

我能夠做到的最好的事情是以下幾點:

CREATE OR REPLACE FUNCTION sth(foo integer) 
RETURNS TABLE(a integer, b integer, ... other fields) AS $$ 
DECLARE 
    to_delete_id integer; 
BEGIN 
    SELECT id INTO to_delete_id FROM my_table WHERE sth_id = foo LIMIT 1; 
    RETURN QUERY SELECT * FROM my_table WHERE sth_id = foo LIMIT 1; 

    DELETE FROM my_table where id = to_delete_id; 
END; 
$$ LANGUAGE plpgsql; 

正如你看到的,我有2個SELECT操作是幾乎做同樣的事情(額外 開銷)。有沒有辦法只有第二個SELECT,並且還設置了to_delete_id ,以便我可以在之後刪除該行?

回答

6

你只想要一個DELETE...RETURNING

DELETE FROM my_table WHERE sth_id=foo LIMIT 1 RETURNING * 

根據ahwnn的評論編輯。非常正確 - 教我在不正確閱讀的情況下剪切並粘貼查詢。

DELETE FROM my_table WHERE id = (SELECT id ... LIMIT 1) RETURNING * 
+0

'DELETE'不支持'LIMIT' –

+0

第二個解決方案似乎非常不2' SELECT's'在這個意義上,您首先選擇ID然後你搜索刪除與此ID的表。我只想「選擇」並立即刪除。 – insumity

+0

但是,除非我誤解了你的例子,你並沒有試圖刪除所有的匹配,只有一個(隨機) –

0

選擇所有列到變量,回報他們,然後刪除使用id:

聲明爲每列一個變量(按照慣例命名保存爲列,但與領先的下劃線),則:

SELECT id, col1, col2, ... 
INTO _id, _col1, _col22, ... 
FROM my_table 
WHERE sth_id = foo 
LIMIT 1; 

RETURN QUERY SELECT _id, _col1, _col22, ...; 

DELETE FROM my_table where id = _id; 
1

可以做容易得多:

CREATE OR REPLACE FUNCTION sth(foo integer) 
RETURNS SETOF my_table 
AS 
$$ 
BEGIN 
    return query 
     DELETE FROM my_table p 
     where sth_id = foo 
     returning *; 
END; 
$$ 
LANGUAGE plpgsql;