PL / pgSQL触发器功能无法正常工作

时间:2012-12-03 23:21:21

标签: function postgresql triggers plpgsql

我在程序中遇到此功能的问题。

该功能的目的是实现一个触发器,检查用户(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)实体。

2 个答案:

答案 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表添加一个检查约束来实现这一点,使得余额必须大于或等于零,并尝试通过乘坐成本来扣除帐户。如果资金不足,将引发约束违规错误。