Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bravanet

com Trigger

Recommended Posts

Pessoal, boa tarde!

 

Estou tentando fazer uma trigger para inserir ou atualizar um registro, porém na hora de fazer o select (destacado em verde) ele nunca volta 1, sempre volta 0, o registro existe no banco, acho que ele está fazendo a comparação com a hora, tentei fazer uma "gambiarra"(destacada em azul) para contornar esse problema mais não consegui. Segue abaixo o Código da Trigger, se alguém conseguir me ajudar serei muito grato. Desde já obrigado!

 

create or replace TRIGGER "CONSUMO"

AFTER

INSERT OR UPDATE on "CURRENTVALUE"

for each row

DECLARE

Ntipo NUMBER;

Nrow NUMBER;

EventDate DATE;

begin

EventDate := to_date(:NEW.TIMESTAMP,'DD/MM/YYYY');

SELECT COUNT(*) INTO Ntipo FROM APP_EMED_VAR WHERE TIPO='TO' AND RECNBR=:NEW.RECNBR;

IF Ntipo=1 THEN

SELECT COUNT(*) INTO Nrow FROM APP_CONSUMO WHERE RECNBR=:NEW.RECNBR AND DATA=EventDate;

IF Nrow=0 THEN

INSERT INTO APP_CONSUMO (DATA,RECNBR,VALUE)VALUES(:NEW.TIMESTAMP,:NEW.RECNBR,:NEW.VALUE);

ELSE

UPDATE APP_CONSUMO SET VALUE=:NEW.VALUE, DATA=:NEW.TIMESTAMP WHERE RECNBR=:NEW.RECNBR AND DATA=EventDate;

END IF;

END IF;

 

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

você consulta a APP_EMED_VAR usando o campo :NEW.RECNBR que deve ser da sua coluna ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este campo é da tabela CURRENTVALUE, a trigger é chamada após a inserção ou edição de algum registro na tabela CURRENTVALUE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi a lógica de buscar na APP_EMED_VAR , tabela que a trigeer não atualiza em nenhum momento.

 

A lógica na APP_CONSUMO parece legal , só não entendi o pq de

 

...

SELECT COUNT(*) INTO Ntipo FROM APP_EMED_VAR WHERE TIPO='TO' AND RECNBR=:NEW.RECNBR;

IF Ntipo=1 THEN

...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faço esse select para verificar o tipo do registro, só quero que insira ou atualize se o tipo dele for TO.

 

A coluna Data da tabela é do tipo Date, fazendo isso: EventDate := to_date(:NEW.TIMESTAMP,'DD/MM/YYYY'); era para ele comparar apenas a data não era?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao invés disso:

EventDate := to_date(:NEW.TIMESTAMP,'DD/MM/YYYY');

 

Porque não experimenta isso:

EventDate := trunc(sysdate);

 

Se o problema tá sendo trazer a hora junto com a data, o TRUNC vai 'enxugar' e deixar só a data.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andre eu não estou usando o sysdate porque o NEW.TIMESTAMP é o valor que um equipamento de automação me envia.

Para funcionar eu fiz assim:

 

SELECT COUNT(*) INTO Nrow FROM APP_CONSUMO WHERE RECNBR=:NEW.RECNBR AND DATAHORA>=TO_TIMESTAMP(EventDate || ' 00:00:00','DD/MM/YYYY HH24:MI:SS') AND DATAHORA<=TO_TIMESTAMP(EventDate || ' 23:59:59','DD/MM/YYYY HH24:MI:SS');

 

colocando os valores e executando na mão... da certo...

 

Porém quando mando compilar a trigger da esse warning:

 

Warning(15,165): PLW-07204: conversion away from column type may result in sub-optimal query plan

 

Vcs sabem o que pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

conversion away from column type may result in sub-optimal query plan

 

conversão diversa do tipo da coluna pode resultar em query sub-otimizada

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.