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();