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ờ
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ờ
Câu trả lời:
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=false
và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=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
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
.
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ậ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
Đ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ì.
trong eclipse, hãy chạy -> chạy cấu hình
trong đó chuyển đến tab JRE trong bảng điều khiển bên phải
trong phần Đối số VM, hãy dán
-Duser.timezone=GMT
sau đó Áp dụng -> Chạy
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.
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"
Trong Netbeans,
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.
Tôi cũng phải đối mặt với vấn đề tương tự.
Linux, dự án ngủ đông, trình điều khiển ojdbc6 trong khi truy vấn cơ sở dữ liệu oracle 11g.
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.
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.
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".
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 ?";
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
đặt múi giờ trong /etc/sysconfig/clock
ví dụ: đặt thành ZONE = "America / Los_Angeles"
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.
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.
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);
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.