ORA-01882 : 시간대 영역이 없습니다


102

Java 응용 프로그램에서 Oracle 데이터베이스에 액세스하고 있는데 응용 프로그램을 실행할 때 다음 오류가 발생합니다.

java.sql.SQLException : ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다. ORA-01882 : 시간대 영역을 찾을 수 없습니다.


환경에 대해 알려주십시오. Java를 어떻게 실행합니까?
ABCade 2012

명령 줄에서 Java 응용 프로그램을 실행하고 있습니다. Windows 7 64 비트이지만 Oracle DB는 원격 Unix 서버에서 실행 중입니다.
ndalama 2012

9
명령에 "-Duser.timezone = <YOUR_GMT>"를 추가하십시오. <YOUR_GMT>를 GMT로 바꾸는 것을 잊지 마십시오. 예 : -Duser.timezone = "+ 05:30"
ABCade

답변:


87

Oracle jdbc 드라이버 및 Oracle 데이터베이스의 버전을 확인할 수도 있습니다. 오늘 바로 ojdbc6.jar (버전 11.2.0.3.0)을 사용하여 Oracle 9.2.0.4.0 서버에 연결할 때이 문제가 발생했습니다. ojdbc6.jar 버전 11.1.0.7.0으로 바꾸면 문제가 해결되었습니다.

또한 oracle.jdbc.timezoneAsRegion=falseoracle / jdbc / defaultConnectionProperties.properties 파일 (jar 내부) 을 추가하여 ojdbc6.jar 버전 11.2.0.3.0을 오류없이 연결하도록 관리했습니다 . 여기 에서이 솔루션을 찾았 습니다.

마지막 으로이 표기법을 사용하는 구성 파일 -Doracle.jdbc.timezoneAsRegion=false의 명령 줄 또는 AddVMOption -Doracle.jdbc.timezoneAsRegion=false에 추가 할 수 있습니다.


24
또한 oracle / jdbc / defaultConnectionProperties.properties (jar 내부) 파일에 oracle.jdbc.timezoneAsRegion = false를 추가하여 ojdbc6.jar 버전 11.2.0.3.0을 오류없이 연결하도록 관리했습니다. 여기에이 솔루션을 찾을 수 : forums.oracle.com/forums/thread.jspa?threadID=1095807
마테오 Steccolini

33
마지막으로 명령 줄에 -Doracle.jdbc.timezoneAsRegion = false를 추가하거나이 표기법을 사용하는 구성 파일에서 AddVMOption -Doracle.jdbc.timezoneAsRegion = false를 추가 할 수 있습니다.
Matteo Steccolini 2013

감사합니다 stmsat. 그것은 나를 위해 일했습니다. tomcat / lib 디렉토리에서 ojdbc jar를 11.1.0.7.0 버전으로 변경하고 작동하기 시작했습니다. :).
인 mdev

1
maven을 사용하여 내 프로젝트를 빌드하고 패키징 (war)하고 Cloud Flare에 배포합니다.이 속성을 application.properties 파일 또는 maven 에서 설정할 수있는 방법이 있습니까?
Ismail

41

일반 SQL 개발자 설치에서 Windows에서 디렉토리로 이동

C:\Program Files\sqldeveloper\sqldeveloper\bin

추가

AddVMOption -Duser.timezone=CET

파일에 sqldeveloper.conf.


Jetbrains DataGrip을 사용하고이 VM 옵션을 추가 한 후 동일한 문제에 직면했습니다. 문제가 해결되었습니다
latsha

감사합니다. 정말 많은 도움이되었습니다!
Quinton

27

내가 얻은 오류 :

db_connection.java 오류->> java.sql.SQLException : ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다. ORA-01882 : 시간대 영역을 찾을 수 없습니다.

ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다 ORA-01882 : 시간대 영역을 찾을 수 없습니다

이전 코드 :

 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;
}

새 코드 :

 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;
}

이제 작동합니다 !!


고마워요, 그게 바로 제가 필요했던 것입니다!
Alan Thompson

