2

プログラムでこの機能に問題があります。

この関数の目的は、ユーザー(utente)が自分のアカウント(saldo)に十分なお金を持っているかどうかをチェックして、自分をライド(boleia)に追加するトリガーを実装することです。

関数の動作から収集できるものは、ユーザー(Utente)とライド(Boleia)の両方が見つかりましたが、それらの属性、特に彼のバランス(saldo)が正しくアクセスされていません。これは、ユーザーをライドに追加しようとするたびに、「OUtentenãotemsaldusuficiente」という例外が発生するためです。これは、ユーザーに十分なお金がないことを意味します。

私は自分が間違っているかもしれないことは何も考えられません。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 に答える