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

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

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



답변

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에 추가 할 수 있습니다.


답변

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

C:\Program Files\sqldeveloper\sqldeveloper\bin

추가

AddVMOption -Duser.timezone=CET

파일에 sqldeveloper.conf.


답변

내가 얻은 오류 :

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

이제 작동합니다 !!


답변

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

oracle.jdbc.timezoneAsRegion=false


답변

일어나는 일은 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가 실패 할 가능성이 더 큽니다. 나는 이것이 약간의 정규화 때문이라고 생각하지만 정확히 무엇을 알지 못했습니다.


답변

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

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

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

    -Duser.timezone=GMT

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


답변

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