Χειρισμός εξαίρεσης Oracle PL / SQL: Παραδείγματα για την αύξηση της εξαίρεσης που καθορίζεται από τον χρήστη

Πίνακας περιεχομένων:

Anonim

Τι είναι το Exception Handling στο PL / SQL;

Μια εξαίρεση προκύπτει όταν ο κινητήρας PL / SQL συναντά μια εντολή που δεν μπορεί να εκτελέσει λόγω σφάλματος που παρουσιάζεται κατά το χρόνο εκτέλεσης. Αυτά τα σφάλματα δεν θα καταγραφούν κατά τη στιγμή της σύνταξης και, ως εκ τούτου, αυτά χρειάζονται για χειρισμό μόνο κατά το χρόνο εκτέλεσης.

Για παράδειγμα, εάν ο κινητήρας PL / SQL λάβει μια οδηγία για να διαιρέσει οποιονδήποτε αριθμό με το «0», τότε ο κινητήρας PL / SQL θα τον ρίξει ως εξαίρεση. Η εξαίρεση προκύπτει μόνο κατά το χρόνο εκτέλεσης από τον κινητήρα PL / SQL.

Οι εξαιρέσεις θα εμποδίσουν την περαιτέρω εκτέλεση του προγράμματος, οπότε για να αποφευχθεί μια τέτοια κατάσταση, πρέπει να συλλαμβάνονται και να αντιμετωπίζονται ξεχωριστά. Αυτή η διαδικασία ονομάζεται Εξαίρεση-Χειρισμός, στην οποία ο προγραμματιστής χειρίζεται την εξαίρεση που μπορεί να συμβεί κατά το χρόνο εκτέλεσης.

Σε αυτό το σεμινάριο, θα μάθετε τα ακόλουθα θέματα-

  • Σύνταξη εξαίρεσης-χειρισμού
  • Τύποι εξαίρεσης
  • Προκαθορισμένες εξαιρέσεις
  • Εξαίρεση που καθορίζεται από το χρήστη
  • Εξαίρεση PL / SQL
  • Σημαντικά σημεία που πρέπει να λάβετε υπόψη στην Εξαίρεση

Σύνταξη εξαίρεσης-χειρισμού

Οι εξαιρέσεις αντιμετωπίζονται στο μπλοκ, στο επίπεδο, δηλαδή, μία φορά εάν παρουσιαστεί οποιαδήποτε εξαίρεση σε οποιοδήποτε μπλοκ, τότε το στοιχείο ελέγχου θα βγει από μέρος εκτέλεσης αυτού του μπλοκ. Η εξαίρεση θα αντιμετωπιστεί στη συνέχεια στο τμήμα χειρισμού της εξαίρεσης αυτού του μπλοκ. Αφού χειριστείτε την εξαίρεση, δεν είναι δυνατή η αποστολή του ελέγχου πίσω στην ενότητα εκτέλεσης αυτού του μπλοκ.

Η παρακάτω σύνταξη εξηγεί πώς να πιάσετε και να χειριστείτε την εξαίρεση.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Επεξήγηση σύνταξης:

  • Στην παραπάνω σύνταξη, το μπλοκ χειρισμού εξαιρέσεων περιέχει σειρά συνθηκών WHEN για τον χειρισμό της εξαίρεσης.
  • Κάθε συνθήκη WHEN ακολουθείται από το όνομα εξαίρεσης που αναμένεται να αυξηθεί κατά το χρόνο εκτέλεσης.
  • Όταν δημιουργηθεί οποιαδήποτε εξαίρεση κατά το χρόνο εκτέλεσης, τότε ο κινητήρας PL / SQL θα κοιτάξει στο τμήμα χειρισμού εξαίρεσης για τη συγκεκριμένη εξαίρεση. Θα ξεκινήσει από την πρώτη ρήτρα «WHEN» και, στη συνέχεια, θα πραγματοποιήσει αναζήτηση.
  • Εάν βρήκε τον χειρισμό εξαίρεσης για την εξαίρεση που έχει δημιουργηθεί, τότε θα εκτελέσει το συγκεκριμένο τμήμα κώδικα χειρισμού.
  • Εάν δεν υπάρχει καμία από τις ρήτρες «WHEN» για την εξαίρεση που έχει τεθεί, τότε ο κινητήρας PL / SQL θα εκτελέσει το τμήμα «WHEN OTHERS» (εάν υπάρχει). Αυτό είναι κοινό για όλες τις εξαιρέσεις.
  • Μετά την εκτέλεση της εξαίρεσης, ο έλεγχος μέρους θα βγει από το τρέχον μπλοκ.
  • Μόνο ένα τμήμα εξαίρεσης μπορεί να εκτελεστεί για ένα μπλοκ κατά το χρόνο εκτέλεσης. Μετά την εκτέλεση του, ο ελεγκτής θα παραλείψει το υπόλοιπο τμήμα χειρισμού εξαιρέσεων και θα βγει από το τρέχον μπλοκ.

