3.sql 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. CREATE TABLE IF NOT EXISTS measure_settings (
  2. id SERIAL PRIMARY KEY,
  3. parameter_name VARCHAR(50) NOT NULL UNIQUE,
  4. min_value NUMERIC NOT NULL,
  5. max_value NUMERIC NOT NULL,
  6. unit VARCHAR(20)
  7. );
  8. INSERT INTO measure_settings (parameter_name, min_value, max_value, unit)
  9. VALUES
  10. ('temperature', -58, 58, '°C'),
  11. ('pressure', 500, 900, 'mmHg'),
  12. ('wind_direction', 0, 59, 'degrees');
  13. CREATE TYPE measurement_data AS (
  14. temperature NUMERIC,
  15. pressure NUMERIC,
  16. wind_direction NUMERIC
  17. );
  18. CREATE OR REPLACE FUNCTION validate_measurement(
  19. input_temperature NUMERIC,
  20. input_pressure NUMERIC,
  21. input_wind_direction NUMERIC
  22. ) RETURNS measurement_data AS $$
  23. DECLARE
  24. validated_data measurement_data;
  25. BEGIN
  26. IF input_temperature < (SELECT min_value FROM measure_settings WHERE parameter_name = 'temperature') OR
  27. input_temperature > (SELECT max_value FROM measure_settings WHERE parameter_name = 'temperature') THEN
  28. RAISE EXCEPTION 'Temperature out of range. Allowed range: % to % °C',
  29. (SELECT min_value FROM measure_settings WHERE parameter_name = 'temperature'),
  30. (SELECT max_value FROM measure_settings WHERE parameter_name = 'temperature');
  31. END IF;
  32. IF input_pressure < (SELECT min_value FROM measure_settings WHERE parameter_name = 'pressure') OR
  33. input_pressure > (SELECT max_value FROM measure_settings WHERE parameter_name = 'pressure') THEN
  34. RAISE EXCEPTION 'Pressure out of range. Allowed range: % to % mmHg',
  35. (SELECT min_value FROM measure_settings WHERE parameter_name = 'pressure'),
  36. (SELECT max_value FROM measure_settings WHERE parameter_name = 'pressure');
  37. END IF;
  38. IF input_wind_direction < (SELECT min_value FROM measure_settings WHERE parameter_name = 'wind_direction') OR
  39. input_wind_direction > (SELECT max_value FROM measure_settings WHERE parameter_name = 'wind_direction') THEN
  40. RAISE EXCEPTION 'Wind direction out of range. Allowed range: % to % degrees',
  41. (SELECT min_value FROM measure_settings WHERE parameter_name = 'wind_direction'),
  42. (SELECT max_value FROM measure_settings WHERE parameter_name = 'wind_direction');
  43. END IF;
  44. validated_data.temperature := input_temperature;
  45. validated_data.pressure := input_pressure;
  46. validated_data.wind_direction := input_wind_direction;
  47. RETURN validated_data;
  48. END;
  49. $$ LANGUAGE plpgsql;