ORA-01882: região de fuso horário não encontrada

102

Estou acessando um banco de dados Oracle de um aplicativo java, quando executo meu aplicativo, recebo o seguinte erro:

java.sql.SQLException: ORA-00604: ocorreu um erro no SQL recursivo nível 1 ORA-01882: região de fuso horário não encontrada

Ndalama
fonte
Conte-nos sobre seu ambiente, como você executa seu java?
ABCade
Estou executando o aplicativo Java na linha de comando. Windows 7 de 64 bits, mas o Oracle DB está sendo executado em um servidor Unix remoto.
ndalama
9
tente adicionar "-Duser.timezone = <YOUR_GMT>" ao seu comando, não se esqueça de substituir <YOUR_GMT> pelo seu GMT, ou seja, -Duser.timezone = "+ 05:30"
ABCade

Respostas:

87

Você também pode tentar verificar a versão do driver Oracle jdbc e do banco de dados Oracle. Ainda hoje tive esse problema ao usar ojdbc6.jar (versão 11.2.0.3.0) para se conectar a um servidor Oracle 9.2.0.4.0. Substituí-lo pelo ojdbc6.jar versão 11.1.0.7.0 resolveu o problema.

Também consegui fazer o ojdbc6.jar versão 11.2.0.3.0 conectar-se sem erros, adicionando oracle.jdbc.timezoneAsRegion=falseno arquivo oracle / jdbc / defaultConnectionProperties.properties (dentro do jar). Encontrei esta solução aqui

Por último, pode-se adicionar -Doracle.jdbc.timezoneAsRegion=falseà linha de comando ou AddVMOption -Doracle.jdbc.timezoneAsRegion=falseem arquivos de configuração que usam esta notação

Matteo Steccolini
fonte
24
Eu também consegui fazer ojdbc6.jar versão 11.2.0.3.0 conectar-se sem erros, adicionando oracle.jdbc.timezoneAsRegion = false no arquivo oracle / jdbc / defaultConnectionProperties.properties (dentro do jar). Encontrei esta solução aqui: forums.oracle.com/forums/thread.jspa?threadID=1095807
Matteo Steccolini
33
Por último, pode-se adicionar -Doracle.jdbc.timezoneAsRegion = false à linha de comando ou AddVMOption -Doracle.jdbc.timezoneAsRegion = false em arquivos de configuração que usam esta notação.
Matteo Steccolini
Obrigado stmsat. Funcionou para mim Mudei meu jar ojdbc para a versão 11.1.0.7.0 no diretório tomcat / lib e ele começou a funcionar :).
mdev
1
Estou usando o maven para construir e empacotar (war) meu projeto e implantar no Cloud Flare, há alguma maneira de definir essa propriedade a partir do arquivo application.properties ou do maven.
Ismail
41

Em uma instalação simples do SQL-Developer no Windows, vá para o diretório

C:\Program Files\sqldeveloper\sqldeveloper\bin

e adicione

AddVMOption -Duser.timezone=CET

para arquivar sqldeveloper.conf.

Marcus Rickert
fonte
Usando Jetbrains DataGrip e enfrentou o mesmo problema depois de adicionar esta opção VM, o problema foi resolvido
latsha
Obrigado, isso realmente ajudou muito!
Quinton
27

Erro que recebi:

Erro de db_connection.java - >> java.sql.SQLException: ORA-00604: ocorreu erro no SQL recursivo nível 1 ORA-01882: região de fuso horário não encontrada

ORA-00604: ocorreu um erro no SQL recursivo nível 1ORA-01882: região de fuso horário não encontrada

Código anterior:

 public Connection getOracle() throws Exception {
     Connection conn = null;
     Class.forName("oracle.jdbc.driver.OracleDriver");
     conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:tap", "username", "pw");
     return conn;
}

novo Código:

 public Connection getOracle() throws Exception {
     TimeZone timeZone = TimeZone.getTimeZone("Asia/Kolkata");
     TimeZone.setDefault(timeZone);
     Connection conn = null;
     Class.forName("oracle.jdbc.driver.OracleDriver");
     conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:tap", "username", "pw");
     return conn;
}

agora está funcionando !!