Σημείωση: ΟΤΑΝ ΑΛΛΑ θα πρέπει πάντα να βρίσκονται στην τελευταία θέση της ακολουθίας. Το τμήμα χειρισμού εξαίρεσης που υπάρχει μετά το WHEN OTHERS δεν θα εκτελεστεί ποτέ καθώς το στοιχείο ελέγχου θα βγει από το μπλοκ μετά την εκτέλεση του WHEN OTHERS.

Τύποι εξαίρεσης

Υπάρχουν δύο τύποι εξαιρέσεων στο Pl / SQL.

  1. Προκαθορισμένες εξαιρέσεις
  2. Εξαίρεση που καθορίζεται από το χρήστη

Προκαθορισμένες εξαιρέσεις

Η Oracle έχει προκαθορίσει κάποια κοινή εξαίρεση. Αυτές οι εξαιρέσεις έχουν ένα μοναδικό όνομα εξαίρεσης και αριθμό σφάλματος. Αυτές οι εξαιρέσεις ορίζονται ήδη στο πακέτο "STANDARD" στο Oracle. Στον κώδικα, μπορούμε να χρησιμοποιήσουμε άμεσα αυτά τα προκαθορισμένα ονόματα εξαιρέσεων για να τα χειριστούμε.

Ακολουθούν οι λίγες προκαθορισμένες εξαιρέσεις

Εξαίρεση Κωδικός λάθους Λόγος εξαίρεσης
ACCESS_INTO_NULL ORA-06530 Αντιστοιχίστε μια τιμή στα χαρακτηριστικά των μη αρχικοποιημένων αντικειμένων
CASE_NOT_FOUND ORA-06592 Καμία από τις ρήτρες «WHEN» στη δήλωση CASE δεν ικανοποιήθηκε και δεν έχει καθοριστεί καμία ρήτρα «ELSE»
COLLECTION_IS_NULL ORA-06531 Χρήση μεθόδων συλλογής (εκτός EXISTS) ή πρόσβασης σε χαρακτηριστικά συλλογής σε μη αρχικοποιημένες συλλογές
CURSOR_ALREADY_OPEN ORA-06511 Προσπαθώντας να ανοίξετε έναν δρομέα που είναι ήδη ανοιχτός
DUP_VAL_ON_INDEX ORA-00001 Αποθήκευση διπλής τιμής σε μια στήλη βάσης δεδομένων που περιορίζεται από το μοναδικό ευρετήριο
INVALID_CURSOR ORA-01001 Παράνομες λειτουργίες του δρομέα, όπως το κλείσιμο ενός ανοιγμένου δρομέα
INVALID_NUMBER ORA-01722 Η μετατροπή χαρακτήρα σε αριθμό απέτυχε λόγω μη έγκυρου αριθμού
ΔΕ ΒΡΕΘΗΚΑΝ ΔΕΔΟΜΕΝΑ ORA-01403 Όταν η δήλωση «SELECT» που περιέχει ρήτρα INTO δεν παίρνει σειρές.
ROW_MISMATCH ORA-06504 Όταν ο τύπος δεδομένων μεταβλητής δρομέα δεν είναι συμβατός με τον πραγματικό τύπο επιστροφής δρομέα
SUBSCRIPT_BEYOND_COUNT ORA-06533 Αναφορά συλλογής με αριθμό ευρετηρίου που είναι μεγαλύτερος από το μέγεθος συλλογής
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Παραπομπή συλλογής από έναν αριθμό ευρετηρίου που βρίσκεται εκτός του νομικού εύρους (π.χ.: -1)
TOO_MANY_ROWS ORA-01422 Όταν μια δήλωση «SELECT» με ρήτρα INTO επιστρέφει περισσότερες από μία σειρές
VALUE_ERROR ORA-06502 Σφάλμα περιορισμού αριθμητικού ή μεγέθους (π.χ.: εκχώρηση τιμής σε μια μεταβλητή που είναι μεγαλύτερη από το μέγεθος της μεταβλητής)
ZERO_DIVIDE ORA-01476 Διαίρεση ενός αριθμού με «0»

