วิธีการแก้ไข Ora-06512 ข้อผิดพลาด

ถามคำถามผู้อ่านอีกครั้ง คราวนี้คำถาม Oracle และ 'จะทำอย่างไรถ้าคุณเห็นข้อผิดพลาด ora-06512' ฉันต้องยอมรับว่า Oracle ไม่ใช่ของฉัน แต่ฉันรู้ DBA ที่เป็นมิตรที่อาศัยอยู่ภายใน Oracle และยินดีที่จะช่วยฉันตอบคำถามนี้เพื่อแลกกับถ้วยกาแฟขนาดใหญ่

Oracle เป็นระบบการจัดการฐานข้อมูลที่ใช้งานมานานกว่า 40 ปีในรูปแบบต่างๆ เดิมใช้สิ่งที่เรียกว่า SCOTT schema ซึ่งตั้งชื่อตามพนักงานเดิมของ Oracle คุณเข้าสู่ระบบ Oracle เป็นครั้งแรกด้วยชื่อผู้ใช้ 'scott' และรหัสผ่าน 'tiger' ซึ่งมีชื่อว่า cat ของ Scott ขณะนี้มีหลาย schema ที่ใช้ขึ้นอยู่กับสิ่งที่คุณใช้ Oracle for

ถ้าคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Oracle หน้านี้มีประโยชน์มาก

แก้ไขข้อผิดพลาด Ora-06512

เห็นได้ชัดว่าข้อผิดพลาด ora-06512 เป็นข้อผิดพลาดข้อยกเว้นทั่วไปที่จะบอกคุณว่ามีบางอย่างผิดพลาดไม่ใช่สิ่งที่ผิดพลาด

ตัวอย่างเช่นไวยากรณ์ข้อผิดพลาดอาจอ่านได้:

ORA-01422: การดึงข้อมูลที่ถูกต้องจะส่งกลับมากกว่าจำนวนแถวที่ร้องขอ

ORA-06512: ที่ "DATABASE_NAME" บรรทัดที่ 66

ORA-06512: ที่บรรทัดที่ 1

บรรทัดแรกจะบอกให้คุณทราบว่าเกิดข้อผิดพลาดประเภทไหนในกรณีนี้เคียวรีจะส่งคืนข้อมูลมากกว่าแบบสอบถามคาดหวังดังนั้นจึงไม่ทราบวิธีจัดการกับข้อผิดพลาด รหัส 'ORA-01422' คือรหัสข้อผิดพลาดที่เกิดขึ้นจริงที่คุณต้องดู ORA-06512 เป็นเพียงรหัสข้อผิดพลาดทั่วไปเท่านั้น

บรรทัดที่สองจะบอกคุณว่าข้อผิดพลาดเกิดขึ้นที่ไหน DATABASE_NAME เป็นฐานข้อมูลที่คุณกำลังทำงานอยู่ในขณะนั้น บรรทัดที่ 66 เป็นบรรทัดที่เกิดข้อผิดพลาดและเป็นบรรทัดที่คุณต้องตรวจสอบเพื่อแก้ไขข้อผิดพลาด

บรรทัดที่สามในไวยากรณ์ข้อผิดพลาดจะแจ้งให้คุณทราบว่าการโทรมาจากที่ใด เลือกบรรทัดที่หนึ่งและคุณจะเห็นการโทรไปที่ DATABASE_NAME

ในการแก้ไขข้อผิดพลาดนี้คุณต้องแก้ไขปัญหาที่เกิดจาก ORA-01422 ซึ่งเป็น 'การดึงข้อมูลที่ถูกต้องจะส่งกลับจำนวนแถวที่ต้องการ' หรือคุณต้องเพิ่มตัวจัดการข้อยกเว้นเพื่อบอกให้ Oracle ละเว้น เนื่องจากการแก้ไขปัญหาหลักมักเป็นทางเลือกที่ดีกว่านี้เป็นวิธีที่จะไป

มีสองสิ่งที่คุณสามารถทำได้ หากคุณคาดหวังว่าข้อความค้นหาจะแสดงผลมากกว่าหนึ่งแถวคุณสามารถแก้ไขได้เพื่อไม่ให้แปลกใจ หากคุณคาดหวังว่าข้อความค้นหาจะส่งคืนแถวเดียวคุณสามารถแก้ไขได้ด้วยเช่นกัน

