เรียนรู้วิธีจัดการข้อยกเว้นใน PL / SQL



บทความนี้เป็นคำแนะนำที่ครอบคลุมเกี่ยวกับวิธีดำเนินการจัดการข้อยกเว้นใน PL / SQL โดยพูดถึงข้อยกเว้นประเภทต่างๆที่มีให้ใน PL / SQL

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

การจัดการข้อยกเว้น SQL ใน PL / SQL-Edurekaด้านล่างนี้เป็นหัวข้อที่กล่าวถึงในบทความนี้:





ข้อยกเว้นคืออะไร?

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

ไวยากรณ์ของการจัดการข้อยกเว้นใน 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_NULL06530-6530จะเพิ่มขึ้นเมื่อวัตถุว่างถูกกำหนดค่าโดยอัตโนมัติ
CASE_NOT_FOUND06592-6592จะเพิ่มขึ้นเมื่อไม่มีตัวเลือกใดใน WHEN อนุประโยคของก คำสั่งกรณี ถูกเลือกและไม่มีส่วนคำสั่ง ELSE
COLLECTION_IS_NULL06531-6531เพิ่มขึ้นเมื่อโปรแกรมพยายามใช้วิธีการรวบรวมอื่นที่ไม่ใช่ EXISTS กับตารางหรือ varray ที่ซ้อนกันโดยไม่ได้เริ่มต้นหรือโปรแกรมพยายามกำหนดค่าให้กับองค์ประกอบของตารางหรือตัวแปรที่ซ้อนกันโดยไม่ได้เริ่มต้น
DUP_VAL_ON_INDEX00001-หนึ่งจะเพิ่มขึ้นเมื่อพยายามเก็บค่าที่ซ้ำกันในคอลัมน์ที่มีดัชนีเฉพาะ
INVALID_CURSOR01001-1001จะเพิ่มขึ้นเมื่อมีความพยายามในการดำเนินการเคอร์เซอร์ที่ไม่ได้รับอนุญาตเช่นการปิดเคอร์เซอร์ที่ยังไม่ได้เปิด
INVALID_NUMBER01722-1722จะเพิ่มขึ้นเมื่อการแปลงสตริงอักขระเป็นตัวเลขล้มเหลวเนื่องจากสตริงไม่ได้แสดงถึงตัวเลขที่ถูกต้อง
LOGIN_DENIED01017-1017เกิดขึ้นเมื่อโปรแกรมพยายามเข้าสู่ระบบฐานข้อมูลด้วยชื่อผู้ใช้หรือรหัสผ่านที่ไม่ถูกต้อง
ไม่พบข้อมูล01403+100จะเพิ่มขึ้นเมื่อคำสั่ง SELECT INTO ไม่ส่งกลับแถว
NOT_LOGGED_ON01012-1012จะเพิ่มขึ้นเมื่อมีการเรียกฐานข้อมูลโดยไม่ได้เชื่อมต่อกับฐานข้อมูล
PROGRAM_ERROR06501-6501จะเพิ่มขึ้นเมื่อ PL / SQL มีปัญหาภายใน
ROWTYPE_MISMATCH06504-6504เพิ่มขึ้นเมื่อเคอร์เซอร์ดึงค่าในตัวแปรที่มีชนิดข้อมูลเข้ากันไม่ได้
SELF_IS_NULL30625-30625จะเพิ่มขึ้นเมื่อมีการเรียกใช้เมธอดสมาชิก แต่อินสแตนซ์ของชนิดอ็อบเจ็กต์ไม่ได้ถูกเตรียมใช้งาน
STORAGE_ERROR06500-6500จะเพิ่มขึ้นเมื่อ PL / SQL หน่วยความจำหมดหรือหน่วยความจำเสียหาย
TOO_MANY_ROWS01422-1422จะเพิ่มขึ้นเมื่อคำสั่ง SELECT INTO ส่งกลับมากกว่าหนึ่งแถว
VALUE_ERROR06502-6502จะเพิ่มขึ้นเมื่อเกิดข้อผิดพลาดทางคณิตศาสตร์การแปลงการตัดทอนหรือการ จำกัด ขนาด
ZERO_DIVIDE01476พ.ศ. 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' และเราจะติดต่อกลับโดยเร็วที่สุด