首页 > 解决方案 > 触发重塑电话号码

问题描述

我想要一个触发器是我的数据库,它将电话号码的第一个零更改为适当的国家代码(在我的例子中是 +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),我的测试查询如下:

insert into gebruiker
values('U5', 'Hans', '12345', 'Hans', null, 'Kraay', 'Hansworst', '0000QW', 'beukenweg', '4', null, '0612345678', 'test@notnow.nl', '2015-12-12');

我尝试在 if 语句中更改零的数据类型,更改数字变量的数据类型等等,但我无法让它工作。

标签: postgresqlfunctiontriggersplpgsql

解决方案


您想更正每个插入行中的数字,因此触发器应该是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();

推荐阅读