CREATE FUNCTION set_subscription(in_user_id int, in_subscription_type text, in_started date, in_expires date) RETURNS void LANGUAGE plpgsql STRICT AS $$ BEGIN <> LOOP UPDATE subscriptions SET (started, expires) = (in_started, in_expires) WHERE (user_id, subscription_type) = (in_user_id, in_subscription_type); EXIT upsert WHEN FOUND; BEGIN INSERT INTO subscriptions (user_id, subscription_type, started, expires) VALUES (in_user_id, in_subscription_type, in_started, in_expires); EXIT upsert; EXCEPTION WHEN unique_violation THEN END END LOOP; $$;