ORA-01882: ไม่พบเขตเวลา


103

ฉันกำลังเข้าถึง Oracle Database จากแอปพลิเคชัน java เมื่อฉันเรียกใช้แอปพลิเคชันของฉันฉันได้รับข้อผิดพลาดต่อไปนี้:

java.sql.SQLException: ORA-00604: ข้อผิดพลาดเกิดขึ้นที่ SQL แบบเรียกซ้ำระดับ 1 ORA-01882: ไม่พบเขตเวลา


บอกเราเกี่ยวกับสภาพแวดล้อมของคุณคุณเรียกใช้ java ของคุณอย่างไร
ABCade

ฉันกำลังใช้งานแอปพลิเคชัน Java บนบรรทัดคำสั่ง Windows 7 64 บิต แต่ Oracle DB กำลังทำงานบนเซิร์ฟเวอร์ Unix ระยะไกล
ndalama

9
พยายามเพิ่ม "-Duser.timezone = <YOUR_GMT>" ในคำสั่งของคุณอย่าลืมแทนที่ <YOUR_GMT> ด้วย GMT ของคุณเช่น -Duser.timezone = "+ 05:30"
ABCade

คำตอบ:


91

คุณอาจลองตรวจสอบเวอร์ชันของไดรเวอร์ Oracle jdbc และฐานข้อมูล Oracle วันนี้ฉันมีปัญหานี้เมื่อใช้ ojdbc6.jar (เวอร์ชัน 11.2.0.3.0) เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ Oracle 9.2.0.4.0 การแทนที่ด้วย ojdbc6.jar เวอร์ชัน 11.1.0.7.0 ช่วยแก้ปัญหาได้

ฉันยังจัดการทำให้ ojdbc6.jar เวอร์ชัน 11.2.0.3.0 เชื่อมต่อโดยไม่มีข้อผิดพลาดโดยการเพิ่มoracle.jdbc.timezoneAsRegion=falseไฟล์ oracle / jdbc / defaultConnectionProperties.properties (ภายใน jar) พบวิธีแก้ปัญหานี้ที่นี่ (ลิงก์เสีย)

จากนั้นสามารถเพิ่ม-Doracle.jdbc.timezoneAsRegion=falseในบรรทัดคำสั่งหรือAddVMOption -Doracle.jdbc.timezoneAsRegion=falseในไฟล์ config ที่ใช้สัญกรณ์นี้

System.setPropertyนอกจากนี้คุณยังสามารถทำเช่นนี้ทางโปรแกรมเช่นกับ

ในบางกรณีคุณสามารถเพิ่มตัวแปรสภาพแวดล้อมตามการเชื่อมต่อแต่ละครั้งได้หากอนุญาต (นักพัฒนา SQL อนุญาตให้ใช้ในคุณสมบัติการเชื่อมต่อ "ขั้นสูง" ฉันยืนยันว่าใช้งานได้เมื่อเชื่อมต่อกับฐานข้อมูลที่ไม่มีปัญหาและใช้ ลิงค์ฐานข้อมูลไปยังฐานข้อมูลที่มี)


24
ฉันยังจัดการทำให้ ojdbc6.jar เวอร์ชัน 11.2.0.3.0 เชื่อมต่อโดยไม่มีข้อผิดพลาดโดยการเพิ่ม oracle.jdbc.timezoneAsRegion = false ในไฟล์ oracle / jdbc / defaultConnectionProperties.properties (ภายใน jar) พบโซลูชันนี้ที่นี่: forums.oracle.com/forums/thread.jspa?threadID=1095807
Matteo Steccolini

33
สุดท้ายคุณสามารถเพิ่ม -Doracle.jdbc.timezoneAsRegion = false ในบรรทัดคำสั่งหรือ AddVMOption -Doracle.jdbc.timezoneAsRegion = false ในไฟล์ config ที่ใช้สัญกรณ์นี้
Matteo Steccolini

ขอบคุณ stmsat มันได้ผลสำหรับฉัน ฉันเปลี่ยน ojdbc jar เป็นเวอร์ชัน 11.1.0.7.0 ในไดเร็กทอรี tomcat / lib และเริ่มทำงาน :)
mdev

1
ฉันใช้ maven เพื่อสร้างและทำแพ็กเกจ (สงคราม) โปรเจ็กต์ของฉันและปรับใช้ใน Cloud Flare มีวิธีใดบ้างที่สามารถตั้งค่าคุณสมบัตินี้ได้จากไฟล์application.propertiesหรือจาก maven
Ismail

41