คาดหวังมากกว่าหนึ่งแถว:

สำหรับ X ใน (เลือก * จาก t โดยที่ ... )

ห่วง

- ดำเนินการบันทึก X ที่นี่

end loop;

นี้ควรกำจัดข้อผิดพลาดในการสืบค้นฐานข้อมูลที่มากกว่าหนึ่งแถวจะถูกส่งกลับ

หากคุณคาดหวังเพียงแถวเดียวที่จะส่งคืนคุณสามารถลอง:

เริ่ม

เลือก * เป็น ...

จากที่ไหน ... .

กระบวนการ….

ข้อยกเว้น

เมื่อ NO_DATA_FOUND แล้ว

รหัสการจัดการข้อผิดพลาดเมื่อไม่พบระเบียน

เมื่อ TOO_MANY_ROWS แล้ว

รหัสการจัดการข้อผิดพลาดเมื่อมีการบันทึกมากเกินไป

จบ;

วิธีที่สองนี้ควรแสดงเฉพาะแถวเดียวโดยไม่ต้องขว้างปา 'ORA-01422: ผลการค้นหาที่ถูกต้องส่งผลให้เกิดข้อผิดพลาดของจำนวนแถวที่ต้องการมากเกินไปและเป็นข้อผิดพลาด ORA-06512 เดิม

คุณสามารถปรับแต่งแบบสอบถามเพื่อให้ได้ผลตอบแทนจากแถวแรกของคำตอบหลายแถวเท่านั้น นี้อาจทำงานถ้าคุณไม่ได้มีการควบคุมที่สมบูรณ์เกี่ยวกับฐานข้อมูลหรือไม่ต้องการยุ่งกับสิ่งที่มากเกินไป แต่ก็ยังต้องการคำตอบ

ประกาศ

c1 เคอร์เซอร์สำหรับเลือก * จาก t โดยที่ ...

เริ่ม

เปิด c1;

เรียก c1 เข้า ..

ถ้า (c1% notfound) แล้ว

การจัดการข้อผิดพลาดสำหรับไม่พบระเบียน

สิ้นสุดหาก;

ปิด c1;

จบ;

ฉันไม่ได้เห็นขั้นตอนสุดท้ายนี้ในการดำเนินการ แต่ฉันมั่นใจได้ว่าในกรณีที่อาจมีการส่งคืนหลายรายการ แต่คุณต้องการเพียงแค่การส่งคืนแถวเดียวและไม่มีข้อผิดพลาดก็จะทำงานได้

ฉันรู้เพียงเล็กน้อย SQL พอที่จะเขียนคำสั่งพื้นฐาน แต่ฉันต้องยอมรับ Oracle โยนฉัน แม้ว่าจะเป็น PL / SQL คล้าย ๆ กัน แต่ก็พบว่าตัวเองหายไป PL / SQL เป็นส่วนขยายของ Oracle สำหรับ SQL ซึ่งดูเหมือนจะช่วยให้สามารถทำสิ่งที่ฉลาดกว่า vanilla SQL ได้ ฉันพบว่าคำถามที่พบบ่อยเกี่ยวกับ PL / SQL นี้มีประโยชน์เมื่อพยายามเรียนรู้เกี่ยวกับ Oracle อาจช่วยคุณได้เช่นกัน

ตามที่ได้กล่าวมาก่อนหน้านี้ผมไม่มี DBA และรู้ข้อมูลเกี่ยวกับฐานข้อมูลเฉพาะอย่างน้อยมาก ฉันได้ทำอย่างดีที่สุดในการถ่ายทอดสิ่งที่เพื่อนของฉันแสดงให้ฉันเห็นในช่วงเวลาสั้น ๆ ที่โต๊ะทำงานและในอีเมลที่ตามมา ถ้าฉันได้รับสิ่งที่ผิดพลาดอย่างมากให้แจ้งให้เราทราบในส่วนความคิดเห็น

ดูเพิ่มเติมที่