기본 시간대 'Europe / Madrid'가 왜 마음에 들지 않았는지 모르겠습니다. 기본 시간대를 'GMT'로 설정하면 작동합니다.
fgui

22

아래 행을 포함하기 위해 사용중인 라이브러리 버전 (즉, jar 내부)에서 oracle / jdbc / defaultConnectionProperties.properties 파일을 업데이트하십시오 .

oracle.jdbc.timezoneAsRegion=false

19

일어나는 일은 JDBC 클라이언트가 시간대 ID를 서버에 보내는 것입니다. 서버는 해당 영역을 알아야합니다. 다음으로 확인할 수 있습니다.

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

'Etc / UTC'및 'UTC'(tzfile 버전 18)에 대해 알고있는 일부 db 서버가 있지만 다른 일부는 'UTC'(tz 버전 11) 만 알고 있습니다.

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

JDBC 클라이언트 측에서도 다른 동작이 있습니다. 11.2부터 드라이버는 시간 오프셋을 전송하기 전에 Oracle에 "알려진"영역 ID를 전송합니다. 이 "알려진 ID 전송"의 문제점은 클라이언트가 서버에있는 시간대 버전 / 컨텐츠를 확인하지 않고 자체 목록을 가지고 있다는 것입니다.

이는 Oracle 지원 문서 [ID 1068063.1]에 설명되어 있습니다.

또한 클라이언트 OS에 의존하는 것처럼 보이며 RHEL 또는 Windows보다 Ubuntu에서 Etc / UTC가 실패 할 가능성이 더 큽니다. 나는 이것이 약간의 정규화 때문이라고 생각하지만 정확히 무엇을 알지 못했습니다.


14
  1. 이클립스에서 실행 -> 구성 실행

  2. 오른쪽 패널의 JRE 탭으로 이동합니다.

  3. 에서 VM 인수 섹션이 붙여 넣기

    -Duser.timezone=GMT

  4. 그런 다음 적용-> 실행


8

지속적 통합 서버에서 자동화 된 테스트를 실행할 때이 문제가 발생했습니다. -Duser.timezone=GMT빌드 매개 변수에 VM 인수 " "를 추가하려고했지만 문제가 해결되지 않았습니다. 그러나 환경 변수 " TZ=GMT"를 추가하면 문제가 해결되었습니다.


2
"TZ = GMT"환경 변수도 저에게 효과적이었습니다. Oracle에 액세스하는 별도의 도구를 실행하기위한 환경을 설정하는 쉘 스크립트에 문제가있었습니다.
David Keener

1
같은 문제가 발생하여 "ant"를 사용할 때 "TZ = Europe / Zurich"를 사용해야했습니다. 작동했습니다!
Christof Kälin

2
이것이 최고의 답변이어야합니다. 다른 모든 답변은 작동하지 않았습니다.
Alex Dembo 2019 년

4

오류 :

ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다 ORA-01882 : 시간대 영역을 찾을 수 없습니다

솔루션 : Centos에서 CIM 설정.

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

다음 Java 인수를 추가하십시오.

JAVA_ARGS="${JAVA_ARGS} -Duser.timezone=EDT"

3

Netbeans에서는

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭-> 속성
  2. 실행으로 이동 (범주 아래)
  3. VM 옵션 아래에 -Duser.timezone = UTC 또는 -Duser.timezone = GMT를 입력합니다.

확인을 클릭 한 다음 프로그램을 다시 실행하십시오.

참고 : UTC 및 GMT 이외의 다른 타임 스톤으로 설정할 수도 있습니다.


2

Tomcat 에서이 문제가 발생했습니다. 다음을 설정하면 $CATALINA_BASE/bin/setenv.sh문제 가 해결되었습니다.

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

다른 답변의 Java 매개 변수 제안 중 하나를 사용하면 같은 방식으로 작동 할 것이라고 확신합니다.


2

나는 또한 비슷한 문제에 직면했습니다.

환경:

oracle 11g 데이터베이스를 쿼리하는 동안 Linux, 최대 절전 모드 프로젝트, ojdbc6 드라이버.

해결

