Bravanet 0 Denunciar post Postado Setembro 11, 2008 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
Motta 645 Denunciar post Postado Setembro 11, 2008 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
Bravanet 0 Denunciar post Postado Setembro 11, 2008 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
Motta 645 Denunciar post Postado Setembro 11, 2008 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
Bravanet 0 Denunciar post Postado Setembro 12, 2008 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
Andre Renato 0 Denunciar post Postado Setembro 12, 2008 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
Bravanet 0 Denunciar post Postado Setembro 15, 2008 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
Motta 645 Denunciar post Postado Setembro 15, 2008 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