Εξαίρεση που καθορίζεται από το χρήστη

Στο Oracle, εκτός από τις παραπάνω προκαθορισμένες εξαιρέσεις, ο προγραμματιστής μπορεί να δημιουργήσει τη δική του εξαίρεση και να τις χειριστεί. Μπορούν να δημιουργηθούν σε επίπεδο υποπρογράμματος στο τμήμα δήλωσης. Αυτές οι εξαιρέσεις είναι ορατές μόνο σε αυτό το υποπρόγραμμα. Η εξαίρεση που ορίζεται στην προδιαγραφή του πακέτου είναι δημόσια εξαίρεση και είναι ορατή όπου είναι προσβάσιμο το πακέτο. <

Σύνταξη: Σε επίπεδο υποπρογράμματος

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • Στην παραπάνω σύνταξη, η μεταβλητή "exception_name" ορίζεται ως τύπος "EXCEPTION".
  • Αυτό μπορεί να χρησιμοποιηθεί με παρόμοιο τρόπο ως προκαθορισμένη εξαίρεση.

Σύνταξη: Σε επίπεδο προδιαγραφής πακέτου

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • Στην παραπάνω σύνταξη, η μεταβλητή "exception_name" ορίζεται ως τύπος "EXCEPTION" στην προδιαγραφή πακέτου του .
  • Αυτό μπορεί να χρησιμοποιηθεί στη βάση δεδομένων όπου μπορεί να κληθεί το πακέτο "package_name".

Εξαίρεση PL / SQL

Όλες οι προκαθορισμένες εξαιρέσεις αυξάνονται έμμεσα κάθε φορά που παρουσιάζεται το σφάλμα. Ωστόσο, οι εξαιρέσεις που καθορίζονται από τον χρήστη πρέπει να αυξηθούν ρητά. Αυτό μπορεί να επιτευχθεί χρησιμοποιώντας τη λέξη-κλειδί «RAISE». Αυτό μπορεί να χρησιμοποιηθεί με οποιονδήποτε από τους τρόπους που αναφέρονται παρακάτω.

Εάν το "RAISE" χρησιμοποιείται ξεχωριστά στο πρόγραμμα, τότε θα μεταδώσει την ήδη αυξημένη εξαίρεση στο γονικό μπλοκ. Μόνο σε εξαίρεση μπλοκ μπορεί να χρησιμοποιηθεί όπως φαίνεται παρακάτω.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Επεξήγηση σύνταξης:

  • Στην παραπάνω σύνταξη, η λέξη-κλειδί RAISE χρησιμοποιείται στο μπλοκ χειρισμού εξαιρέσεων.
  • Κάθε φορά που το πρόγραμμα συναντά την εξαίρεση "exception_name", η εξαίρεση αντιμετωπίζεται και θα ολοκληρωθεί κανονικά
  • Όμως, η λέξη-κλειδί «RAISE» στο τμήμα χειρισμού εξαιρέσεων θα μεταδώσει αυτήν τη συγκεκριμένη εξαίρεση στο γονικό πρόγραμμα.

Σημείωση: Ενώ αυξάνετε την εξαίρεση στο γονικό μπλοκ, η εξαίρεση που αυξάνεται πρέπει επίσης να είναι ορατή στο γονικό μπλοκ, αλλιώς το oracle θα ρίξει ένα σφάλμα.

  • Μπορούμε να χρησιμοποιήσουμε τη λέξη-κλειδί «RAISE» ακολουθούμενο από το όνομα εξαίρεσης για να αυξήσουμε τη συγκεκριμένη εξαίρεση που καθορίζεται από τον χρήστη / προκαθορισμένο. Αυτό μπορεί να χρησιμοποιηθεί τόσο στο τμήμα εκτέλεσης όσο και στο τμήμα χειρισμού εξαίρεσης για να αυξήσει την εξαίρεση.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Επεξήγηση σύνταξης:

  • Στην παραπάνω σύνταξη, η λέξη-κλειδί RAISE χρησιμοποιείται στο τμήμα εκτέλεσης ακολουθούμενη από την εξαίρεση "exception_name".
  • Αυτό θα αυξήσει τη συγκεκριμένη εξαίρεση κατά τη στιγμή της εκτέλεσης, και αυτό πρέπει να αντιμετωπιστεί ή να αυξηθεί περαιτέρω.

