2

我在我的程序中遇到了这个功能的问题。

该函数的目的是实现一个触发器,该触发器检查用户 (utente) 的帐户 (saldo) 是否有足够的钱,以便将自己添加到乘车 (boleia)。

我可以从我的函数的行为中收集到用户(Utente)和乘车(Boleia),但他们的属性,特别是他的余额(saldo)没有被正确访问。这是因为每次我尝试将用户添加到行程中时,都会抛出异常“O Utente não tem saldo 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 都来自“user”(Utilizador)实体 Date_time,cost_passenger 来自“ride”(Boleia)实体。

4

2 回答 2

3

特殊变量FOUND在您的每个SELECT INTO命令之后设置。如果只在最后一个之后检查,则无法正确测试。

我认为您的功能可以这样工作:

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;
于 2012-12-04T07:41:54.880 回答
0

我将通过向 utente 表添加检查约束来解决此问题,以便余额必须大于或等于零,并尝试通过乘车费用从帐户中扣除。如果资金不足,则会引发违反约束的错误。

于 2012-12-03T23:49:00.170 回答