postgresql - 触发重塑电话号码
问题描述
我想要一个触发器是我的数据库,它将电话号码的第一个零更改为适当的国家代码(在我的例子中是 +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 语句中更改零的数据类型,更改数字变量的数据类型等等,但我无法让它工作。
解决方案
您想更正每个插入行中的数字,因此触发器应该是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();
推荐阅读
- django-views - 预期的 str、bytes 或 os.PathLike 对象,而不是 InMemoryUploadedFile 如何可能并解释正确的方法
- android - Kotlin 中的简单登录活动
- javascript - 如何显示离开站点?仅在函数完成执行后才在卸载事件前提示
- python - 如何从一个 panda.series 行中获取与第二行中的特定值相对应的所有值?
- python - 我如何在 discord.py 中改进我的练级系统
- python - 构建pypiwin32失败
- r - 行间数据帧测试
- scala - 什么是不使用正则表达式从字符串中提取值的安全方法
- python - 简单的 Github API 请求失败
- java - 是否可以使用 Java SDK 通过反向代理连接到 Azure Cosmos DB?