หากคุณเป็นโปรแกรมเมอร์คุณอาจคุ้นเคยกับแนวคิดของการจัดการข้อยกเว้นเป็นส่วนสำคัญของ . เนื่องจากข้อผิดพลาดเป็นสิ่งที่หลีกเลี่ยงไม่ได้และแม้แต่คนที่ฉลาดที่สุดก็สามารถทำผิดพลาดได้ในขณะที่เขียนโค้ดเราจึงต้องทำความคุ้นเคยกับวิธีจัดการกับข้อผิดพลาดนั้น ในบทความนี้เราจะเรียนรู้โดยเฉพาะเกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL
ด้านล่างนี้เป็นหัวข้อที่กล่าวถึงในบทความนี้:
ข้อยกเว้นคืออะไร?
เงื่อนไขหรือเหตุการณ์ผิดปกติใด ๆ ที่ขัดขวางการไหลตามปกติของคำสั่งโปรแกรมของเราในขณะทำงานหรือพูดง่ายๆข้อยกเว้นคือข้อผิดพลาด
ไวยากรณ์ของการจัดการข้อยกเว้นใน PL / SQL
ประกาศเริ่มต้นข้อยกเว้นเมื่อข้อยกเว้น 1 แล้วข้อยกเว้น 1 คำสั่งการจัดการเมื่อยกเว้น 2 แล้วข้อยกเว้น 2 คำสั่งการจัดการเมื่อข้อยกเว้น 3 ข้อยกเว้น 3 คำสั่งการจัดการ ........ เมื่ออื่น ๆ แล้วข้อยกเว้น 3 - การจัดการ - คำสั่ง END
ที่นี่เราสามารถระบุข้อยกเว้นได้มากเท่าที่เราต้องการจัดการ ข้อยกเว้นเริ่มต้นจะได้รับการจัดการโดยใช้ 'เมื่อคนอื่น ๆ แล้ว'
ตัวอย่างการจัดการข้อยกเว้นใน PL / SQL
โปรแกรมด้านล่างนี้จะแสดงชื่อและที่อยู่ของนักเรียนที่ได้รับรหัสประจำตัว เนื่องจากไม่มีนักเรียนที่มีค่า ID 8 ในฐานข้อมูลของเราโปรแกรมจึงเพิ่มข้อยกเว้นรันไทม์ NO_DATA_FOUND ซึ่งถูกบันทึกไว้ในบล็อก EXCEPTION
DECLARE s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN SELECT name, loation INTO s_name, s_loc FROM students WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('Name:' || s_name) DBMS_OUTPUT .PUT_LINE ('สถานที่:' || s_loc) ข้อยกเว้นเมื่อไม่มีข้อมูลแล้วพบ dbms_output.put_line ('ไม่มีนักเรียนคนนั้น!') เมื่อคนอื่น ๆ dbms_output.put_line ('อ๊ะข้อผิดพลาด!') END
เอาต์พุต
ไม่มีนักเรียนคนนี้! ขั้นตอน PL / SQL เสร็จสมบูรณ์
ที่นี่เราสามารถระบุข้อยกเว้นได้มากเท่าที่เราต้องการจัดการ ข้อยกเว้นเริ่มต้นจะได้รับการจัดการโดยใช้ ' เมื่อคนอื่น ๆ แล้ว '
ประเภทของข้อยกเว้นใน PL / SQL
- กำหนดระบบ
- ผู้ใช้ท้าทาย
ถัดไปในบทความนี้เกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL ให้เราพูดคุยเกี่ยวกับทั้งสองประเภทนี้โดยละเอียด
กำหนดระบบ
กำหนดและบำรุงรักษาโดยนัยโดยเซิร์ฟเวอร์ Oracle ข้อยกเว้นเหล่านี้ส่วนใหญ่กำหนดไว้ใน Oracle Standard Package เมื่อใดก็ตามที่เกิดข้อยกเว้นภายในโปรแกรมเซิร์ฟเวอร์ Oracle จะจับคู่และระบุข้อยกเว้นที่เหมาะสมจากชุดข้อยกเว้นที่มีอยู่ในแพ็คเกจมาตรฐาน oracle โดยทั่วไปข้อยกเว้นเหล่านี้กำหนดไว้ล่วงหน้าใน PL / SQL ซึ่งได้รับการเลี้ยงดู เมื่อมีการละเมิดกฎฐานข้อมูลโดยเฉพาะ .
ข้อยกเว้นที่ระบบกำหนด แบ่งออกเป็นสองประเภทเพิ่มเติม:
- ตั้งชื่อข้อยกเว้นของระบบ
- ข้อยกเว้นของระบบที่ไม่มีชื่อ
ตั้งชื่อข้อยกเว้นของระบบ
ข้อยกเว้น PL / SQL ที่มีชื่อคือ ตั้งชื่อในแพ็คเกจมาตรฐานของ PL / SQL ดังนั้นนักพัฒนาจึงไม่จำเป็นต้องกำหนดข้อยกเว้น PL / SQL ในโค้ดของพวกเขา PL / SQL มีข้อยกเว้นที่กำหนดชื่อไว้ล่วงหน้าจำนวนมากซึ่งจะดำเนินการเมื่อกฎฐานข้อมูลใด ๆ ถูกละเมิดโดยโปรแกรม ตารางต่อไปนี้แสดงรายการข้อยกเว้นและลบที่สำคัญที่กำหนดไว้ล่วงหน้า
ข้อยกเว้น | ข้อผิดพลาด Oracle | SQLCODE | คำอธิบาย |
ACCESS_INTO_NULL | 06530 | -6530 | จะเพิ่มขึ้นเมื่อวัตถุว่างถูกกำหนดค่าโดยอัตโนมัติ |
CASE_NOT_FOUND | 06592 | -6592 | จะเพิ่มขึ้นเมื่อไม่มีตัวเลือกใดใน WHEN อนุประโยคของก คำสั่งกรณี ถูกเลือกและไม่มีส่วนคำสั่ง ELSE |
COLLECTION_IS_NULL | 06531 | -6531 | เพิ่มขึ้นเมื่อโปรแกรมพยายามใช้วิธีการรวบรวมอื่นที่ไม่ใช่ EXISTS กับตารางหรือ varray ที่ซ้อนกันโดยไม่ได้เริ่มต้นหรือโปรแกรมพยายามกำหนดค่าให้กับองค์ประกอบของตารางหรือตัวแปรที่ซ้อนกันโดยไม่ได้เริ่มต้น |
DUP_VAL_ON_INDEX | 00001 | -หนึ่ง | จะเพิ่มขึ้นเมื่อพยายามเก็บค่าที่ซ้ำกันในคอลัมน์ที่มีดัชนีเฉพาะ |
INVALID_CURSOR | 01001 | -1001 | จะเพิ่มขึ้นเมื่อมีความพยายามในการดำเนินการเคอร์เซอร์ที่ไม่ได้รับอนุญาตเช่นการปิดเคอร์เซอร์ที่ยังไม่ได้เปิด |
INVALID_NUMBER | 01722 | -1722 | จะเพิ่มขึ้นเมื่อการแปลงสตริงอักขระเป็นตัวเลขล้มเหลวเนื่องจากสตริงไม่ได้แสดงถึงตัวเลขที่ถูกต้อง |
LOGIN_DENIED | 01017 | -1017 | เกิดขึ้นเมื่อโปรแกรมพยายามเข้าสู่ระบบฐานข้อมูลด้วยชื่อผู้ใช้หรือรหัสผ่านที่ไม่ถูกต้อง |
ไม่พบข้อมูล | 01403 | +100 | จะเพิ่มขึ้นเมื่อคำสั่ง SELECT INTO ไม่ส่งกลับแถว |
NOT_LOGGED_ON | 01012 | -1012 | จะเพิ่มขึ้นเมื่อมีการเรียกฐานข้อมูลโดยไม่ได้เชื่อมต่อกับฐานข้อมูล |
PROGRAM_ERROR | 06501 | -6501 | จะเพิ่มขึ้นเมื่อ PL / SQL มีปัญหาภายใน |
ROWTYPE_MISMATCH | 06504 | -6504 | เพิ่มขึ้นเมื่อเคอร์เซอร์ดึงค่าในตัวแปรที่มีชนิดข้อมูลเข้ากันไม่ได้ |
SELF_IS_NULL | 30625 | -30625 | จะเพิ่มขึ้นเมื่อมีการเรียกใช้เมธอดสมาชิก แต่อินสแตนซ์ของชนิดอ็อบเจ็กต์ไม่ได้ถูกเตรียมใช้งาน |
STORAGE_ERROR | 06500 | -6500 | จะเพิ่มขึ้นเมื่อ PL / SQL หน่วยความจำหมดหรือหน่วยความจำเสียหาย |
TOO_MANY_ROWS | 01422 | -1422 | จะเพิ่มขึ้นเมื่อคำสั่ง SELECT INTO ส่งกลับมากกว่าหนึ่งแถว |
VALUE_ERROR | 06502 | -6502 | จะเพิ่มขึ้นเมื่อเกิดข้อผิดพลาดทางคณิตศาสตร์การแปลงการตัดทอนหรือการ จำกัด ขนาด |
ZERO_DIVIDE | 01476 | พ.ศ. 1476 | จะเพิ่มขึ้นเมื่อมีความพยายามที่จะหารตัวเลขด้วยศูนย์ |
ตัวอย่าง
สร้างหรือแทนที่กระบวนการ add_new_student (นักเรียน _id_in IN NUMBER, นักเรียน _name_in ใน VARCHAR2) เป็น BEGIN INSERT INTO student (student _id, student _name) VALUES (student _id_in, student _name_in) EXCEPTION WHEN DUP_VAL_ON_INDEX แล้วนักเรียนที่ทำซ้ำ _000 ) เมื่อคนอื่น ๆ แล้ว Raise_application_error (-20002, 'เกิดข้อผิดพลาด') END
ในบทความนี้เกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL ให้เราเข้าใจว่าข้อยกเว้นของระบบที่ไม่มีชื่อคืออะไร
ข้อยกเว้นของระบบที่ไม่มีชื่อ
ข้อยกเว้นของระบบที่ Oracle ไม่มีชื่อเรียกว่าข้อยกเว้นระบบที่ไม่มีชื่อ ข้อยกเว้นเหล่านี้ไม่ได้เกิดขึ้นบ่อยนักและเขียนด้วยรหัสและข้อความที่เกี่ยวข้อง
โดยทั่วไปมีสองวิธีในการจัดการข้อยกเว้นของระบบที่ไม่มีชื่อ:
การเรียกใช้เมธอดระยะไกลใน java
1. การใช้ตัวจัดการข้อยกเว้นเมื่อผู้อื่น
2. การเชื่อมโยงรหัสข้อยกเว้นกับชื่อและใช้เป็นข้อยกเว้นที่ระบุชื่อ
แท็ก html สำหรับตัวแบ่งบรรทัด
ตามขั้นตอนบางประการสำหรับข้อยกเว้นของระบบที่ไม่มีชื่อ ได้แก่ :
- ยกพวกเขาโดยปริยาย
- ในกรณีที่ไม่ได้รับการจัดการใน 'เมื่อใดที่ผู้อื่น' จะต้องได้รับการจัดการอย่างชัดเจน
- ในการจัดการข้อยกเว้นอย่างชัดเจนสามารถประกาศได้โดยใช้ Pragma EXCEPTION_INIT และจัดการโดยอ้างอิงชื่อข้อยกเว้นที่ผู้ใช้กำหนดเองในส่วนข้อยกเว้น
ตัวอย่างการจัดการข้อยกเว้นที่ไม่มีชื่อโดยใช้ Pragma EXCEPTION_INIT มีให้ในบทความต่อไป ต่อไปในบทความนี้เกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL ให้เราเข้าใจ excetpions ที่ผู้ใช้กำหนด
ผู้ใช้กำหนด
เช่นเดียวกับภาษาโปรแกรมอื่น ๆ Oracle ยังอนุญาตให้คุณประกาศใช้ข้อยกเว้นของคุณเอง ซึ่งแตกต่างจากข้อยกเว้นที่ระบบกำหนดข้อยกเว้นเหล่านี้จะถูกยกขึ้นอย่างชัดเจนในบล็อก PL / SQL
ขั้นตอนในการประกาศข้อยกเว้นที่ผู้ใช้กำหนดในฐานข้อมูล Oracle
เราสามารถกำหนดข้อยกเว้นที่ผู้ใช้กำหนดในฐานข้อมูล Oracle ได้ 3 วิธีดังต่อไปนี้:
- การใช้ตัวแปรประเภท EXCEPTION
ที่นี่เราสามารถประกาศข้อยกเว้นที่ผู้ใช้กำหนดโดยการประกาศตัวแปร EXCEPTION ประเภทข้อมูล ในโค้ดของเราและเพิ่มขึ้นอย่างชัดเจนในโปรแกรมของเราโดยใช้คำสั่ง RAISE
- ใช้ฟังก์ชัน PRAGMA EXCEPTION_INIT
เราสามารถกำหนดหมายเลขข้อผิดพลาดที่ไม่ได้กำหนดไว้ล่วงหน้าด้วยตัวแปรประเภทข้อมูล EXCEPTION
- ใช้เมธอด RAISE_APPLICATION_ERROR
ด้วยวิธีนี้เราสามารถประกาศข้อยกเว้นที่ผู้ใช้กำหนดด้วยหมายเลขและข้อความแสดงข้อผิดพลาดที่กำหนดเอง
ถึงตอนนี้คุณอาจมีแนวคิดคร่าวๆเกี่ยวกับวิธีที่เราสามารถเพิ่มข้อยกเว้นที่ผู้ใช้กำหนดใน PL / SQL เราจะเรียนรู้เกี่ยวกับแต่ละวิธีที่กล่าวถึงข้างต้นพร้อมตัวอย่างเพิ่มเติมในบทความนี้เกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL
ถัดไปในบทความนี้ให้เราดำเนินการสาธิตการจัดการข้อยกเว้นที่ผู้ใช้กำหนด
การสาธิตข้อยกเว้นที่ผู้ใช้กำหนด
ในบทความนี้เกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL ให้เราเข้าใจวิธีใช้ตัวแปรประเภท EXCEPTION
การใช้ตัวแปรประเภท EXCEPTION
กระบวนการประกาศข้อยกเว้นที่ผู้ใช้กำหนดแบ่งออกเป็นสามส่วนและ 3 ส่วนนี้ ได้แก่ :
- ประกาศประเภทข้อมูลข้อยกเว้นตัวแปร
- เพิ่มข้อยกเว้น
- จัดการกับข้อยกเว้น
มาเขียนโค้ดเพื่อสาธิตขั้นตอนข้างต้นโดยละเอียด
DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION
ในบล็อกการประกาศข้างต้นเรามีตัวแปรสี่ตัวซึ่งสามตัวแรกเป็นตัวแปรประเภทข้อมูลตัวเลขปกติและตัวแปรที่สี่ซึ่งเป็น ex_DivZero เป็นตัวแปรประเภทข้อมูลข้อยกเว้นพิเศษ ข้อที่สี่คือข้อยกเว้นที่ผู้ใช้กำหนดเอง
DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION
ส่วนการดำเนินการข้างต้นของบล็อกที่ไม่ระบุตัวตนนี้จะเริ่มทำงานก็ต่อเมื่อตัวหารเป็น 0 เท่านั้นหากตัวหารเป็นศูนย์ตามที่เป็นอยู่ในกรณีของเราข้อผิดพลาดจะเพิ่มขึ้นและการควบคุมโปรแกรมจะข้ามขั้นตอนถัดไปทั้งหมดและ จะมองหาตัวจัดการข้อยกเว้นที่ตรงกัน ในกรณีที่พบสิ่งอื่นใดโปรแกรมจะดำเนินการตามนั้นมิฉะนั้นอาจยุติโปรแกรมหรือแจ้งให้เราทราบข้อผิดพลาดที่ระบบไม่สามารถจัดการได้
ข้อยกเว้นเมื่อ ex_DivZero แล้ว DBMS_OUTPUT.PUT_LINE ('ERROR ตัวหารต้องไม่เป็นศูนย์')
นี่คือตัวจัดการข้อยกเว้น ทันทีที่ผู้ใช้ป้อนตัวหารเป็น 0 สตริงข้อความด้านบนจะถูกถาม
รหัสสุดท้าย:
DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION BEGIN ถ้า var_divisor = 0 จากนั้น RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('ผลลัพธ์ =' BAR) = 0 จากนั้น RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Result =' || var_result) END
ในบทความนี้เกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL ขอให้เราเข้าใจวิธีใช้เมธอด PRAGMA_EXCEPTION_INIT
ใช้ฟังก์ชัน PRAGMA EXCEPTION_INIT
ใน ฟังก์ชัน PRAGMA EXCEPTION_INIT ชื่อข้อยกเว้นเชื่อมโยงกับหมายเลขข้อผิดพลาดของ Oracle สามารถใช้ชื่อนี้ในการออกแบบตัวจัดการข้อยกเว้นสำหรับข้อผิดพลาดสำหรับโปรเจ็กต์ขนาดใหญ่ที่มีข้อผิดพลาดที่ผู้ใช้กำหนดจำนวนมาก PRAGMA EXCEPTION_INIT เป็นวิธีที่มีประโยชน์และเหมาะสมที่สุด
คำถามสัมภาษณ์นักวิทยาศาสตร์ข้อมูลของ Google
ไวยากรณ์:
PRAGMA EXCEPTION_INIT (ข้อยกเว้นชื่อ -Oracle_error_number)
ตัวอย่าง
DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - การดำเนินการบางอย่างที่ทำให้เกิดข้อผิดพลาด ORA-00060 ข้อยกเว้นเมื่อตรวจพบการหยุดชะงักแล้ว NULL - จัดการข้อผิดพลาด END
PRAGMA EXCEPTION_INIT บอกให้คอมไพเลอร์เชื่อมโยงชื่อข้อยกเว้นกับหมายเลขข้อผิดพลาด Oracle ดังที่กล่าวไว้ก่อนหน้านี้ ช่วยให้คุณอ้างถึงข้อยกเว้นภายในตามชื่อและเขียนตัวจัดการเฉพาะสำหรับมัน เมื่อคุณเห็นกองข้อผิดพลาดหรือลำดับของข้อความแสดงข้อผิดพลาดรายการที่อยู่ด้านบนคือรายการที่สามารถติดกับดักและจัดการได้
ในบทความนี้เกี่ยวกับการจัดการข้อยกเว้นใน PL / SQL ให้เราเข้าใจวิธีใช้เมธอด RAISE_APPLICATION_ERROR
ใช้เมธอด RAISE_APPLICATION_ERROR
เป็นขั้นตอนที่มาพร้อมกับซอฟต์แวร์ oracle การใช้โพรซีเดอร์นี้เราสามารถเชื่อมโยงหมายเลขข้อผิดพลาดกับข้อความแสดงข้อผิดพลาดที่กำหนดเองได้ การรวมทั้งหมายเลขข้อผิดพลาดและข้อความแสดงข้อผิดพลาดที่กำหนดเองสามารถประกอบสตริงข้อผิดพลาดซึ่งมีลักษณะคล้ายกับสตริงข้อผิดพลาดเริ่มต้นซึ่งแสดงโดย oracle เมื่อพบข้อผิดพลาด ขั้นตอน RAISE_APPLICATION_ERROR พบได้ในแพ็คเกจ DBMS_STANDARD
ไวยากรณ์
Raise_application_error (error_number, ข้อความ [, TRUE])
ตัวอย่าง
/ * มีการสร้างทริกเกอร์ trg_emp_detail_chk * / สร้างหรือเปลี่ยนทริกเกอร์ trg_emp_detail_chk / * ระยะเวลาทริกเกอร์จะถูกประกาศเป็นก่อนอัปเดตในตารางพนักงาน * / ก่อนอัปเดตบนพนักงานปฏิเสธการอนุญาตการยกเว้นเริ่มต้น / * การเริ่มต้นของเงื่อนไข IF ตรวจสอบว่า วันของเวลาของระบบคือวันเสาร์หรือวันอาทิตย์หรือไม่ * / IF trim (TO_CHAR (sysdate, 'Day')) IN ('Saturday', 'Sunday') THEN Raise_application_error (-20000, 'คุณไม่ได้รับอนุญาตให้ทำ การแก้ไขใด ๆ ในวันหยุดสุดสัปดาห์ !! ') / * ขั้นตอน Raise_application_error ถูกเรียกด้วยค่าพารามิเตอร์แรกเป็น -20000 และพารามิเตอร์ที่สองพร้อมข้อความเริ่มต้นที่ระบุว่าผู้ใช้ไม่ได้รับอนุญาตให้ทำการแก้ไขใด ๆ ในช่วงสุดสัปดาห์ * / END IF END
ด้วยเหตุนี้เราจึงมาถึงตอนท้ายของบทความนี้เกี่ยวกับ“ การจัดการข้อยกเว้นใน PL / SQL” ฉันหวังว่าหัวข้อนี้จะเข้าใจดีและช่วยคุณได้ พยายามเขียนรหัสของคุณเองและรวมวิธีการที่อธิบายไว้ในบทความนี้
หากคุณต้องการรับการฝึกอบรมจากผู้เชี่ยวชาญเกี่ยวกับเทคโนโลยีนี้คุณสามารถเลือกรับการฝึกอบรมที่มีโครงสร้างจาก edureka ได้! ตรวจสอบสิ่งนี้ โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ซึ่งมีเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก หลักสูตรนี้ฝึกคุณเกี่ยวกับแนวคิดหลักและเครื่องมือและเทคนิคขั้นสูงในการจัดการข้อมูลและจัดการฐานข้อมูล MySQL รวมถึงการเรียนรู้เชิงปฏิบัติเกี่ยวกับแนวคิดเช่น MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, การออกแบบฐานข้อมูล, บรรทัดคำสั่ง MySQL, MySQL Functions เป็นต้นเมื่อสิ้นสุดการฝึกอบรมคุณจะสามารถสร้างและจัดการฐานข้อมูล MySQL ของคุณเองและจัดการ ข้อมูล.
มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบทความ 'การจัดการข้อยกเว้นใน PL / SQL' และเราจะติดต่อกลับโดยเร็วที่สุด