Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function PL/pgSQL触发器函数工作不正常_Function_Postgresql_Triggers_Plpgsql - Fatal编程技术网

Function PL/pgSQL触发器函数工作不正常

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和

我的程序中的这个函数有问题

该函数的目的是实现一个触发器,该触发器检查用户Utene的帐户saldo上是否有足够的钱,以便将自己添加到一个ride boleia中

我可以从我的函数行为中收集到,用户Utene和ride Boleia都被找到了,但是他们的属性,特别是他的balance 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;
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;