Eu tenho uma tabela de registro
CREATE TABLE EMAIL_LOGGING
(
ID NUMBER(9) NOT NULL,
SEND_DATE TIMESTAMP(6) DEFAULT LOCALTIMESTAMP NOT NULL,
SEND_TO_USER_ID NUMBER(9) NOT NULL);
e um pacote que insere nele com este fragmento:
INSERT INTO EMAIL_LOGGING ("ID",SEND_DATE, SEND_TO_USER_ID)
VALUES (NULL, LOCALTIMESTAMP,send_to_user_in);
Quando isso é chamado de um DBMS_JOB de um pacote, ele insere o horário de Greenwich. Quando é chamado de um DBMS_JOB de outro pacote que usa um db_link para outro banco de dados ele insere corretamente a hora local.
Acho que isso é causado pelo fuso horário do cliente sendo usado, mas adicionar isso ao trabalho não resolveu:
execute immediate 'alter session set time_zone=local';
Claro que a melhor solução é mudar para DBMS_Scheduler, mas até que isso seja feito, como posso garantir que o timestamp inserido seja a hora local?
select * from v$version where banner like 'Oracle%';
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
SELECT DBTIMEZONE FROM DUAL;
+00:00
SELECT SESSIONTIMEZONE from dual;
-04:00
Resolvi esse problema definindo esse atributo
e movendo o trabalho para DBMS_SCHEDULER. Agora, quando ele é executado, o horário (local) correto é inserido na tabela de registro.