【问题标题】:Postgresql user-defined type and triggerPostgresql 用户定义类型和触发器
【发布时间】:2021-12-08 01:38:02
【问题描述】:

我在 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....

你能帮帮我吗? 谢谢

【问题讨论】:

  • 我认为您首先需要将该列分配给您的用户类型的局部变量:declare new_hour hour_integer; begin new_hour := new.h01; ...
  • 该自定义类型的具体用途是什么?您是否尝试推出自己的 intervaltime 实施?
  • 我在一小时内有 4 个值季度数字,在一张表中一天有 24 列。但这只是一个例子。问题是如何在触发器中为 NEW.h01.q_1 分配一些值。

标签: postgresql


【解决方案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$;

【讨论】:

  • 太棒了!它运行良好,非常感谢!!!!
  • 你会投票和/或接受答案吗?谢谢。
  • @AdrianKlaver 提供的答案似乎已经解决了您的问题,您能否接受。这样做有助于将来出现相同问题的问题,并将问题从未回答的队列中删除。请不要将满意的回答视为未回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2010-11-01
  • 2011-04-03
相关资源
最近更新 更多