killer_ 0 Denunciar post Postado Junho 17, 2008 Estamos desenvolvendo uma aplicação aqui na empresa, e estamos encontrando um problema com relação aos campos data do nosso banco Oracle. Bom já tentamos resolver o problema via aplicação, porem não obtivemos sucesso. Como em oracle não existe uma tipação para Data e outra para DataTime nossos campos data algumas vezes, por razoes ainda desconhecidas, são populados com a data e posteriormente a hora. Gostaria de saber de vocês se existe alguma tipo de trigger ou ainda um procedimento que retirasse a hora e deixa-se apenas a data em questão?? Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Junho 17, 2008 update tabela set campo_data = trunc(campo_data) Compartilhar este post Link para o post Compartilhar em outros sites
killer_ 0 Denunciar post Postado Junho 17, 2008 update tabela set campo_data = trunc(campo_data) ok...porem isto somente atualizaria minha base de dados...mas eu teria q estar executando isso a cada dia que passa entende....não existe um meio de estar fazendo isso automaticamente??? ou ainda alguma configuração que eu possa estar alterando para somente inserir a data sei que existe um tal de NSL_DATE_FORMAT mas este vale para o banco inteiro Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Junho 17, 2008 cria uma trigger no pre_insert e no pre_update Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 17, 2008 Ou uma check constraint que vai verificar se a data está zerada ALTER TABLE TABELA ADD CONSTRAINT CHK_TABELA ( DATA = TRUNC(DATA) ) Tem a vantagem de controlar a aplicação que cadastra a data com hora e não deixar. Compartilhar este post Link para o post Compartilhar em outros sites
killer_ 0 Denunciar post Postado Junho 18, 2008 muito obrigado pela ajuda pessoal acabei tentado juntar algumas idéias criei uma trigger utilizando o update como nosso amigo NaPraia havia dito. create or replace trigger ALTERA_DATA after insert on tabela begin update tabela set campo_data = trunc(campo_data); end; só tenho mais um probleminha....husahusuhahu essa trigger funciona porem ela varre TODA a tabela e não apenas o registro que está sendo inserido... como posso restringir esta alteração, para apenas o registro que está sendo inserido? Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Junho 18, 2008 insert into tabela campo_data values (trunc(campo_data)); Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 18, 2008 FOR EACH ROW create or replace trigger ALTERA_DATA after insert on tabela FOR EACH ROW begin update tabela set campo_data = trunc(campo_data); end; Mas acho que a opção FOR EACH ROW é a default , deveria funcionar. Compartilhar este post Link para o post Compartilhar em outros sites
killer_ 0 Denunciar post Postado Junho 20, 2008 FOR EACH ROW create or replace trigger ALTERA_DATA after insert on tabela FOR EACH ROW begin update tabela set campo_data = trunc(campo_data); end; Mas acho que a opção FOR EACH ROW é a default , deveria funcionar. pois é Motta eu acabei não usando o FOR EACH ROW pq axei q ele ia sai varrendo toda a tabela mas eu depois testei aki usando ele só q dah uns pau nervozo...diz q minha trigger é meio X-MEN... ^.^ javax.servlet.ServletException: java.sql.SQLException: ORA-04091: a tabela TABEL é mutante; talvez o gatilho/função não possa localizá-la ORA-06512: em "TABELA.ALTERA_DATA", line 2 ORA-04088: erro durante a execução do gatilho 'TABELA.ALTERA_DATA' Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Junho 20, 2008 posta aí a trigger Compartilhar este post Link para o post Compartilhar em outros sites
killer_ 0 Denunciar post Postado Junho 20, 2008 create or replace trigger ALTERA_DATA after insert on tabela begin update tabela set campo_data = trunc(campo_data); end; como eu falei antes se eu usar o FOR EACH ROW dah akele pau q mostrei...dai eu dexei sem só q dai ele atualiza a tabela intera saka...e a tabela e GIIIGAS...dai jah viu... ^.^ axo q vô t q trabalha com paramentros ou coisa assim, para ele alterar apenas o registro que esta sendo inserido Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 20, 2008 create or replace trigger ALTERA_DATA after insert on tabela referencing new as new old as old for each row begin if old.campo_data <> new.campo_data then campo_data := trunc(campo_data); end if; end; Compartilhar este post Link para o post Compartilhar em outros sites
killer_ 0 Denunciar post Postado Junho 20, 2008 create or replace trigger ALTERA_DATA after insert on tabela referencing new as new old as old for each row begin if old.campo_data <> new.campo_data then campo_data := trunc(campo_data); end if; end; avee...uhsahusuha eu estava querendo fugi um poco dessa idéia de usar trigger e tals...por isso alem da ajuda que vocês vem me dando procurei uma consultoria com um DBA e ele por telefone acabou me informando que teria que ser usando realmente uma trigger... ^.^ testei sua trigger ae...só q tô tendo um problema PLS-00201: o identificador 'OLD.campo_data' deve ser declarado. dai andei lendo algumas coisas e parece q tem a ver com privilégio seria isso msm? If the required privileges are not granted, an error occurs when trying to create procedure PROC in SCHEMA2: PLS-00201: identifier "SCHEMA1.OBJ" must be declared Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 20, 2008 faltou um detalhe ... : create or replace trigger ALTERA_DATA after insert on tabela referencing new as new old as old for each row begin if :old.campo_data <> :new.campo_data then :new.campo_data := trunc(:new.campo_data); end if; end; coisa de quem programa em notepad .... Compartilhar este post Link para o post Compartilhar em outros sites
killer_ 0 Denunciar post Postado Junho 27, 2008 RESOLVIDO gostaria de agradecer pela ajuda de todos eu num sei bem por que mas eu tive q apenas altera o q esta em negrito create or replace trigger ALTERA_DATA before insert or update on tabela referencing new as new old as old for each row begin if :old.campo_data <> :new.campo_data then :new.campo_data := trunc(:new.campo_data); end if; end; fiz algumas alterações e fika aki a trigger que atualmente estamos usando CREATE OR REPLACE TRIGGER ALTERA_DATA BEFORE INSERT OR UPDATE OF campo_data1, campo_data2, .... ON NOMEDATABELA FOR EACH ROW DECLARE DATAAUX Date; BEGIN DATAAUX := TRUNC(:NEW.campo_data1); IF :NEW.campo_data1 <> DATAAUX THEN :NEW.campo_data1 := DATAAUX; END IF; DATAAUX := TRUNC(:NEW.campo_data2); IF :NEW.campo_data2 <> DATAAUX THEN :NEW.campo_data2 := DATAAUX; END IF; ... END; abraços... Compartilhar este post Link para o post Compartilhar em outros sites