我在程序中遇到此功能的问题。
该功能的目的是实现一个触发器,检查用户(utente)是否有足够的钱在他的帐户(saldo)上,以便将自己添加到骑车(boleia)。
我可以从我的功能行为中收集到的内容,包括用户(Utente)和骑行(Boleia),但是他们的属性,特别是他的平衡(saldo)无法正确访问。这是因为每次我尝试将用户添加到一个骑行时,例外情况是“OUtentenãotemsaldo suficiente”,这意味着用户没有足够的钱被抛出。
我想不出任何我可能做错的事。 Utente和Boleia表都被正确插入,每个属性也被插入,但我似乎无法在我的函数中访问它们。
以下是该函数的代码:
create or replace function assocpass_trigger_proc() returns trigger
as $$
declare
x record;
y record;
balancetemp numeric;
begin
select into x * from Utente where(nick=new.nick_passenger);
select into y * from Boleia
where(nick=new.nick_planner and date_time=new.date_time);
select x.balance into balancetemp;
if(found and (balancetemp>=y.cost_passenger)) then
update Utente set balance = balancetemp-y.cost_passenger
where Utente.nick = new.nick_passenger;
insert into InscricaoP(nick_passenger,nick_planner,data_hora)
values(new.nick_passenger, new.nick_planner, new.date_time);
elseif(found and (x.saldo<y.custo_passageiro)) then
raise exception 'O Utente não tem saldo suficiente';
else
raise exception 'A Boleia não existe';
end if;
end
$$ language plpgsql;
这是插入关系:
insert into InscricaoP(nick_planner,date_time,nick_passenger)
values('zero','15/06','cinco');
nick_planner和nick_passenger都来自“用户”(Utilizador)实体 Date_time和cost_passenger来自“骑行”(Boleia)实体。
答案 0 :(得分:3)
在每个SELECT INTO
命令之后设置特殊变量FOUND
。如果您只检查最后一个,则无法正确测试。
我认为你的功能可以像这样工作:
CREATE OR REPLACE FUNCTION assocpass_trigger_proc()
RETURNS trigger AS
$func$
BEGIN
UPDATE utente u
SET balance = balance - b.cost_passenger
FROM boleia b
WHERE u.nick = NEW.nick_passenger
AND b.nick = NEW.nick_planner
AND b.date_time = NEW.date_time
AND u.balance >= b.cost_passenger;
IF FOUND THEN
INSERT INTO inscricaop(nick_passenger, nick_planner, data_hora)
VALUES (NEW.nick_passenger, NEW.nick_planner, NEW.date_time);
ELSIF EXISTS (
SELECT 1
FROM utente u, boleia b
WHERE u.nick = NEW.nick_passenger
AND b.nick = NEW.nick_planner
AND b.date_time = NEW.date_time
AND u.saldo < b.custo_passageiro) THEN
RAISE EXCEPTION 'O Utente não tem saldo suficiente';
ELSE
RAISE EXCEPTION 'A Boleia não existe';
END IF;
END
$func$ LANGUAGE plpgsql;
答案 1 :(得分:0)
我会通过向utente表添加一个检查约束来实现这一点,使得余额必须大于或等于零,并尝试通过乘坐成本来扣除帐户。如果资金不足,将引发约束违规错误。