plpgsqlでdelete & insert

plpgsql内のBEGIN〜END間で暗黙的トランザクションが張られる。
insertが失敗した場合、deleteの処理がロールバックされるので、
原子性保証はしたいが、書き込みキュー等へ処理を委譲したい場合の解決の1案として。

CREATE OR REPLACE FUNCTION table_delete_insert(
  ids  int[]
) RETURNS BOOL AS
$$
DECLARE
    multi_values text;
    insert_query text;
    vals text[];
    id int;
BEGIN
    delete from tablename;

    IF array_length( ids, 1 ) > 0 THEN
        FOREACH id IN ARRAY ids
        LOOP
           vals := array_append(vals, '(' || id || ')');
       END LOOP;
       multi_values := array_to_string(vals, ',');
       insert_query := 'insert into tablename ( columnname ) values' || multi_values ;
       EXECUTE insert_query;
    END IF;

    RETURN TRUE;

    EXCEPTION WHEN OTHERS THEN
        RETURN FALSE;
END;
$$
LANGUAGE plpgsql;
select table_delete_insert();