ORA-01882: không tìm thấy vùng múi giờ


102

Tôi đang truy cập Cơ sở dữ liệu Oracle từ một ứng dụng java, khi chạy ứng dụng của mình, tôi gặp lỗi sau:

java.sql.SQLException: ORA-00604: lỗi xảy ra ở SQL đệ quy cấp 1 ORA-01882: không tìm thấy vùng múi giờ


Hãy cho chúng tôi biết về môi trường của bạn, cách bạn chạy java của mình?
ABCade

Tôi đang chạy ứng dụng Java trên dòng lệnh. Windows 7 64bit, nhưng Oracle DB đang chạy trên máy chủ Unix từ xa.
ndalama

9
cố gắng thêm "-Duser.timezone = <YOUR_GMT>" vào lệnh của bạn, đừng quên thay thế <YOUR_GMT> bằng GMT của bạn, tức là -Duser.timezone = "+ 05:30"
ABCade

Câu trả lời:


87

Bạn cũng có thể thử kiểm tra phiên bản của trình điều khiển Oracle jdbc và cơ sở dữ liệu Oracle. Mới hôm nay, tôi đã gặp sự cố này khi sử dụng ojdbc6.jar (phiên bản 11.2.0.3.0) để kết nối với máy chủ Oracle 9.2.0.4.0. Thay thế nó bằng ojdbc6.jar phiên bản 11.1.0.7.0 đã giải quyết được vấn đề.

Tôi cũng đã quản lý để kết nối ojdbc6.jar phiên bản 11.2.0.3.0 mà không bị lỗi, bằng cách thêm oracle.jdbc.timezoneAsRegion=falsevào tệp oracle / jdbc / defaultConnectionProperties.properties (bên trong jar). Tìm thấy giải pháp này ở đây

Cuối cùng, người ta có thể thêm -Doracle.jdbc.timezoneAsRegion=falsevào dòng lệnh hoặc AddVMOption -Doracle.jdbc.timezoneAsRegion=falsetrong các tệp cấu hình sử dụng ký hiệu này


24
Tôi cũng đã quản lý để kết nối ojdbc6.jar phiên bản 11.2.0.3.0 mà không bị lỗi, bằng cách thêm oracle.jdbc.timezoneAsRegion = false trong tệp oracle / jdbc / defaultConnectionProperties.properties (bên trong jar). Tìm thấy giải pháp này tại đây: forum.oracle.com/forums/thread.jspa?threadID=1095807
Matteo Steccolini

33
Cuối cùng, người ta có thể thêm -Doracle.jdbc.timezoneAsRegion = false vào dòng lệnh hoặc AddVMOption -Doracle.jdbc.timezoneAsRegion = false trong các tệp cấu hình sử dụng ký hiệu này.
Matteo Steccolini

Cảm ơn stmsat. Nó đã làm việc cho tôi. Tôi đã thay đổi jar ojdbc của mình thành phiên bản 11.1.0.7.0 trong thư mục tomcat / lib và nó bắt đầu hoạt động :).
mdev

1
Tôi đang sử dụng maven để xây dựng và đóng gói (chiến tranh) dự án của mình và triển khai trong Cloud Flare, có cách nào có thể thực hiện thiết lập thuộc tính này từ tệp application.properties hoặc từ maven không.
Ismail

40

Trong một bản cài đặt SQL-Developer đơn giản trong Windows, hãy chuyển đến thư mục

C:\Program Files\sqldeveloper\sqldeveloper\bin

và thêm vào

AddVMOption -Duser.timezone=CET

vào hồ sơ sqldeveloper.conf.


Sử dụng Jetbrains DataGrip và phải đối mặt với cùng một vấn đề sau khi thêm Tùy chọn VM này vấn đề đã được giải quyết
latsha

Cảm ơn, điều này thực sự đã giúp rất nhiều!
Quinton

27

Tôi gặp lỗi:

Lỗi từ db_connection.java - >> java.sql.SQLException: ORA-00604: lỗi xảy ra ở SQL đệ quy cấp 1 ORA-01882: không tìm thấy vùng múi giờ

ORA-00604: lỗi xảy ra ở SQL đệ quy cấp 1ORA-01882: không tìm thấy vùng múi giờ

Mã trước:

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

Mã mới:

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

bây giờ nó đang hoạt động !!


Cảm ơn bạn, đó là chính xác những gì tôi cần!
Alan Thompson