Παράδειγμα 1 : Σε αυτό το παράδειγμα, θα δούμε

  • Πώς να δηλώσετε την εξαίρεση
  • Πώς να αυξήσετε τη δηλωθείσα εξαίρεση και
  • Πώς να το διαδώσετε στο κύριο μπλοκ
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Επεξήγηση κώδικα:

  • Γραμμή κωδικού 2 : Δήλωση της μεταβλητής «sample_exception» ως τύπος ΕΞΑΙΡΕΣΗΣ.
  • Γραμμή κώδικα 3 : Διαδικασία δήλωσης nested_block.
  • Γραμμή κώδικα 6 : Εκτύπωση της δήλωσης "Inside nested block".
  • Γραμμή κώδικα 7: Εκτύπωση της δήλωσης "Αύξηση δείγματος_εξαίρεσης από ένθετο μπλοκ."
  • Γραμμή κώδικα 8: Αύξηση της εξαίρεσης χρησιμοποιώντας το "RAISE sample_exception".
  • Γραμμή κώδικα 10: Χειριστής εξαίρεσης για εξαίρεση sample_exception στο ένθετο μπλοκ.
  • Γραμμή κώδικα 11: Εκτύπωση της δήλωσης «Εξαίρεση που καταγράφεται σε ένθετο μπλοκ. Αύξηση στο κύριο μπλοκ ».
  • Γραμμή κώδικα 12: Αύξηση της εξαίρεσης στο κύριο μπλοκ (διάδοση στο κύριο μπλοκ).
  • Γραμμή κώδικα 15: Εκτύπωση της δήλωσης "Μέσα στο κύριο μπλοκ".
  • Γραμμή κώδικα 16: Εκτύπωση της δήλωσης "Κλήση ένθετου μπλοκ".
  • Γραμμή κώδικα 17: Διαδικασία κλήσης nested_block.
  • Γραμμή κώδικα 19: Χειριστής εξαίρεσης για το sample_exception στο κύριο μπλοκ.
  • Γραμμή κώδικα 20: Εκτύπωση της δήλωσης "Η εξαίρεση καταγράφεται στο κύριο μπλοκ."

Σημαντικά σημεία που πρέπει να λάβετε υπόψη στην Εξαίρεση

  • Στη συνάρτηση, μια εξαίρεση θα πρέπει πάντα είτε να επιστρέφει την τιμή είτε να αυξάνει περαιτέρω την εξαίρεση. αλλιώς η Oracle θα ρίξει το σφάλμα «Λειτουργία επιστρέφεται χωρίς τιμή» στο χρόνο εκτέλεσης.
  • Οι δηλώσεις ελέγχου συναλλαγών μπορούν να δοθούν στο μπλοκ χειρισμού εξαιρέσεων.
  • SQLERRM και SQLCODE είναι οι ενσωματωμένες συναρτήσεις που θα δώσουν το μήνυμα εξαίρεσης και τον κώδικα.
  • Εάν δεν αντιμετωπιστεί μια εξαίρεση, τότε από προεπιλογή όλες οι ενεργές συναλλαγές σε αυτήν την περίοδο λειτουργίας θα επιστραφούν.
  • Το RAISE_APPLICATION_ERROR (- , ) μπορεί να χρησιμοποιηθεί αντί του RAISE για να αυξήσει το σφάλμα με τον κωδικό χρήστη και το μήνυμα. Ο κωδικός σφάλματος πρέπει να είναι μεγαλύτερος από 20000 και να είναι προθεματικός με '-'.

Περίληψη

Μετά από αυτό το κεφάλαιο. θα πρέπει να μπορείτε να εργαστείτε για τις ακόλουθες πτυχές των εξαιρέσεων Pl SQL

  • Χειρισμός των εξαιρέσεων
  • Ορίστε μια εξαίρεση
  • Αυξήστε την εξαίρεση
  • Διάδοση εξαιρέσεων