Εξαίρεση Χειρισμός σε Oracle PL/SQL (Παραδείγματα)

Τι είναι ο χειρισμός εξαιρέσεων στο PL/SQL;

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

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

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

Εξαίρεση-Χειρισμός Σύνταξη

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

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

Εξαίρεση χειρισμού σε PL/SQL

BEGIN
<execution block>
.
.
EXCEPTION
WHEN <exceptionl_name>
THEN
  <Exception handling code for the “exception 1 _name’' >
WHEN OTHERS
THEN
  <Default exception handling code for all exceptions >
END;

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

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

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

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

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

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

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

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

Παρακάτω είναι οι λίγες προκαθορισμένες εξαιρέσεις

Εξαίρεση Κωδικός λάθους Λόγος εξαίρεσης
ACCESS_INTO_NULL ORA-06530 Εκχωρήστε μια τιμή στα χαρακτηριστικά των μη αρχικοποιημένων αντικειμένων
ΠΕΡΙΠΤΩΣΗ_ΔΕΝ_ΒΡΕΘΗΚΕ 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'

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

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

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

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • Στην παραπάνω σύνταξη, η μεταβλητή 'exception_name' ορίζεται ως τύπος 'EXCEPTION'.
  • Αυτό μπορεί να χρησιμοποιηθεί με παρόμοιο τρόπο ως προκαθορισμένη εξαίρεση.

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

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

Εξαίρεση αύξησης PL/SQL

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

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

Εξαίρεση αύξησης PL/SQL

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

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

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

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

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

Εξαίρεση αύξησης PL/SQL

CREATE [ PROCEDURE | FUNCTION ] 
AS
BEGIN
<Execution block>
RAISE <exception_name>
EXCEPTION
WHEN <exception_name> THEN
<Handler>
END;

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

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

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

  • Πώς να δηλώσετε την εξαίρεση
  • Πώς να αυξήσετε τη δηλωθείσα εξαίρεση και
  • Πώς να το διαδώσετε στο κύριο μπλοκ

Εξαίρεση αύξησης PL/SQL

Εξαίρεση αύξησης PL/SQL

DECLARE
Sample_exception EXCEPTION;
PROCEDURE nested_block
IS
BEGIN
Dbms_output.put_line(‘Inside nested block’);
Dbms_output.put_line(‘Raising sample_exception from nested block’);
RAISE sample_exception;
EXCEPTION
WHEN sample_exception THEN 
Dbms_output.put_line (‘Exception captured in nested block. Raising to main block’);
RAISE,
END;
BEGIN
Dbms_output.put_line(‘Inside main block’);
Dbms_output.put_line(‘Calling nested block’);
Nested_block;
EXCEPTION
WHEN sample_exception THEN	
Dbms_output.put_line (‘Exception captured in main block');
END:
/

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

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

Σημαντικά σημεία που πρέπει να σημειωθούν στην Εξαίρεση

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

Περίληψη

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

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