3.sql 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. return null;
  29. END IF;
  30. IF input_pressure < (SELECT min_value FROM measure_settings WHERE parameter_name = 'pressure') OR
  31. input_pressure > (SELECT max_value FROM measure_settings WHERE parameter_name = 'pressure') THEN
  32. return null;
  33. END IF;
  34. IF input_wind_direction < (SELECT min_value FROM measure_settings WHERE parameter_name = 'wind_direction') OR
  35. input_wind_direction > (SELECT max_value FROM measure_settings WHERE parameter_name = 'wind_direction') THEN
  36. return null;
  37. END IF;
  38. validated_data.temperature := input_temperature;
  39. validated_data.pressure := input_pressure;
  40. validated_data.wind_direction := input_wind_direction;
  41. RETURN validated_data;
  42. END;
  43. $$ LANGUAGE plpgsql;