Tôi không biết tại sao nó không thích múi giờ mặc định "Châu Âu / Madrid". Đặt múi giờ mặc định thành 'GMT' sẽ hoạt động.
fgui

22

Cập nhật tệp oracle / jdbc / defaultConnectionProperties.properties trong bất kỳ phiên bản nào của thư viện (tức là bên trong jar của bạn) mà bạn đang sử dụng để chứa dòng bên dưới:

oracle.jdbc.timezoneAsRegion=false

19

Điều xảy ra là ứng dụng khách JDBC gửi ID múi giờ đến Máy chủ. Máy chủ cần biết vùng đó. Bạn có thể kiểm tra với

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

Tôi có một số máy chủ db biết về 'Etc / UTC' và 'UTC' (tzfile phiên bản 18) nhưng những máy chủ khác chỉ biết 'UTC' (tz phiên bản 11).

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

Ngoài ra còn có các hành vi khác nhau ở phía máy khách JDBC. Bắt đầu với 11.2, trình điều khiển sẽ gửi các ID vùng nếu nó được "biết" cho Oracle, trong khi trước khi nó gửi thời gian bù. Vấn đề với việc "gửi các ID đã biết" này là máy khách không kiểm tra phiên bản / nội dung múi giờ nào hiện có trên máy chủ nhưng có danh sách riêng của nó.

Điều này được giải thích trong Bài viết hỗ trợ của Oracle [ID 1068063.1].

Có vẻ như nó cũng phụ thuộc vào Hệ điều hành máy khách, nhiều khả năng Etc / UTC không thành công với Ubuntu hơn RHEL hoặc Windows. Tôi đoán điều này là do một số chuẩn hóa nhưng tôi chưa tìm ra chính xác điều gì.


14
  1. trong eclipse, hãy chạy -> chạy cấu hình

  2. trong đó chuyển đến tab JRE trong bảng điều khiển bên phải

  3. trong phần Đối số VM, hãy dán

    -Duser.timezone=GMT

  4. sau đó Áp dụng -> Chạy


8

Tôi đã gặp sự cố này khi chạy kiểm tra tự động từ máy chủ tích hợp liên tục. Tôi đã thử thêm đối số VM " -Duser.timezone=GMT" vào tham số bản dựng, nhưng điều đó không giải quyết được vấn đề. Tuy nhiên, việc thêm biến môi trường " TZ=GMT" đã khắc phục được sự cố cho tôi.


2
Biến môi trường "TZ = GMT" cũng hoạt động với tôi. Tôi đang gặp sự cố với một tập lệnh shell thiết lập môi trường để chạy một công cụ riêng biệt mà từ đó truy cập vào Oracle.
David Keener

1
Có cùng một vấn đề, tôi cũng phải sử dụng "TZ = Europe / Zurich" khi sử dụng "ant". Nó đã làm việc!
Christof Kälin

2
Đây phải là câu trả lời hàng đầu. Tất cả các câu trả lời khác không hoạt động.
Alex Dembo

4

LỖI :

ORA-00604: lỗi xảy ra ở SQL đệ quy cấp 1 ORA-01882: không tìm thấy vùng múi giờ

Giải pháp: Thiết lập CIM trong Centos.

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

Thêm đối số java này:

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

3

Trong Netbeans,

  1. Nhấp chuột phải vào dự án của bạn -> Thuộc tính
  2. Đi tới Chạy (trong Danh mục)
  3. Nhập -Duser.timezone = UTC hoặc -Duser.timezone = GMT trong Tùy chọn VM.

Nhấp vào Ok, sau đó chạy lại chương trình của bạn.

Lưu ý: Bạn cũng có thể đặt thành các mốc thời gian khác ngoài UTC & GMT.


2

Tôi gặp phải vấn đề này với Tomcat. Đặt những điều sau vào đã $CATALINA_BASE/bin/setenv.shgiải quyết được sự cố:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

Tôi chắc chắn rằng việc sử dụng một trong các đề xuất tham số Java từ các câu trả lời khác sẽ hoạt động theo cách tương tự.


2

Tôi cũng phải đối mặt với vấn đề tương tự.

Môi trường:

Linux, dự án ngủ đông, trình điều khiển ojdbc6 trong khi truy vấn cơ sở dữ liệu oracle 11g.

Độ phân giải

Tham số TZ không được đặt trong máy linux, về cơ bản nó cho phép thần biết về múi giờ. Vì vậy, sau khi thêm trạng thái xuất "export TZ = UTC" tại thời điểm bắt đầu ứng dụng đã giải quyết được vấn đề của tôi.

