|
@@ -0,0 +1,56 @@
|
|
|
+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;
|