CREATE TABLE IF NOT EXISTS measure_settings ( id SERIAL PRIMARY KEY, parameter_name VARCHAR(50) NOT NULL UNIQUE, min_value NUMERIC NOT NULL, max_value NUMERIC NOT NULL, unit VARCHAR(20) ); INSERT INTO measure_settings (parameter_name, min_value, max_value, unit) VALUES ('temperature', -58, 58, '°C'), ('pressure', 500, 900, 'mmHg'), ('wind_direction', 0, 59, 'degrees'); CREATE TYPE measurement_data AS ( temperature NUMERIC, pressure NUMERIC, wind_direction NUMERIC ); CREATE OR REPLACE FUNCTION validate_measurement( input_temperature NUMERIC, input_pressure NUMERIC, input_wind_direction NUMERIC ) RETURNS measurement_data AS $$ DECLARE validated_data measurement_data; BEGIN IF input_temperature < (SELECT min_value FROM measure_settings WHERE parameter_name = 'temperature') OR input_temperature > (SELECT max_value FROM measure_settings WHERE parameter_name = 'temperature') THEN RAISE EXCEPTION 'Temperature out of range. Allowed range: % to % °C', (SELECT min_value FROM measure_settings WHERE parameter_name = 'temperature'), (SELECT max_value FROM measure_settings WHERE parameter_name = 'temperature'); END IF; IF input_pressure < (SELECT min_value FROM measure_settings WHERE parameter_name = 'pressure') OR input_pressure > (SELECT max_value FROM measure_settings WHERE parameter_name = 'pressure') THEN RAISE EXCEPTION 'Pressure out of range. Allowed range: % to % mmHg', (SELECT min_value FROM measure_settings WHERE parameter_name = 'pressure'), (SELECT max_value FROM measure_settings WHERE parameter_name = 'pressure'); END IF; IF input_wind_direction < (SELECT min_value FROM measure_settings WHERE parameter_name = 'wind_direction') OR input_wind_direction > (SELECT max_value FROM measure_settings WHERE parameter_name = 'wind_direction') THEN RAISE EXCEPTION 'Wind direction out of range. Allowed range: % to % degrees', (SELECT min_value FROM measure_settings WHERE parameter_name = 'wind_direction'), (SELECT max_value FROM measure_settings WHERE parameter_name = 'wind_direction'); END IF; validated_data.temperature := input_temperature; validated_data.pressure := input_pressure; validated_data.wind_direction := input_wind_direction; RETURN validated_data; END; $$ LANGUAGE plpgsql;