Create function to update column

-1

I need to update a column according to the contents of two other columns, for example, I have two tables, the suprimentos table and the estoque table,

Supplies table
codigoSuprimento
capacidadeSuprimento

Inventory table
codigoSuprimento
capacidadeUsada
percentualUsado

Let's say that in the suprimentos table I have the following registry:

codigoSuprimento | capacidadeSuprimento
       1         |         1000 

And in the table estoque the following register:

codigoSuprimento | capacidadeUsada | percentualUsado
       1         |        300      |         X

My need is to create a function so that the percentualUsado column is populated according to capacidadeUsada over capacidadeSuprimento . It would be capacidadeUsada x 100 / capacidadeSuprimento . But I do not know how to do this in a Function , put that content in parameters to be able to perform that calculation that is an unknown to me.

    
asked by anonymous 11.09.2017 / 15:51

1 answer

1

Assuming the following structure:

CREATE TABLE tb_suprimento
(
    cod INTEGER,
    capacidade INTEGER
);

CREATE TABLE tb_estoque
(
    cod_suprimento INTEGER,
    capacidade_usada INTEGER,
    percentual_usado INTEGER
);

Containing the following data:

INSERT INTO tb_suprimento ( cod, capacidade ) VALUES ( 1, 1000 );
INSERT INTO tb_suprimento ( cod, capacidade ) VALUES ( 2, 500 );
INSERT INTO tb_suprimento ( cod, capacidade ) VALUES ( 3, 300 );
INSERT INTO tb_suprimento ( cod, capacidade ) VALUES ( 4, 750 );
INSERT INTO tb_suprimento ( cod, capacidade ) VALUES ( 5, 400 );

INSERT INTO tb_estoque ( cod_suprimento, capacidade_usada ) VALUES ( 1, 300 );
INSERT INTO tb_estoque ( cod_suprimento, capacidade_usada ) VALUES ( 2, 100 );
INSERT INTO tb_estoque ( cod_suprimento, capacidade_usada ) VALUES ( 3, 120 );
INSERT INTO tb_estoque ( cod_suprimento, capacidade_usada ) VALUES ( 4, 50 );
INSERT INTO tb_estoque ( cod_suprimento, capacidade_usada ) VALUES ( 5, 400 );

Function:

CREATE OR REPLACE FUNCTION fc_atualizar_estoque( INTEGER )
  RETURNS void AS
$BODY$
BEGIN
    UPDATE
        tb_estoque
    SET
        percentual_usado = (100 * capacidade_usada) / tb_suprimento.capacidade 
    FROM
        tb_suprimento
    WHERE
        tb_suprimento.cod = $1 AND
        tb_estoque.cod_suprimento = $1;
END;$BODY$
LANGUAGE plpgsql;

Testing:

SELECT fc_atualizar_estoque(1);
SELECT fc_atualizar_estoque(2);
SELECT fc_atualizar_estoque(3);
SELECT fc_atualizar_estoque(4);
SELECT fc_atualizar_estoque(5);

With Trigger:

CREATE OR REPLACE FUNCTION fc_atualizar_estoque()
  RETURNS trigger AS
$BODY$
DECLARE
    cap INTEGER;
BEGIN
    SELECT capacidade FROM tb_suprimento WHERE cod = NEW.cod_suprimento INTO cap;
    NEW.percentual_usado = (100 * NEW.capacidade_usada) / cap;
    RETURN NEW;
END;$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER tg_atualizar_estoque BEFORE INSERT OR UPDATE ON tb_estoque FOR EACH ROW EXECUTE PROCEDURE fc_atualizar_estoque();
    
12.09.2017 / 15:33