CREATE OR REPLACE FUNCTION serial_generator(start_val_inc INTEGER, last_val_ex INTEGER)
RETURNS TABLE (serial_generator BIGINT) AS $$
BEGIN
EXECUTE
'CREATE SEQUENCE serial START WITH ' || start_val_inc || 'MINVALUE -10';
RETURN QUERY (WITH RECURSIVE sequence_(n) AS (
VALUES (nextval('serial'))
UNION ALL
SELECT nextval('serial')
FROM sequence_
WHERE n < last_val_ex - 1
)
SELECT * FROM sequence_);
EXECUTE
'DROP SEQUENCE serial';
END;
$$ LANGUAGE plpgsql;
SELECT * FROM serial_generator(0, 20);
SELECT * FROM serial_generator(-1, 20);
SELECT * FROM serial_generator(-10, 20);