Ir para conteúdo

Arquivado

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

killer_

[Resolvido] Campo tipo Data sem Hora

Recommended Posts

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

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

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

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
insert into tabela campo_data  values (trunc(campo_data));

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

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

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

×

Informação importante

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