触发重塑电话号码
Trigger to reshape phonenumber
我想要一个触发器是我的数据库,它将 phone 数字的第一个零更改为适当的国家代码(在我的例子中是 +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 都会给出一个错误,指出过程结束时没有 return。这显然意味着它不认为 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 语句中零的数据类型,更改数字变量的数据类型等等,但我无法让它工作。
您想更正每个插入行中的数字,因此触发器应该是 for each row
。
没有理由在触发器中查询 table,因为当前插入的行在 new
变量中可用。
没有理由更新table,只需修改new
记录并return它。
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();
我想要一个触发器是我的数据库,它将 phone 数字的第一个零更改为适当的国家代码(在我的例子中是 +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 都会给出一个错误,指出过程结束时没有 return。这显然意味着它不认为 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 语句中零的数据类型,更改数字变量的数据类型等等,但我无法让它工作。
您想更正每个插入行中的数字,因此触发器应该是 for each row
。
没有理由在触发器中查询 table,因为当前插入的行在 new
变量中可用。
没有理由更新table,只需修改new
记录并return它。
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();