#postgresql
#postgresql
Вопрос:
У меня есть пользовательский тип в Postgresql и таблица с этим типом:
CREATE TYPE public.hour_integer AS ( q_1 integer, q_2 integer, q_3 integer, q_4 integer ); CREATE TABLE IF NOT EXISTS device_hours_data ( device_hours_data_id serial, date date, h01 hour_integer , h02 hour_integer , h03 hour_integer , ... ) WITH ( OIDS = FALSE ) TABLESPACE pg_default;
Теперь мне нужно создать триггер перед вставкой с правилом: если h01.q_1 равно нулю, то h01.q_1 = 0. Как я могу использовать правильный синтаксис, пожалуйста ?
CREATE OR REPLACE FUNCTION public.device_hours_data_trigger() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF AS $BODY$ DECLARE v_hour character varying; BEGIN IF (NEW).h01.q_1 = null THEN NEW.h01.q_1 = 0; END IF; ... RETURN NEW; END; $BODY$;
Я использую что-то вроде:
NEW.h01.q_1 = 0; - syntax error, (NEW).h01.q_1 = 0; - syntax error, (NEW.h01).q_1 = 0; - syntax error....
Не могли бы вы, пожалуйста, помочь мне? Спасибо
Комментарии:
1. Я думаю, что сначала вам нужно назначить столбец локальной переменной вашего типа пользователя:
declare new_hour hour_integer; begin new_hour := new.h01; ...
2. Какова именно цель этого пользовательского типа? Вы пытаетесь запустить свой собственный
interval
илиtime
реализацию?3. У меня есть 4 номера квартала значений за один час и 24 столбца за день в одной таблице. Но это только пример. Проблема в том, как присвоить некоторое значение NEW.h01.q_1 в триггере.
Ответ №1:
Единственный способ, которым я мог бы заставить его работать, — это, как предлагает @a_horse_with_no_name, что-то вроде:
CREATE OR REPLACE FUNCTION public.device_hours_data_trigger() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF AS $BODY$ DECLARE v_hour character varying; new_hour hour_integer; BEGIN new_hour = NEW.h01; IF new_hour.q_1 = null THEN new_hour.q_1 = 0; END IF; ... NEW.h01 = new_hour; RETURN NEW; END; $BODY$;
Комментарии:
1. Отлично! Он отлично работает, большое спасибо!!!!
2. Будете ли вы голосовать и/или принимать ответ? Спасибо.
3. Ответ, предоставленный @AdrianKlaver, похоже, решил вашу проблему, так что не могли бы вы принять его. Это помогает в будущих вопросах с той же проблемой и удаляет вопрос из очереди без ответа. Пожалуйста, не оставляйте удовлетворительный ответ без ответа.