UTC -> Thay đổi cộng dồn cho múi giờ của bạn.


2

Nếu sự cố này là trong JDeveloper: Thay đổi thuộc tính dự án cho cả mô hình và dự án dạng xem -> chạy / gỡ lỗi -> cấu hình mặc định -> chỉnh sửa, thêm tùy chọn chạy sau: -Duser.timezone = Asia / Calcutta

Đảm bảo rằng giá trị múi giờ ở trên được tìm nạp từ cơ sở dữ liệu của bạn như sau:

select TZNAME from V$TIMEZONE_NAMES;

Cùng với đó, bạn muốn kiểm tra cài đặt múi giờ trong jdev.conf của mình cũng như trong JDeveloper -> Menu ứng dụng -> Dự án mặc định đúng -> Chạy / gỡ lỗi -> Hồ sơ mặc định -> Tùy chọn chạy.


1

Tôi cũng gặp phải vấn đề tương tự khi cố gắng tạo kết nối trong JDeveloper. Máy chủ của chúng tôi nằm ở múi giờ khác và do đó nó đã phát sinh các lỗi dưới đây như:

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

Tôi đã tham khảo nhiều diễn đàn yêu cầu bao gồm múi giờ trong Tùy chọn Java (Chạy / Gỡ lỗi / Hồ sơ) của thuộc tính Dự án và thuộc tính Dự án mặc định là -Duser.timezone="+02:00"b Nhưng nó không hoạt động với tôi. Cuối cùng giải pháp sau đây đã làm việc cho tôi.

Thêm dòng sau vào tệp cấu hình của JDeveloper ( jdev.conf ).

AddVMOption -Duser.timezone=UTC+02:00

Tệp nằm trong "<gốc cài đặt oracle> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf".


1

Trong trường hợp của tôi, tôi có thể làm cho truy vấn hoạt động bằng cách thay đổi "TZR" bằng "TZD" ..

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

1

Tôi đã có thể giải quyết vấn đề tương tự bằng cách đặt múi giờ trong hệ thống linux của mình (Centos6.5).

Đăng lại từ

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

  1. đặt múi giờ trong /etc/sysconfig/clockví dụ: đặt thành ZONE = "America / Los_Angeles"

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

Để tìm ra giá trị múi giờ, hãy thử

ls /usr/share/zoneinfo

và tìm tệp đại diện cho múi giờ của bạn.

Sau khi bạn thiết lập xong, hãy khởi động lại máy và thử lại.


2
Đối với tôi, đảm bảo rằng / etc / sysconfig / clock và liên kết / etc / localtime được đặt đúng cách về cơ bản là điều kiện tiên quyết để giải quyết vấn đề ORA-01882.
David Keener

1

Tôi đã gặp sự cố tương tự khi cố gắng tạo kết nối trên OBIEE với Oracle db. Tôi đã thay đổi múi giờ Windows của mình từ (GMT + 01: 00) Tây Trung Phi thành (GMT + 01: 00) Brussels, Copenhagen, Madrid, Paris. Sau đó, tôi khởi động lại máy tính của mình và nó hoạt động tốt. Có vẻ như Oracle đã không thể nhận ra múi giờ phía tây trung tâm châu Phi.


1

Sự cố này xảy ra khi mã đang cố gắng kết nối với db, có múi giờ không nằm trong db. Nó cũng có thể được giải quyết bằng cách đặt múi giờ như bên dưới hoặc bất kỳ múi giờ hợp lệ nào có sẵn trong oracle db. múi giờ hợp lệ có thể được tìm thấy chọn * từ phiên bản v $;

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


0

Đối mặt với vấn đề tương tự bằng cách sử dụng Eclipse và Cơ sở dữ liệu Oracle ở xa, việc thay đổi múi giờ hệ thống của tôi để khớp với múi giờ của máy chủ cơ sở dữ liệu đã khắc phục sự cố. Khởi động lại máy sau khi thay đổi múi giờ hệ thống.

Tôi hy vọng điều này có thể giúp ai đó


0

java.sql.SQLException: ORA-00604: lỗi xảy ra ở SQL đệ quy cấp 1 ORA-01882: không tìm thấy vùng múi giờ

Đối với loại lỗi này, chỉ cần thay đổi giờ hệ thống của bạn thành định dạng GMT tiêu chuẩn của quốc gia bạn

ví dụ múi giờ của Ấn Độ là chennai, kolkata.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.