简体   繁体   English

Postgresql 用户自定义类型和触发器

[英]Postgresql user-defined type and trigger

I have user defined type in Postgresql and table with this type:我在 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;

Now I need to create a trigger before insert with rule: if h01.q_1 is null then h01.q_1 = 0. How can I use correct syntax please?现在我需要在插入规则之前创建一个触发器:如果 h01.q_1 是 null 那么 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$;

I am using something like:我正在使用类似的东西:

 NEW.h01.q_1 = 0; - syntax error,
(NEW).h01.q_1 = 0; - syntax error,
(NEW.h01).q_1 = 0; - syntax error....

Could you please help me?请你帮助我好吗? Thanks谢谢

The only way I could get it to work is as suggested by @a_horse_with_no_name, something like:我可以让它工作的唯一方法是@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$;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM