Quero que depois da inserção de uma linha na tabela, uma determinada coluna seja automaticamente setada com a data atual. A minha trigger tenta fazer isso.
create trigger tri_insert_update after insert
on funcionario
for each row
declare
contratacao date;
begin
contratacao := select to_char(sysdate, 'dd/mm/yyyy') from dual;
update funcionario set (data_contratacao = contratacao);
end;
Erros:
Erro(4,16): PLS-00103: Encontrado o símbolo "SELECT" quando um dos seguintes símbolos era esperado: ( - + case mod novo not nulo <um identificador> <um identificador delimitado por aspas duplas> <uma variável de ligação> continuar média contagem atual existe máx min prior sql stddev soma variance executar forall intercalar tempo timestamp interval data <um literal de string com especificação de conjunto de caracteres> <um número> <uma string SQL com aspas simples> pipe <um literal de
Erro(5,1): PLS-00103: Encontrado o símbolo "UPDATE"
Erro(5,42): PLS-00103: Encontrado o símbolo "=" quando um dos seguintes símbolos era esperado: . ) , @
para atribuir o resultado de um select a uma variável você tem que usar o INTO. Ficaria assim:
select to_char(sysdate, 'dd/mm/yyyy')
into
contratacao
from dual;
Isso é pra responder sua pergunta. Mas, se você quer que o campo tenha o valor da data atual quando der um insert na tabela, fica muito mais fácil usar um DEFAULT no campo. Assim você nem precisa de trigger.
[quote=ADEMILTON]para atribuir o resultado de um select a uma variável você tem que usar o INTO. Ficaria assim:
select to_char(sysdate, 'dd/mm/yyyy')
into
contratacao
from dual;
Isso é pra responder sua pergunta. Mas, se você quer que o campo tenha o valor da data atual quando der um insert na tabela, fica muito mais fácil usar um DEFAULT no campo. Assim você nem precisa de trigger.[/quote]
Fica mais fácil. Modifiquei e agora estou com problema em pegar apenas a hora:minuto:segundo do servidor de banco de dados.
Como faço para pegar apenas essa informação?
[quote=ADEMILTON]Se quer resolver isso no select do banco seria:
select to_char(sysdate,'hh24:mi:ss') from dual;
[/quote]
O problema é que o campo que receberá o valor é do tipo date. Quero que esse campo contenha uma data no formato dia/mês/ano hora:minuto:segundo, mas não está dando certo.
Ei, bacaninha… em campos do tipo DATE o Oracle sempre grava completo: dia, mês, ano, horas, minutos, segundos e até milissegundos… Depois, vai de você, na leitura, extrair o que quiser usando o to_char com a devida máscara. Ele só não vai armazenar completo se por exemplo você der um TRUNC na data. Aí, de horas pra frente ele vai guardar zerado. Mas por default, é sempre completo.