From dac4b42ed6735dde898ad729f848b90a55b18e32 Mon Sep 17 00:00:00 2001 From: Maria Date: Tue, 18 Mar 2025 07:44:30 +0800 Subject: [PATCH 1/2] first --- main.sql | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 113 insertions(+), 3 deletions(-) diff --git a/main.sql b/main.sql index eaf04bb..a1fb1de 100644 --- a/main.sql +++ b/main.sql @@ -4,8 +4,6 @@ begin /* Скрипт создания информационной базы данных Согласно технического задания https://git.hostfl.ru/VolovikovAlex/Study2025 -Редакция 2025-03-07 -Edit by valex */ @@ -1398,7 +1396,119 @@ $body$; -- Проверка отчета -select * from vw_report_fails_height_statistics +select * from vw_report_fails_height_statistics; +------------------------------ + +-- Удаление старого триггера, если он существует +DROP TRIGGER IF EXISTS tr_temp_input_params ON temp_input_params; + +-- Создание последовательности для автоинкремента +CREATE SEQUENCE IF NOT EXISTS public.temp_input_params_seq; + +-- Создание таблицы temp_input_params +CREATE TABLE IF NOT EXISTS temp_input_params +( + id integer NOT NULL PRIMARY KEY DEFAULT nextval('public.temp_input_params_seq'), + emploee_name varchar(100), + measurment_type_id integer NOT NULL, + height numeric(8,2) DEFAULT 0, + temperature numeric(8,2) DEFAULT 0, + pressure numeric(8,2) DEFAULT 0, + wind_direction numeric(8,2) DEFAULT 0, + wind_speed numeric(8,2) DEFAULT 0, + bullet_demolition_range numeric(8,2) DEFAULT 0, + measurment_input_params_id integer, + error_message text, + calc_result jsonb +); + +-- Создание триггера +CREATE TRIGGER tr_temp_input_params +AFTER INSERT ON temp_input_params +FOR EACH ROW +EXECUTE FUNCTION fn_tr_temp_input_params(); + +-- Создание функции для триггера +CREATE OR REPLACE FUNCTION fn_tr_temp_input_params() +RETURNS TRIGGER AS +$$ +DECLARE + var_check_result public.check_result_type; + var_input_params public.input_params_type; + var_response public.calc_result_response_type; + var_calc_result public.calc_result_type[]; +BEGIN + -- Проверка параметров + var_check_result := fn_check_input_params( + NEW.height, + NEW.temperature, + NEW.pressure, + NEW.wind_direction, + NEW.wind_speed, + NEW.bullet_demolition_range + ); + + -- Если проверка не пройдена, записываем ошибку и выходим + IF var_check_result.is_check = FALSE THEN + RAISE NOTICE 'Ошибка: %', var_check_result.error_message; + NEW.error_message := var_check_result.error_message; + RETURN NEW; + END IF; + + -- Передаем проверенные параметры в расчет + var_input_params := var_check_result.params; + + -- Формируем заголовок расчета + var_response.header := public.fn_calc_header_meteo_avg(var_input_params); + + -- Выполняем расчет + CALL public.sp_calc_corrections( + par_input_params => var_input_params, + par_measurement_type_id => NEW.measurment_type_id, + par_results => var_calc_result + ); + + -- Записываем результат в JSON-формате + var_response.calc_result := var_calc_result; + NEW.calc_result := row_to_json(var_response); + + -- Если расчет успешен, копируем данные в основные таблицы + IF var_response.calc_result IS NOT NULL THEN + -- Вставляем данные в основную таблицу input_params + INSERT INTO public.input_params ( + emploee_name, + measurment_type_id, + height, + temperature, + pressure, + wind_direction, + wind_speed, + bullet_demolition_range + ) + VALUES ( + NEW.emploee_name, + NEW.measurment_type_id, + NEW.height, + NEW.temperature, + NEW.pressure, + NEW.wind_direction, + NEW.wind_speed, + NEW.bullet_demolition_range + ) + RETURNING id INTO NEW.measurment_input_params_id; + + -- Если сотрудник еще не существует, добавляем его в таблицу employees + IF NOT EXISTS ( + SELECT 1 FROM public.employees WHERE name = NEW.emploee_name + ) THEN + INSERT INTO public.employees (name) VALUES (NEW.emploee_name); + END IF; + END IF; + + RETURN NEW; +END; +$$ +LANGUAGE plpgsql; \ No newline at end of file From 113b545c3020367bda51df6d1ce5a0ca4121fd13 Mon Sep 17 00:00:00 2001 From: Maria Date: Tue, 18 Mar 2025 18:22:28 +0800 Subject: [PATCH 2/2] new --- main.sql | 127 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 84 insertions(+), 43 deletions(-) diff --git a/main.sql b/main.sql index a1fb1de..024cdd9 100644 --- a/main.sql +++ b/main.sql @@ -1400,38 +1400,33 @@ select * from vw_report_fails_height_statistics; ------------------------------- +------------------- final homework ------------------- -- Удаление старого триггера, если он существует DROP TRIGGER IF EXISTS tr_temp_input_params ON temp_input_params; --- Создание последовательности для автоинкремента -CREATE SEQUENCE IF NOT EXISTS public.temp_input_params_seq; +CREATE TABLE IF NOT EXISTS temp_input_params ( + id SERIAL PRIMARY KEY, + emploee_name VARCHAR(100), + measurment_type_id INTEGER NOT NULL, + height NUMERIC(8,2) DEFAULT 0, + temperature NUMERIC(8,2) DEFAULT 0, + pressure NUMERIC(8,2) DEFAULT 0, + wind_direction NUMERIC(8,2) DEFAULT 0, + wind_speed NUMERIC(8,2) DEFAULT 0, + bullet_demolition_range NUMERIC(8,2) DEFAULT 0, + measurment_input_params_id INTEGER, + error_message TEXT, + calc_result JSONB +); --- Создание таблицы temp_input_params -CREATE TABLE IF NOT EXISTS temp_input_params -( - id integer NOT NULL PRIMARY KEY DEFAULT nextval('public.temp_input_params_seq'), - emploee_name varchar(100), - measurment_type_id integer NOT NULL, - height numeric(8,2) DEFAULT 0, - temperature numeric(8,2) DEFAULT 0, - pressure numeric(8,2) DEFAULT 0, - wind_direction numeric(8,2) DEFAULT 0, - wind_speed numeric(8,2) DEFAULT 0, - bullet_demolition_range numeric(8,2) DEFAULT 0, - measurment_input_params_id integer, - error_message text, - calc_result jsonb +CREATE TYPE public.calc_result_response_type AS ( + header TEXT, + calc_result JSONB ); --- Создание триггера -CREATE TRIGGER tr_temp_input_params -AFTER INSERT ON temp_input_params -FOR EACH ROW -EXECUTE FUNCTION fn_tr_temp_input_params(); --- Создание функции для триггера +-- Создание функции триггера CREATE OR REPLACE FUNCTION fn_tr_temp_input_params() RETURNS TRIGGER AS $$ @@ -1441,7 +1436,7 @@ DECLARE var_response public.calc_result_response_type; var_calc_result public.calc_result_type[]; BEGIN - -- Проверка параметров + -- Проверяем параметры через fn_check_input_params var_check_result := fn_check_input_params( NEW.height, NEW.temperature, @@ -1451,34 +1446,46 @@ BEGIN NEW.bullet_demolition_range ); + -- Проверяем результат функции + IF var_check_result IS NULL THEN + RAISE EXCEPTION 'Ошибка при вызове fn_check_input_params: NULL-результат'; + END IF; + -- Если проверка не пройдена, записываем ошибку и выходим IF var_check_result.is_check = FALSE THEN - RAISE NOTICE 'Ошибка: %', var_check_result.error_message; + RAISE NOTICE 'Ошибка проверки параметров: %', var_check_result.error_message; NEW.error_message := var_check_result.error_message; RETURN NEW; END IF; - -- Передаем проверенные параметры в расчет + -- Передаём проверенные параметры в расчёт var_input_params := var_check_result.params; - -- Формируем заголовок расчета - var_response.header := public.fn_calc_header_meteo_avg(var_input_params); + -- Формируем заголовок расчёта + var_response.header := public.fn_calc_header_meteo_avg(var_input_params); - -- Выполняем расчет - CALL public.sp_calc_corrections( - par_input_params => var_input_params, - par_measurement_type_id => NEW.measurment_type_id, - par_results => var_calc_result - ); + -- Выполняем расчёт + CALL public.sp_calc_corrections( + par_input_params => var_input_params, + par_measurement_type_id => NEW.measurment_type_id, + par_results => var_calc_result + ); + + -- Проверяем корректность результата расчёта + IF var_calc_result IS NULL THEN + RAISE EXCEPTION 'Ошибка в sp_calc_corrections: NULL-результат'; + END IF; + + -- Преобразуем результат расчёта в формат JSON + var_response.calc_result := jsonb_build_array(var_calc_result); -- преобразование в JSONB + + -- Записываем результат в JSON-формате + NEW.calc_result := row_to_json(var_response); - -- Записываем результат в JSON-формате - var_response.calc_result := var_calc_result; - NEW.calc_result := row_to_json(var_response); - -- Если расчет успешен, копируем данные в основные таблицы + -- Если расчёт успешен, сохраняем данные IF var_response.calc_result IS NOT NULL THEN - -- Вставляем данные в основную таблицу input_params - INSERT INTO public.input_params ( + INSERT INTO public.measurment_input_params ( emploee_name, measurment_type_id, height, @@ -1500,7 +1507,7 @@ BEGIN ) RETURNING id INTO NEW.measurment_input_params_id; - -- Если сотрудник еще не существует, добавляем его в таблицу employees + -- Добавляем сотрудника в employees, если его нет IF NOT EXISTS ( SELECT 1 FROM public.employees WHERE name = NEW.emploee_name ) THEN @@ -1511,4 +1518,38 @@ BEGIN RETURN NEW; END; $$ -LANGUAGE plpgsql; \ No newline at end of file +LANGUAGE plpgsql; + +-- Создание триггера +CREATE TRIGGER tr_temp_input_params +BEFORE INSERT ON temp_input_params +FOR EACH ROW +EXECUTE FUNCTION fn_tr_temp_input_params(); + + + +-- Вставка данных в таблицу temp_input_params +INSERT INTO temp_input_params ( + emploee_name, + measurment_type_id, + height, + temperature, + pressure, + wind_direction, + wind_speed, + bullet_demolition_range +) +VALUES ( + 'Иван Иванов', -- emploee_name + 1, -- measurment_type_id + 107.0, -- height + 15.0, -- temperature + 750.0, -- pressure + 45.0, -- wind_direction + 3.5, -- wind_speed + 100.0 -- bullet_demolition_range +); + + + +select * from temp_input_params; \ No newline at end of file