Compare varchar in Procedure

Asked

Viewed 164 times

0

I am trying to use the following Procedure and Trigger in mysql so that when inserting a record in a table the Trigger is fired for subtraction of the given value in another table, but it turns out that it’s applying to all records in the target table and not just in the record where it has value compared. I suspect to be the type varchar that in the target table is type '1.1.1'. Below I leave 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 compared value 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 ;

1 answer

0

The problem is in your stored database and it 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;

Is equivalent to

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

Basically it will update all records of the table indiscriminately.

Another solution is to use ` (backticks). 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 ;

Browser other questions tagged

You are not signed in. Login or sign up in order to post.