Compare varchar in procedure

0

I'm trying to use the procedure and trigger below in mysql so that when inserting a record into a table the trigger is triggered for subtraction of the given value in another table, but it happens that it is applying to all records of the target table and not just in the record in which it has the value compared. I suspect it is the varchar type that in the target table is of type '1.1.1.1'. Below is the code.

# Trigger para atualização de contas.
DELIMITER //
 CREATE TRIGGER TRG_SaldoConta_AI AFTER INSERT ON processos
 FOR EACH ROW
    BEGIN CALL SP_AtualizaContas (new.rubrica, new.valor);
    END //
DELIMITER ;


# Procedure para atualização de Contas.
DELIMITER //
 CREATE PROCEDURE SP_AtualizaContas( rubrica varchar(45), valor double)
BEGIN
    UPDATE contas SET saldo_anterior = saldo_atual, saldo_atual = saldo_atual - valor
        WHERE rubrica = rubrica;
END //
DELIMITER ;

However I have these others that work normally. Where the value compared is the year also varchar, type '2015'.

# Trigger para atualização de dotações anuais.
DELIMITER //
 CREATE TRIGGER TRG_SaldoDotacaoAnual_AI AFTER INSERT ON contas
 FOR EACH ROW
    BEGIN CALL SP_AtualizaDotacaoAnual (new.periodo, new.dotacao);
    END //
DELIMITER ;

# Procedure para atualização de dotações anuais.
DELIMITER //
 CREATE PROCEDURE SP_AtualizaDotacaoAnual( periodo varchar(45), dotacao double)
BEGIN
    UPDATE dotacoes SET saldo_anterior = saldo_atual, saldo_atual = saldo_atual - dotacao
        WHERE ano_vigente = periodo;
END //
DELIMITER ;
    
asked by anonymous 15.07.2015 / 19:58

1 answer

0

The problem is in your stored procedure and is due to the fact that the parameter has the same name as the table column.

You need to qualify the column name. For example like this:

# Procedure para atualização de Contas.
DELIMITER //
 CREATE PROCEDURE SP_AtualizaContas( rubrica varchar(45), valor double)
BEGIN
    UPDATE contas c SET saldo_anterior = saldo_atual, saldo_atual = saldo_atual - valor
        WHERE c.rubrica = rubrica;
END //
DELIMITER ;

In your case, the update statement

UPDATE contas SET saldo_anterior = saldo_atual, saldo_atual = saldo_atual - valor
WHERE rubrica = rubrica;

It is equivalent to

UPDATE contas SET saldo_anterior = saldo_atual, saldo_atual = saldo_atual - valor
WHERE 1=1;

It will basically update all the records in the table indiscriminately.

Another solution is to use '( backticks ). It would look like this:

# Procedure para atualização de Contas.
DELIMITER //
 CREATE PROCEDURE SP_AtualizaContas( rubrica varchar(45), valor double)
BEGIN
    UPDATE contas SET saldo_anterior = saldo_atual, saldo_atual = saldo_atual - valor
        WHERE 'rubrica' = rubrica;
END //
DELIMITER ;
    
15.07.2015 / 20:17