Пользовательский тип и триггер Postgresql

#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, похоже, решил вашу проблему, так что не могли бы вы принять его. Это помогает в будущих вопросах с той же проблемой и удаляет вопрос из очереди без ответа. Пожалуйста, не оставляйте удовлетворительный ответ без ответа.