Function PL/pgSQL触发器函数工作不正常
我的程序中的这个函数有问题 该函数的目的是实现一个触发器,该触发器检查用户Utene的帐户saldo上是否有足够的钱,以便将自己添加到一个ride boleia中 我可以从我的函数行为中收集到,用户Utene和ride Boleia都被找到了,但是他们的属性,特别是他的balance saldo没有被正确访问。这是因为每次我尝试向一辆车添加用户时,都会抛出一个例外“O Utente nãO tem saldo suficiente”,这意味着用户没有足够的钱 我想不出我做错了什么。Utente和Boleia表都被正确插入,每个属性都被插入,但我似乎无法在函数中访问它们 以下是该函数的代码:Function PL/pgSQL触发器函数工作不正常,function,postgresql,triggers,plpgsql,Function,Postgresql,Triggers,Plpgsql,我的程序中的这个函数有问题 该函数的目的是实现一个触发器,该触发器检查用户Utene的帐户saldo上是否有足够的钱,以便将自己添加到一个ride boleia中 我可以从我的函数行为中收集到,用户Utene和ride Boleia都被找到了,但是他们的属性,特别是他的balance saldo没有被正确访问。这是因为每次我尝试向一辆车添加用户时,都会抛出一个例外“O Utente nãO tem saldo suficiente”,这意味着用户没有足够的钱 我想不出我做错了什么。Utente和
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;
nick_planner和nick_passenger均来自用户Utilizador实体
日期、时间和成本乘客来自乘坐Boleia实体。我将通过在Utene表中添加一个检查约束来实现这一点,以便余额必须大于或等于零,并尝试通过乘坐成本借记账户。如果资金不足,将引发违反约束错误。在每个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;
它不是PLSQL,而是PL/pgsql,它们是完全不同的方言。。。正确标记您的问题以避免误解。已自动删除“/”。但我下次会更小心的,我道歉。这不是关于“/”的问题。PL/pgSQL或简单的plpgsql是PostgreSQL的默认过程语言。PL/SQL是Oracle的等价物。是的,我忘了补充一点,在创建表时我已经包含了检查约束。当我更新用户时,这是我的意图。用车费减去他的余款。对我来说,问题似乎并不存在,但它们没有被正确访问。但我不知道这有什么帮助。我尝试在函数之外进行更新,结果成功了。所以这让我认为问题在于我在iffound测试之前做的3个选择。理想情况下,该发现将指的是3选择进入的第三个可能是无用的,但我不知道它是否会这样工作。
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;