ฉันกำลังเข้าถึง Oracle Database จากแอปพลิเคชัน java เมื่อฉันเรียกใช้แอปพลิเคชันของฉันฉันได้รับข้อผิดพลาดต่อไปนี้:
java.sql.SQLException: ORA-00604: ข้อผิดพลาดเกิดขึ้นที่ SQL แบบเรียกซ้ำระดับ 1 ORA-01882: ไม่พบเขตเวลา
ฉันกำลังเข้าถึง Oracle Database จากแอปพลิเคชัน java เมื่อฉันเรียกใช้แอปพลิเคชันของฉันฉันได้รับข้อผิดพลาดต่อไปนี้:
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 ช่วยแก้ปัญหาได้
ฉันยังจัดการทำให้ 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 อนุญาตให้ใช้ในคุณสมบัติการเชื่อมต่อ "ขั้นสูง" ฉันยืนยันว่าใช้งานได้เมื่อเชื่อมต่อกับฐานข้อมูลที่ไม่มีปัญหาและใช้ ลิงค์ฐานข้อมูลไปยังฐานข้อมูลที่มี)
ในการติดตั้ง SQL-Developer แบบธรรมดาภายใต้ 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 แบบเรียกซ้ำ 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;
}
ตอนนี้ใช้งานได้แล้ว !!
อัพเดตไฟล์oracle / jdbc / defaultConnectionProperties.propertiesในเวอร์ชันใด ๆ ของไลบรารี (เช่นภายใน jar ของคุณ) ที่คุณใช้เพื่อให้มีบรรทัดด้านล่าง:
oracle.jdbc.timezoneAsRegion=false
สิ่งที่เกิดขึ้นคือไคลเอนต์ 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 ฉันเดาว่านี่เป็นเพราะการทำให้เป็นมาตรฐาน แต่ฉันยังไม่ทราบว่าอะไรกันแน่
ใน eclipse go run -> รันการกำหนดค่า
จากนั้นไปที่แท็บJREในแผงด้านขวา
ในส่วนVM Argumentsให้วางสิ่งนี้
-Duser.timezone=GMT
จากนั้นใช้ -> เรียกใช้
ฉันมีปัญหานี้เมื่อเรียกใช้การทดสอบอัตโนมัติจากเซิร์ฟเวอร์การรวมแบบต่อเนื่อง ฉันพยายามเพิ่มอาร์กิวเมนต์ VM " -Duser.timezone=GMT
" ในพารามิเตอร์การสร้าง แต่ไม่สามารถแก้ปัญหาได้ อย่างไรก็ตามการเพิ่มตัวแปรสภาพแวดล้อม " TZ=GMT
" ช่วยแก้ปัญหาให้ฉันได้
ข้อผิดพลาด:
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"
ใน Netbeans
คลิกตกลงจากนั้นเรียกใช้โปรแกรมของคุณอีกครั้ง
หมายเหตุ: คุณสามารถตั้งค่าเป็น timestones อื่น ๆ ได้เช่นกันนอกเหนือจาก UTC & GMT
ฉันพบปัญหานี้กับ Tomcat การตั้งค่าต่อไปนี้ในการ$CATALINA_BASE/bin/setenv.sh
แก้ไขปัญหา:
JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false
ฉันแน่ใจว่าการใช้หนึ่งในคำแนะนำพารามิเตอร์ Java จากคำตอบอื่น ๆ จะได้ผลในลักษณะเดียวกัน
ฉันก็ประสบปัญหาเดียวกันเช่นกัน
Linux, hibernate project, ojdbc6 driver ขณะสืบค้นฐานข้อมูล oracle 11g
ไม่ได้ตั้งค่าพารามิเตอร์ TZ ในเครื่อง linux ซึ่งโดยทั่วไปจะบอก oracle เกี่ยวกับเขตเวลา ดังนั้นหลังจากเพิ่มสถิติการส่งออก "ส่งออก TZ = UTC" ในช่วงเวลาที่แอปพลิเคชันเริ่มต้นแก้ไขปัญหาของฉัน
UTC -> เปลี่ยน accorind เป็นเขตเวลาของคุณ
หากปัญหานี้อยู่ใน JDeveloper: เปลี่ยนคุณสมบัติของโปรเจ็กต์สำหรับทั้งโมเดลและโปรเจ็กต์มุมมอง -> รัน / ดีบัก -> โปรไฟล์เริ่มต้น -> แก้ไขเพิ่มอ็อพชันการรันต่อไปนี้: -Duser.timezone = Asia / Calcutta
ตรวจสอบให้แน่ใจว่าได้ดึงค่าโซนเวลาข้างต้นจากฐานข้อมูลของคุณดังนี้:
select TZNAME from V$TIMEZONE_NAMES;
นอกจากนี้คุณยังต้องการตรวจสอบการตั้งค่าโซนเวลาใน jdev.conf ของคุณเช่นเดียวกับใน JDeveloper -> เมนูแอปพลิเคชัน -> Default Project Propertes -> Run / Debug -> Default Profile -> Run Options
ฉันก็มีปัญหาเดียวกันเช่นกันเมื่อพยายามสร้างการเชื่อมต่อใน 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"
ในกรณีของฉันฉันสามารถทำให้แบบสอบถามทำงานได้โดยการเปลี่ยน "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
ตั้งค่าเขตเวลาใน/etc/sysconfig/clock
เช่นตั้งค่าเป็น ZONE = "America / Los_Angeles"
sudo ln -sf / usr / share / zoneinfo / America / Phoenix / etc / localtime
ในการหาค่าเขตเวลาให้ลอง
ls /usr/share/zoneinfo
และมองหาไฟล์ที่แสดงถึงเขตเวลาของคุณ
เมื่อคุณตั้งค่าการรีบูตเครื่องแล้วลองอีกครั้ง
ฉันมีปัญหาเดียวกันเมื่อพยายามเชื่อมต่อบน OBIEE กับ Oracle db ฉันเปลี่ยนเขตเวลา Windows จาก (GMT + 01: 00) แอฟริกากลางตะวันตกเป็น (GMT + 01: 00) บรัสเซลส์โคเปนเฮเกนมาดริดปารีส จากนั้นฉันรีบูตเครื่องคอมพิวเตอร์และทำงานได้ดี ดูเหมือนว่า Oracle ไม่สามารถจดจำเขตเวลาของแอฟริกาตอนกลางทางตะวันตกได้
ปัญหานี้เกิดขึ้นเนื่องจากรหัสที่พยายามเชื่อมต่อกับ db มีเขตเวลาที่ไม่อยู่ในฐานข้อมูล นอกจากนี้ยังสามารถแก้ไขได้โดยการตั้งค่าโซนเวลาด้านล่างหรือเขตเวลาที่ถูกต้องที่มีอยู่ใน oracle db เขตเวลาที่ถูกต้องซึ่งสามารถพบได้เลือก * จากเวอร์ชัน v $;
System.setProperty ("user.timezone", "America / New_York"); TimeZone.setDefault (null);
ประสบปัญหาเดียวกันโดยใช้ Eclipse และ Oracle Database ที่อยู่ห่างไกลการเปลี่ยนโซนเวลาระบบของฉันเพื่อให้ตรงกับเขตเวลาของเซิร์ฟเวอร์ฐานข้อมูลช่วยแก้ปัญหาได้ สตาร์ทเครื่องใหม่หลังจากเปลี่ยนโซนเวลาของระบบ
ฉันหวังว่านี่จะช่วยใครสักคนได้
java.sql.SQLException: ORA-00604: ข้อผิดพลาดเกิดขึ้นที่ SQL แบบเรียกซ้ำระดับ 1 ORA-01882: ไม่พบเขตเวลา
สำหรับข้อผิดพลาดประเภทนี้เพียงแค่เปลี่ยนเวลาของระบบเป็นรูปแบบ GMT มาตรฐานของประเทศของคุณ
เช่นเขตเวลาของอินเดียคือเจนไนโกลกาตา