ในการติดตั้ง SQL-Developer แบบธรรมดาภายใต้ 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 แบบเรียกซ้ำ 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;
}

ตอนนี้ใช้งานได้แล้ว !!


ขอบคุณนั่นคือสิ่งที่ฉันต้องการ!
Alan Thompson

ฉันไม่รู้ว่าทำไมมันถึงไม่ชอบเขตเวลาเริ่มต้น 'Europe / Madrid' การตั้งค่าเขตเวลาเริ่มต้นเป็น 'GMT' ทำงานได้
fgui

22

อัพเดตไฟล์oracle / jdbc / defaultConnectionProperties.propertiesในเวอร์ชันใด ๆ ของไลบรารี (เช่นภายใน jar ของคุณ) ที่คุณใช้เพื่อให้มีบรรทัดด้านล่าง:

oracle.jdbc.timezoneAsRegion=false

19

สิ่งที่เกิดขึ้นคือไคลเอนต์ JDBC ส่งรหัสเขตเวลาไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จำเป็นต้องทราบโซนนั้น คุณสามารถตรวจสอบกับ

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

ฉันมีเซิร์ฟเวอร์ db บางตัวที่รู้เกี่ยวกับ 'Etc / UTC' และ 'UTC' (tzfile เวอร์ชัน 18) แต่คนอื่นรู้แค่ 'UTC' (tz เวอร์ชัน 11)

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

นอกจากนี้ยังมีลักษณะการทำงานที่แตกต่างกันในฝั่งไคลเอ็นต์ JDBC เริ่มต้นด้วย 11.2 ไดรเวอร์จะส่งรหัสโซนหาก "ทราบ" ไปยัง Oracle ในขณะที่ก่อนที่จะส่งการชดเชยเวลา ปัญหาเกี่ยวกับ "การส่ง ID ที่รู้จัก" นี้คือไคลเอนต์ไม่ได้ตรวจสอบเวอร์ชัน / เนื้อหาที่มีอยู่บนเซิร์ฟเวอร์ แต่มีรายการของตัวเอง

สิ่งนี้อธิบายไว้ใน Oracle Support Article [ID 1068063.1]

ดูเหมือนว่าจะขึ้นอยู่กับระบบปฏิบัติการไคลเอ็นต์ด้วยเช่นกันมีแนวโน้มว่า Etc / UTC จะล้มเหลวกับ Ubuntu มากกว่า RHEL หรือ Windows ฉันเดาว่านี่เป็นเพราะการทำให้เป็นมาตรฐาน แต่ฉันยังไม่ทราบว่าอะไรกันแน่


14
  1. ใน eclipse go run -> รันการกำหนดค่า

  2. จากนั้นไปที่แท็บJREในแผงด้านขวา

  3. ในส่วนVM Argumentsให้วางสิ่งนี้

    -Duser.timezone=GMT

  4. จากนั้นใช้ -> เรียกใช้


8

ฉันมีปัญหานี้เมื่อเรียกใช้การทดสอบอัตโนมัติจากเซิร์ฟเวอร์การรวมแบบต่อเนื่อง ฉันพยายามเพิ่มอาร์กิวเมนต์ VM " -Duser.timezone=GMT" ในพารามิเตอร์การสร้าง แต่ไม่สามารถแก้ปัญหาได้ อย่างไรก็ตามการเพิ่มตัวแปรสภาพแวดล้อม " TZ=GMT" ช่วยแก้ปัญหาให้ฉันได้


2
ตัวแปรสภาพแวดล้อม "TZ = GMT" ก็ใช้ได้เช่นกัน ฉันมีปัญหากับเชลล์สคริปต์ที่ตั้งค่าสภาพแวดล้อมสำหรับการเรียกใช้เครื่องมือแยกต่างหากซึ่งในทางกลับกันก็เข้าถึง Oracle
David Keener

1
มีปัญหาเดียวกันฉันก็ต้องใช้ "TZ = Europe / Zurich" เมื่อใช้ "ant" มันได้ผล!
Christof Kälin

2
นี่น่าจะเป็นคำตอบอันดับต้น ๆ คำตอบอื่น ๆ ไม่ได้ผล
Alex Dembo

4

ข้อผิดพลาด:

ORA-00604: เกิดข้อผิดพลาดที่เรียกซ้ำ SQL ระดับ 1 ORA-01882: ไม่พบเขตเวลา

วิธีแก้ไข: การตั้งค่า CIM ใน Centos

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

เพิ่มอาร์กิวเมนต์ java นี้:

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

3

