触发重塑电话号码

问题描述 投票:2回答:1

我想要一个触发器是我的数据库,它将电话号码的第一个零改为适当的国家代码(在我的情况下是+31)。到目前为止我的代码是:

create or replace function correct_number()
    returns trigger as $$
declare 
    Pnumber integer;
begin
    select substring(phone, 1, 1) from "user" where phone = new.phone into Pnumber;
    if Pnumber = 0 then 
            update "user"
            set phone = overlay("user".phone placing '+31' from 1 for 1)
            where id = new.id;
        return null;
    end if;
end
$$ language plpgsql;

create trigger force_countrynr
before insert on "user"
for each statement execute procedure correct_number();

问题在于每次我尝试添加数据时,我的DBMS都会给出一个错误,即在没有返回的情况下到达过程的结尾。这显然意味着它不认为if语句是真的,但我无法弄清楚为什么。

这是我的函数关注的属性的DDL是varchar(13),我的testquery如下:

insert into gebruiker
values('U5', 'Hans', '12345', 'Hans', null, 'Kraay', 'Hansworst', '0000QW', 'beukenweg', '4', null, '0612345678', '[email protected]', '2015-12-12');

我已经尝试在if语句中更改零的数据类型,更改数字变量的数据类型以及更多内容,但我无法使其工作。

postgresql function triggers plpgsql
1个回答
1
投票

您想要更正每个插入行中的数字,因此触发器应为for each row

没有理由在触发器中查询表,因为当前插入的行在new变量中可用。

没有理由更新表,只需修改new记录并将其返回。

create or replace function correct_number()
    returns trigger as $$
begin
    if left(new.phone, 1) = '0' then
        new.phone:= '+31' || right(new.phone, -1);
    end if;
    return new;
end
$$ language plpgsql;

create trigger force_countrynr
before insert on "user"
for each row execute procedure correct_number();
© www.soinside.com 2019 - 2024. All rights reserved.