Waruna Sri Jayanth
fonte
Obrigado, era exatamente disso que eu precisava!
Alan Thompson,
Não sei por que não gostou do fuso horário padrão 'Europa / Madrid'. Definir o fuso horário padrão para 'GMT' funciona.
fgui
22

Atualize o arquivo oracle / jdbc / defaultConnectionProperties.properties em qualquer versão da biblioteca (ou seja, dentro do seu jar) que você está usando para conter a linha abaixo:

oracle.jdbc.timezoneAsRegion=false
Babatunde Adeyemi
fonte
19

O que acontece é que o cliente JDBC envia o ID do fuso horário para o servidor. O servidor precisa conhecer essa zona. Você pode verificar com

SELECT DISTINCT tzname FROM V$TIMEZONE_NAMES where tzname like 'Etc%';

Tenho alguns servidores db que sabem sobre 'Etc / UTC' e 'UTC' (tzfile versão 18), mas outros conhecem apenas 'UTC' (tz versão 11).

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

Também há um comportamento diferente no lado do cliente JDBC. Começando com 11.2, o driver enviará os IDs de zona se forem "conhecidos" pelo Oracle, enquanto antes de enviar o deslocamento de tempo. O problema com esse "envio de IDs conhecidos" é que o cliente não verifica qual versão / conteúdo de fuso horário está presente no servidor, mas tem sua própria lista.

Isso é explicado no Artigo de Suporte da Oracle [ID 1068063.1].

Parece que também depende do SO cliente, é mais provável que Etc / UTC falhe com Ubuntu do que RHEL ou Windows. Acho que isso se deve a alguma normalização, mas ainda não descobri o que exatamente.

eckes
fonte
14
  1. no eclipse, vá executar -> execute a configuração

  2. lá, vá para a guia JRE nos painéis do lado direito

  3. na seção de argumentos VM cole isto

    -Duser.timezone=GMT

  4. em seguida, Aplicar -> Executar

Priyan na Dialog
fonte
8

Tive esse problema ao executar testes automatizados em um servidor de integração contínua. Tentei adicionar o argumento VM " -Duser.timezone=GMT" aos parâmetros de construção, mas isso não resolveu o problema. No entanto, adicionar a variável de ambiente " TZ=GMT" corrigiu isso para mim.

Matt
fonte
2
A variável de ambiente "TZ = GMT" também funcionou para mim. Eu estava tendo problemas com um script de shell que configurava o ambiente para executar uma ferramenta separada que, por sua vez, acessava o Oracle.
David Keener
1
Tendo o mesmo problema, eu também tive que usar "TZ = Europa / Zurique" ao usar "formiga". Funcionou!
Christof Kälin
2
Esta deve ser a melhor resposta. Todas as outras respostas não funcionaram.
Alex Dembo
4

ERROR:

ORA-00604: ocorreu um erro no SQL recursivo nível 1 ORA-01882: região de fuso horário não encontrada

Solução: configuração do CIM no Centos.

/opt/oracle/product/ATG/ATG11.2/home/bin/dynamoEnv.sh

Adicione estes argumentos java:

JAVA_ARGS="${JAVA_ARGS} -Duser.timezone=EDT"
Guna Sekaran
fonte
3

No Netbeans,

  1. Clique com o botão direito em seu projeto -> Propriedades
  2. Vá para Executar (em Categorias)
  3. Digite -Duser.timezone = UTC ou -Duser.timezone = GMT em Opções de VM.

Clique em Ok e execute novamente o programa.

Nota: Você também pode definir para outras datas além de UTC e GMT.

Babatunde Adeyemi
fonte
2

Eu tive esse problema com o Tomcat. Definir o seguinte $CATALINA_BASE/bin/setenv.shresolveu o problema:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

Tenho certeza de que usar uma das sugestões de parâmetro Java das outras respostas funcionaria da mesma maneira.

bonh
fonte
2

Eu também enfrentei um problema semelhante.

Meio Ambiente:

Linux, projeto de hibernação, driver ojdbc6 ao consultar o banco de dados oracle 11g.

Resolução

O parâmetro TZ não foi configurado na máquina linux, que basicamente informa ao oracle sobre o fuso horário. Então, depois de adicionar a instrução de exportação "export TZ = UTC" no momento do início do aplicativo, resolvi meu problema.