TZ 매개 변수는 기본적으로 Oracle에게 시간대에 대해 알려주는 Linux 시스템에서 설정되지 않았습니다. 그래서 응용 프로그램 시작시 내보내기 문구 "export TZ = UTC"를 추가하면 내 문제가 해결되었습니다.

UTC-> 시간대에 맞게 변경하십시오.


2

이 문제가 JDeveloper에있는 경우 : 모델 및 뷰 프로젝트 모두에 대한 프로젝트 속성 변경-> 실행 / 디버그-> 기본 프로필-> 편집 다음 실행 옵션 추가 : -Duser.timezone = Asia / Calcutta

위의 시간대 값이 다음과 같이 데이터베이스에서 가져 왔는지 확인합니다.

select TZNAME from V$TIMEZONE_NAMES;

이와 함께 jdev.conf 및 JDeveloper-> 애플리케이션 메뉴-> 기본 프로젝트 속성-> 실행 / 디버그-> 기본 프로필-> 실행 옵션에서 시간대 설정을 확인하고 싶습니다.


1

JDeveloper에서 연결을 만들려고 할 때도 같은 문제가 발생했습니다. 서버가 다른 시간대에 있으므로 다음과 같은 오류가 발생했습니다.

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

프로젝트 속성 및 기본 프로젝트 속성의 Java 옵션 (실행 / 디버그 / 프로필)에 시간대를 포함하도록 요청한 많은 포럼을 b -Duser.timezone="+02:00"하지만 작동하지 않았습니다. 마지막으로 다음 솔루션이 저에게 효과적이었습니다.

JDeveloper의 구성 파일 ( jdev.conf )에 다음 줄을 추가합니다 .

AddVMOption -Duser.timezone=UTC+02:00

파일은 "<oracle 설치 루트> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf"에 있습니다.


1

제 경우에는 "TZR"을 "TZD"로 변경하여 쿼리를 작동시킬 수 있습니다.

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

1

Linux 시스템 (Centos6.5)에서 시간대를 설정하여 동일한 문제를 해결할 수있었습니다.

재 게시

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

  1. /etc/sysconfig/clock예를 들어 ZONE = "America / Los_Angeles"로 설정된 시간대 설정

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

시간대 값을 알아 내려면

ls /usr/share/zoneinfo

시간대를 나타내는 파일을 찾으십시오.

이러한 설정을 완료하면 시스템을 재부팅하고 다시 시도하십시오.


2
저에게는 / etc / sysconfig / clock 및 / etc / localtime 링크가 올바르게 설정되었는지 확인하는 것이 기본적으로 ORA-01882 문제를 해결하기위한 전제 조건이었습니다.
David Keener

1

OBIEE에서 Oracle db에 연결하려고 할 때 동일한 문제가 발생했습니다. Windows 시간대를 (GMT + 01 : 00) 서부 중앙 아프리카에서 (GMT + 01 : 00) 브뤼셀, 코펜하겐, 마드리드, 파리로 변경했습니다. 그런 다음 컴퓨터를 재부팅했는데 제대로 작동했습니다. 오라클은 서부 중앙 아프리카 시간대를 인식하지 못한 것 같습니다.


1

이 문제는 db에 연결하려는 코드에 db가 아닌 시간대가 있기 때문에 발생합니다. 시간대를 아래와 같이 설정하거나 oracle db에서 사용할 수있는 유효한 시간대를 설정하여 해결할 수도 있습니다. 찾을 수있는 유효한 시간대 select * from v $ version;

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


0

Eclipse와 먼 Oracle Database를 사용하여 동일한 문제에 직면하여 데이터베이스 서버의 시간대와 일치하도록 시스템 시간대 를 변경 하여 문제를 해결했습니다. 시스템 시간대를 변경 한 후 기기를 다시 시작하십시오 .

나는 이것이 누군가를 도울 수 있기를 바랍니다.


0

java.sql.SQLException : ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다. ORA-01882 : 시간대 영역을 찾을 수 없습니다.

이러한 유형의 오류의 경우 시스템 시간을 해당 국가의 표준 GMT 형식으로 변경하십시오.

예 : 인도 시간대는 첸나이, 콜카타입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.