0

そのため、テーブル内の特定の行を見つけ、返される結果に行を保存し、行を削除してから結果を返すプロシージャを作成しようとしています。

私がなんとかして最善を尽くしたのは、次のことでした。

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;

ご覧のとおり、SELECTほとんど同じことを行う 2 つの操作があります (追加のオーバーヘッド)。2番目だけをSELECT設定して、to_delete_id 後で行を削除できるようにする方法はありますか?

4

3 に答える 3

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;
于 2013-10-04T11:47:09.280 に答える