UTC -> Alterar de acordo com seu fuso horário.

user3721248
fonte
2

Se o problema estiver no JDeveloper: Altere as propriedades do projeto para o modelo e para o projeto de visualização -> executar / depurar -> perfil padrão -> editar, adicione a seguinte opção de execução: -Duser.timezone = Asia / Calcutta

Certifique-se de que o valor de fuso horário acima seja obtido em seu banco de dados da seguinte maneira:

select TZNAME from V$TIMEZONE_NAMES;

Junto com isso, você deseja verificar as configurações de fuso horário em seu jdev.conf, bem como no JDeveloper -> Menu do aplicativo -> Propriedades do projeto padrão -> Executar / Depurar -> Perfil padrão -> Opções de execução.

Mukul Rana
fonte
1

Eu também tive o mesmo problema quando tentei criar uma conexão no JDeveloper. Nosso servidor está localizado em um fuso horário diferente e, portanto, gerou os erros abaixo como:

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

Mencionei muitos fóruns que pediam para incluir o fuso horário nas opções Java (Executar / Depurar / Perfil) das propriedades do projeto e propriedades padrão do projeto como -Duser.timezone="+02:00" mas não funcionou para mim. Finalmente, a seguinte solução funcionou para mim.

Adicione a seguinte linha ao arquivo de configuração do JDeveloper ( jdev.conf ).

AddVMOption -Duser.timezone=UTC+02:00

O arquivo está localizado em "<raiz de instalação do oracle> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf".

Raj
fonte
1

No meu caso, eu poderia fazer a consulta funcionar alterando "TZR" por "TZD".

String query = "select * from table1 to_timestamp_tz(origintime,'dd-mm-yyyy hh24:mi:ss TZD') between ?  and ?";
Laura Liparulo
fonte
1

Consegui resolver o mesmo problema configurando o fuso horário no meu sistema Linux (Centos6.5).

Repostagem de

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html

  1. definir fuso horário, por /etc/sysconfig/clockexemplo, definir como ZONE = "America / Los_Angeles"

  2. sudo ln -sf / usr / share / zoneinfo / America / Phoenix / etc / localtime

Para descobrir o valor do fuso horário, tente

ls /usr/share/zoneinfo

e procure o arquivo que representa seu fuso horário.

Depois de configurá-los, reinicie a máquina e tente novamente.

adi-pradhan
fonte
2
Para mim, ter certeza de que / etc / sysconfig / clock e o link / etc / localtime foram configurados corretamente foi basicamente um pré-requisito para resolver o problema ORA-01882.
David Keener,
1

Tive o mesmo problema ao tentar fazer uma conexão no OBIEE ao Oracle db. Mudei meu fuso horário do Windows de (GMT + 01: 00) da África Central Ocidental para (GMT + 01: 00) Bruxelas, Copenhague, Madrid, Paris. Então eu reiniciei meu computador e funcionou perfeitamente. Parece que a Oracle não foi capaz de reconhecer o fuso horário da África Central Ocidental.

yushaa yave
fonte
1

Este problema ocorre porque o código que está tentando se conectar ao db tem um fuso horário que não está no db. Ele também pode ser resolvido configurando o fuso horário conforme abaixo ou qualquer fuso horário válido disponível no oracle db. fuso horário válido que pode ser encontrado select * from v $ version;

System.setProperty ("user.timezone", "America / New_York"); TimeZone.setDefault (null);

Uday Singh
fonte
0

Enfrentando o mesmo problema usando Eclipse e um banco de dados Oracle distante, alterar o fuso horário do meu sistema para corresponder ao fuso horário do servidor de banco de dados corrigiu o problema. Reinicie a máquina após alterar o fuso horário do sistema.

Espero que isso possa ajudar alguém

S_intg
fonte
0

java.sql.SQLException: ORA-00604: ocorreu um erro no SQL recursivo nível 1 ORA-01882: região de fuso horário não encontrada

Para este tipo de erro, basta alterar a hora do sistema para o formato GMT padrão do seu país

por exemplo, o fuso horário indiano é chennai, kolkata.

manjunatha H
fonte