ใน Netbeans

  1. คลิกขวาที่โครงการของคุณ -> คุณสมบัติ
  2. ไปที่เรียกใช้ (ภายใต้หมวดหมู่)
  3. ป้อน -Duser.timezone = UTC หรือ -Duser.timezone = GMT ภายใต้ตัวเลือก VM

คลิกตกลงจากนั้นเรียกใช้โปรแกรมของคุณอีกครั้ง

หมายเหตุ: คุณสามารถตั้งค่าเป็น timestones อื่น ๆ ได้เช่นกันนอกเหนือจาก UTC & GMT


3

ฉันพบปัญหานี้กับ Tomcat การตั้งค่าต่อไปนี้ในการ$CATALINA_BASE/bin/setenv.shแก้ไขปัญหา:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

ฉันแน่ใจว่าการใช้หนึ่งในคำแนะนำพารามิเตอร์ Java จากคำตอบอื่น ๆ จะได้ผลในลักษณะเดียวกัน


2

ฉันก็ประสบปัญหาเดียวกันเช่นกัน

สิ่งแวดล้อม:

Linux, hibernate project, ojdbc6 driver ขณะสืบค้นฐานข้อมูล oracle 11g

ความละเอียด

ไม่ได้ตั้งค่าพารามิเตอร์ TZ ในเครื่อง linux ซึ่งโดยทั่วไปจะบอก oracle เกี่ยวกับเขตเวลา ดังนั้นหลังจากเพิ่มสถิติการส่งออก "ส่งออก TZ = UTC" ในช่วงเวลาที่แอปพลิเคชันเริ่มต้นแก้ไขปัญหาของฉัน

UTC -> เปลี่ยน accorind เป็นเขตเวลาของคุณ


2

หากปัญหานี้อยู่ใน JDeveloper: เปลี่ยนคุณสมบัติของโปรเจ็กต์สำหรับทั้งโมเดลและโปรเจ็กต์มุมมอง -> รัน / ดีบัก -> โปรไฟล์เริ่มต้น -> แก้ไขเพิ่มอ็อพชันการรันต่อไปนี้: -Duser.timezone = Asia / Calcutta

ตรวจสอบให้แน่ใจว่าได้ดึงค่าโซนเวลาข้างต้นจากฐานข้อมูลของคุณดังนี้:

select TZNAME from V$TIMEZONE_NAMES;

นอกจากนี้คุณยังต้องการตรวจสอบการตั้งค่าโซนเวลาใน jdev.conf ของคุณเช่นเดียวกับใน JDeveloper -> เมนูแอปพลิเคชัน -> Default Project Propertes -> Run / Debug -> Default Profile -> Run Options


1

ฉันก็มีปัญหาเดียวกันเช่นกันเมื่อพยายามสร้างการเชื่อมต่อใน JDeveloper เซิร์ฟเวอร์ของเราตั้งอยู่ในเขตเวลาที่ต่างกันและด้วยเหตุนี้จึงทำให้เกิดข้อผิดพลาดด้านล่างเป็น:

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

ฉันอ้างถึงฟอรัมจำนวนมากที่ขอให้รวมเขตเวลาในตัวเลือก Java (Run / Debug / Profile) ของคุณสมบัติโครงการและคุณสมบัติเริ่มต้นของโครงการเป็น-Duser.timezone="+02:00"b แต่มันไม่ได้ผลสำหรับฉัน ในที่สุดวิธีแก้ปัญหาต่อไปนี้ก็ใช้ได้ผลสำหรับฉัน

เพิ่มบรรทัดต่อไปนี้ในไฟล์คอนฟิกูเรชันของ JDeveloper ( jdev.conf )

AddVMOption -Duser.timezone=UTC+02:00

ไฟล์จะอยู่ใน "<oracle installation root> \ 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) บรัสเซลส์โคเปนเฮเกนมาดริดปารีส จากนั้นฉันรีบูตเครื่องคอมพิวเตอร์และทำงานได้ดี ดูเหมือนว่า Oracle ไม่สามารถจดจำเขตเวลาของแอฟริกาตอนกลางทางตะวันตกได้


1

ปัญหานี้เกิดขึ้นเนื่องจากรหัสที่พยายามเชื่อมต่อกับ db มีเขตเวลาที่ไม่อยู่ในฐานข้อมูล นอกจากนี้ยังสามารถแก้ไขได้โดยการตั้งค่าโซนเวลาด้านล่างหรือเขตเวลาที่ถูกต้องที่มีอยู่ใน oracle db เขตเวลาที่ถูกต้องซึ่งสามารถพบได้เลือก * จากเวอร์ชัน v $;

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.