1
resposta

Ao utilizar esse modelo para atualizar o valor que define a categoria ele nao atualiza os antigos

Ao utilizar esse modelo para atualizar o valor que define a categoria ele nao atualiza os antigos dados do banco de dados, gostaria de saber se existe uma outra maneira de quando se alterar o valor da categoria ele automaticamente alterar as categorias das empresas antigas que ja estavam cadastradas.

1 resposta

Olá, Gabriel, tudo bem?

Peço desculpas pela demora no retorno.

Uma forma que encontrei para alterar as categorias das empresas já existentes no banco de dados é utilizando trigger.

O instrutor criou uma PROCEDURE para que manualmente fosse atualizado às categorias de clientes já existentes no banco de dados, a procedure criada foi a atualizar_faturamento_previsto:

create or replace  PROCEDURE ATUALIZAR_FATURAMENTO_PREVISTO (
    p_id in cliente.id%type, 
    p_faturamento_previsto in cliente.faturamento_previsto%type
)
IS
    v_categoria cliente.categoria%type;
    e_error_id exception;
BEGIN
    v_categoria := obter_categoria_cliente(p_faturamento_previsto);
    UPDATE cliente
        SET categoria = v_categoria,
            faturamento_previsto = p_faturamento_previsto
        WHERE id = p_id;
    IF SQL%NOTFOUND THEN
        RAISE e_error_id;
    END IF;
EXCEPTION
    WHEN e_error_id then
        raise_application_error(-20010,'Cliente inexistente');
END;

Está procedure recebe como parâmetro o ID e o faturamento previsto de um cliente, onde o faturamento previsto é passado para a função obter_categoria_cliente

 v_categoria := categoria_cliente(p_faturamento_previsto);

É retornado a nova categoria do cliente para a procedure atualizar_faturamento_previsto que realiza a atualização no banco de dados:

UPDATE cliente
        SET categoria = v_categoria,
            faturamento_previsto = p_faturamento_previsto
        WHERE id = p_id;

Para que a procedure atualizar_faturamento_previsto seja executa automaticamente para realizar a verificação e atualização dos valores, podemos utilizar trigger:

create or replace  TRIGGER TG_ATUALIZA_CATEGORIA
AFTER INSERT ON CLIENTE
DECLARE
CURSOR cur_CLIENTE IS SELECT ID, faturamento_previsto FROM CLIENTE;
v_faturamento_previsto cliente.faturamento_previsto%type;
v_ID cliente.id%type;

BEGIN   
 OPEN cur_CLIENTE;
    LOOP
        FETCH cur_CLIENTE INTO v_ID,v_faturamento_previsto ;
    EXIT WHEN cur_CLIENTE%NOTFOUND;
        ATUALIZAR_FATURAMENTO_PREVISTO( p_id => v_ID, p_faturamento_previsto => v_faturamento_previsto);
    END LOOP;
    CLOSE cur_CLIENTE;
END;

Foi criada uma trigger, onde um cursor foi declarado para percorrer toda a tabela e buscar o ID e o faturamento previsto de cada cliente. Os valores armazenados nas variáveis v_faturamento_previsto e v_ID é passado para procedure atualizar_faturamento_previsto, que realiza a atualização das categorias dos clientes já existentes no banco de dados:

ATUALIZAR_FATURAMENTO_PREVISTO( p_id => v_ID, p_faturamento_previsto => v_faturamento_previsto);

Qualquer dúvida é só falar e bons estudos!