programing

ORA-01882: 시간대 영역을 찾을 수 없습니다.

linuxpc 2023. 3. 22. 20:49
반응형

ORA-01882: 시간대 영역을 찾을 수 없습니다.

Java 어플리케이션에서 Oracle Database에 접속하고 있을 때 어플리케이션 실행 시 다음 오류가 발생합니다.

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으로 대체하면 문제가 해결되었습니다.

, 「.0.3.0을 에러할 수 .oracle.jdbc.timezoneAsRegion=false파일 oracle/jdbc/defaultConnectionProperties.properties(jar 내부).솔루션을 찾았습니다(링크 끊김).

그러면 추가가 가능합니다.-Doracle.jdbc.timezoneAsRegion=false 라인 「 라인」으로 합니다.AddVMOption -Doracle.jdbc.timezoneAsRegion=false설정하다

수 . 를 들어, '어느 정도'로 할 수 있습니다. ★★★★★★★★★★★★★★★★★,System.setProperty.

경우에 따라서는 환경변수를 접속별로 추가할 수 있습니다(SQL Developer는 "고급" 접속 속성에서 이를 허용합니다. 문제가 없는 데이터베이스에 연결하고 문제가 있는 데이터베이스에 데이터베이스 링크를 사용할 때 이 변수가 동작하는지 확인했습니다).

보통 Windows에서 SQL-Developer를 설치하는 경우 디렉토리로 이동합니다.

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 수준 1ORA-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(tz파일 버전 18)에 대해 알고 있는 DB 서버도 있지만 UTC(tz 버전 11)만 알고 있는 서버도 있습니다.

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

JDBC 클라이언트 측에서도 다른 동작이 있습니다.11.2부터 드라이버는 존 ID가 "알려진" 경우 Oracle에 전송되지만, 시간 오프셋을 전송하기 전에는 전송되지 않습니다.이 「이미 알고 있는 ID 의 송신」의 문제는, 클라이언트는 서버에 존재하는 타임 존버전/콘텐츠를 체크하지 않고, 독자적인 리스트가 있는 것입니다.

이에 대한 설명은 Oracle 지원 문서 [ID 1068063.1]를 참조하십시오.

클라이언트 OS에 따라 다를 수도 있습니다.RHEL이나 Windows보다 Ubuntu에서 Etc/UTC가 실패할 가능성이 높습니다.정상화 때문인 것 같은데 정확히 뭔지는 모르겠어요.

  1. exclipse go 실행 - > 실행 컨피규레이션

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

  3. [VM Arguments]섹션에서 붙여넣기

    -Duser.timezone=GMT

  4. 다음으로 [Apply]- > [ Run ]를 선택합니다.

연속 연동 서버에서 자동 테스트를 실행할 때 이 문제가 발생했습니다.인수를 .-Duser.timezone=GMT"를 빌드 파라미터로 설정했지만 문제는 해결되지 않았습니다.',, 경수 "'TZ=GMT'이렇게 하면'

Tomcat tomcat tomcat tomcat tomcat tomcat tomcat tomcat tomcat tomcat 。에서 다음 $CATALINA_BASE/bin/setenv.sh문제를 해결했습니다.

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

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

오류:

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"

Netbeans에서는

  1. 프로젝트를 우클릭 -> 속성
  2. 실행으로 이동(카테고리 아래)
  3. -Duser.timezone=을 입력합니다.UTC 또는 -Duser.timezone=[VM Options ]

[확인]을 클릭하여 프로그램을 다시 실행합니다.

주의: UTC 및 GMT 이외의 다른 시간대에 설정할 수도 있습니다.

이 문제가 JDeveloper에 있는 경우:모델 및 뷰 프로젝트의 프로젝트 속성을 변경합니다. -> run/display -> 기본 프로파일 -> edit add 실행 옵션 -Duser.timezone= Asia/Calcutta

위의 타임존 값이 다음과 같이 데이터베이스에서 Import되었는지 확인합니다.

select TZNAME from V$TIMEZONE_NAMES;

이와 함께 JDev.conf 및 JDeveloper -> Application Menu -> Default Project Propertes -> Run/Debug -> Default Profile -> Run Options에서 시간대 설정을 확인합니다.

저도 비슷한 문제에 직면했습니다.

환경:

Linux, hibernate 프로젝트, ojdbc6 드라이버, oracle 11g 데이터베이스 쿼리 중.

결의안

