我想要一个触发器是我的数据库,它将电话号码的第一个零改为适当的国家代码(在我的情况下是+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语句中更改零的数据类型,更改数字变量的数据类型以及更多内容,但我无法使其工作。
您想要更正每个插入行中的数字,因此触发器应为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();