DO $BODY$ BEGIN IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'aluvisa') THEN CREATE USER aluvisa WITH ENCRYPTED PASSWORD 'aluvisa' LOGIN SUPERUSER INHERIT CREATEDB CREATEROLE REPLICATION; END IF; IF NOT EXISTS (SELECT spcname, pg_tablespace_location(oid) FROM pg_tablespace WHERE spcname = 'ARTICHISTORICAL') THEN CREATE TABLESPACE "ARTICHISTORICAL" OWNER aluvisa LOCATION 'D:\database\ARTICHISTORICAL'; END IF; ALTER TABLESPACE "ARTICHISTORICAL" OWNER TO aluvisa; IF NOT EXISTS (SELECT FROM pg_database WHERE datname = 'ARTICHISTORICAL') THEN CREATE DATABASE "ARTICHISTORICAL" WITH OWNER = aluvisa TEMPLATE = 'template0' ENCODING = 'UTF8' LC_COLLATE = 'C' LC_CTYPE = 'C' TABLESPACE = "ARTICHISTORICAL" CONNECTION LIMIT = -1; END IF; END $BODY$; CREATE UNLOGGED TABLE IF NOT EXISTS measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate); CREATE UNLOGGED TABLE IF NOT EXISTS measurement_2018 PARTITION OF measurement FOR VALUES FROM ('2018-01-01') TO ('2019-01-01'); CREATE UNLOGGED TABLE IF NOT EXISTS measurement_2019 PARTITION OF measurement FOR VALUES FROM ('2019-01-01') TO ('2020-01-01'); CREATE UNLOGGED TABLE IF NOT EXISTS measurement_2020 PARTITION OF measurement FOR VALUES FROM ('2020-01-01') TO ('2021-01-01'); CREATE INDEX IF NOT EXISTS index_logdate ON measurement_2018 (logdate); CREATE INDEX IF NOT EXISTS index_logdate ON measurement_2019 (logdate); CREATE INDEX IF NOT EXISTS index_logdate ON measurement_2020 (logdate); CREATE OR REPLACE PROCEDURE measurement_creator(in inputtimestamp bigint) LANGUAGE 'plpgsql' AS $BODY$ DECLARE subtable VARCHAR(16); timestamp1 VARCHAR(16); timestamp2 VARCHAR(16); usetimestamp bigint; BEGIN IF (inputtimestamp = 0) then SELECT extract(epoch from now() AT TIME ZONE 'UTC') into usetimestamp::bigint; ELSE usetimestamp := inputtimestamp; END IF; raise notice 'Value: %', usetimestamp; subtable := to_char(to_timestamp(usetimestamp), 'YYYY_MM'); timestamp1 := to_char(to_timestamp(usetimestamp), 'YYYY-MM') || '-01'; timestamp2 := to_char(to_timestamp(usetimestamp) + interval '1 month' , 'YYYY-MM') || '-01'; raise notice 'Value: %', subtable; raise notice 'Value: %', timestamp1; raise notice 'Value: %', timestamp2; EXECUTE 'CREATE TABLE IF NOT EXISTS measurement_' || subtable || ' PARTITION OF measurement FOR VALUES FROM (' || quote_literal(timestamp1) || ') TO (' || quote_literal(timestamp2) || ')'; END; $BODY$;