Linux 머신에서는 TZ 파라미터가 설정되어 있지 않습니다.이 파라미터는 기본적으로 Oracle에게 타임존을 알려줍니다.따라서 내보내기 통계 추가 후 "export TZ="UTC"에서 문제가 해결되었습니다.

UTC --> 시간대로 어카인드를 변경합니다.

OBIEE에서 Oracle db에 접속하려고 할 때도 같은 문제가 있었습니다.Windows 시간대를 (GMT+01:00) West Central Africa에서 (GMT+01:00) 브뤼셀, 코펜하겐, 마드리드, 파리로 변경했습니다.그리고 컴퓨터를 재부팅했더니 잘 작동했어요.오라클이 서중앙아프리카 시간대를 인식하지 못한 것 같아요

이 문제는 db에 연결하려는 코드가 db에 없는 시간대를 가지고 있기 때문에 발생합니다.또한 다음과 같이 표준 시간대를 설정하거나 oracle db에서 사용 가능한 유효한 표준 시간대를 설정하여 해결할 수 있습니다. v$version에서 *를 선택하십시오.

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

저도 JDeveloper에서 연결을 시도했을 때 같은 문제가 있었습니다.서버가 다른 타임존에 배치되어 있기 때문에, 다음과 같은 에러가 발생했습니다.

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

및 Project Options을 Project로 많이 했습니다.-Duser.timezone="+02:00"이치노마침내 다음과 같은 해결책이 나에게 효과가 있었다.

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

AddVMOption -Duser.timezone=UTC+02:00

파일은 "<oracle installation root>\Middleware\jdeveloper\jdev\bin\jdev.conf"에 있습니다.

저 같은 경우에는 "TZR"을 "TZD"로 변경하여 쿼리를 실행할 수 있었습니다.

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

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

재투고원

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

  1. 를 설정하다/etc/sysconfig/clock ZONE=로 합니다.

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

시간대 값을 계산하려면

ls /usr/share/zoneinfo

타임존을 나타내는 파일을 찾습니다.

설정 후 컴퓨터를 재부팅하고 다시 시도하십시오.

Eclipse 및 원격 Oracle Database를 사용하여 동일한 문제에 직면한 경우 데이터베이스 서버의 시간대에 맞게 시스템 시간대를 변경하면 문제가 해결되었습니다.시스템 표준 시간대를 변경한 후 기계를 다시 시작하십시오.

이게 누군가에게 도움이 됐으면 좋겠다

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

이런 유형의 오류는 시스템 시간을 해당 국가의 표준 GMT 형식으로 변경하기만 하면 됩니다.

예를 들어 인도 시간대는 콜카타 주 첸나이입니다.

잘못된 버전의 OJDBC jar를 사용할 때 발생합니다.

11.2.0.4를 사용해야 합니다.

저 같은 경우에는 이 명령어로 OS레벨(ubuntu)로 타임존을 설정합니다.

timedatectl set-timezone {timezone}

예를들면,

timedatectl set-timezone Africa/Kampala

조금 늦을 수도 있지만 누군가에게 도움이 될 수도 있어요.spring-boot 어플리케이션 작업 중 이 문제가 발생하여 Oracle DB에 연결하지 못했습니다.

오류:

java.sql.SQLException: ORA-00604: 재귀 SQL 수준 1에서 오류가 발생했습니다.

ORA-01882: 시간대 영역을 찾을 수 없습니다.

SELECT DBTIMEZONE FROM dual; -- This return: +00:00
timedatectl #The OS on the other hand returned correct time and timezone

시스템 관리자가 아니기 때문에 시스템 설정을 변경할 수 없기 때문에 코드에 회피책을 적용해야 했습니다.

spring.datasource.hikari.data-source-properties.oracle.jdbc.timezoneAsRegion=false
#Added the above into the application property file 

동작하고 있는 솔루션은, 다음의 링크로부터 입수할 수 있습니다.

현용 솔루션 URL

편집


DBA가 누락된 시간대 패치로 Oracle을 패치한 후 위의 (...timezoneAsRegion=false)가 더 이상 필요하지 않게 되었습니다.

Spring-Boot 어플리케이션의 경우 - // 아래에 두 줄 추가

@SpringBootApplication
public class  Application {
  public static void main(String[] args) {
     // add below two lines
      System.out.println("Setting the timezone"+TimeZone.getTimeZone("GMT+9:00").getID());
      TimeZone.setDefault(TimeZone.getTimeZone("GMT+9:00"));
      SpringApplication.run(Application.class, args);
  }
}

언급URL : https://stackoverflow.com/questions/9156379/ora-01882-timezone-region-not-found

반응형