Εξαίρεση Χειρισμός σε Oracle PL/SQL (Παραδείγματα)
Τι είναι ο χειρισμός εξαιρέσεων στο PL/SQL;
Μια εξαίρεση προκύπτει όταν ο κινητήρας PL/SQL αντιμετωπίζει μια εντολή την οποία δεν μπορεί να εκτελέσει λόγω ενός σφάλματος που παρουσιάζεται κατά το χρόνο εκτέλεσης. Αυτά τα σφάλματα δεν θα καταγραφούν κατά τη στιγμή της μεταγλώττισης και, ως εκ τούτου, πρέπει να αντιμετωπιστούν μόνο κατά το χρόνο εκτέλεσης.
Για παράδειγμα, εάν ο κινητήρας PL/SQL λάβει μια εντολή για διαίρεση οποιουδήποτε αριθμού με το '0', τότε ο κινητήρας PL/SQL θα τον ρίξει ως εξαίρεση. Η εξαίρεση τίθεται μόνο κατά το χρόνο εκτέλεσης από τον κινητήρα PL/SQL.
Οι εξαιρέσεις θα σταματήσουν την περαιτέρω εκτέλεση του προγράμματος, επομένως για να αποφευχθεί μια τέτοια κατάσταση, πρέπει να καταγραφούν και να χειριστούν ξεχωριστά. Αυτή η διαδικασία ονομάζεται Exception-Handling, κατά την οποία ο προγραμματιστής χειρίζεται την εξαίρεση που μπορεί να προκύψει κατά το χρόνο εκτέλεσης.
Εξαίρεση-Χειρισμός Σύνταξη
Ο χειρισμός των εξαιρέσεων γίνεται στο μπλοκ, επίπεδο, δηλαδή, αν συμβεί κάποια εξαίρεση σε οποιοδήποτε μπλοκ, τότε το στοιχείο ελέγχου θα βγει από το τμήμα εκτέλεσης αυτού του μπλοκ. Στη συνέχεια, η εξαίρεση θα αντιμετωπιστεί στο τμήμα χειρισμού εξαιρέσεων αυτού του μπλοκ. Μετά το χειρισμό της εξαίρεσης, δεν είναι δυνατή η εκ νέου αποστολή του ελέγχου πίσω στην ενότητα εκτέλεσης αυτού του μπλοκ.
Η παρακάτω σύνταξη εξηγεί πώς να πιάσετε και να χειριστείτε την εξαίρεση.
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.
- Προκαθορισμένες Εξαιρέσεις
- Εξαίρεση που καθορίζεται από το χρήστη
Προκαθορισμένες Εξαιρέσεις
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' χρησιμοποιείται ξεχωριστά στο πρόγραμμα, τότε θα διαδοθεί η ήδη ανεβασμένη εξαίρεση στο γονικό μπλοκ. Μόνο στο μπλοκ εξαίρεσης μπορεί να χρησιμοποιηθεί όπως φαίνεται παρακάτω.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Επεξήγηση σύνταξης:
- Στην παραπάνω σύνταξη, η λέξη-κλειδί RAISE χρησιμοποιείται στο μπλοκ χειρισμού εξαιρέσεων.
- Κάθε φορά που το πρόγραμμα συναντά την εξαίρεση "exception_name", η εξαίρεση αντιμετωπίζεται και θα ολοκληρωθεί κανονικά
- Ωστόσο, η λέξη-κλειδί "RAISE" στο τμήμα χειρισμού εξαιρέσεων θα μεταδώσει τη συγκεκριμένη εξαίρεση στο γονικό πρόγραμμα.
Σημείωση: Κατά την αύξηση της εξαίρεσης στο γονικό μπλοκ, η εξαίρεση που αυξάνεται θα πρέπει επίσης να είναι ορατή στο γονικό μπλοκ, διαφορετικά το oracle θα εμφανίσει ένα σφάλμα.
- Μπορούμε να χρησιμοποιήσουμε τη λέξη-κλειδί "RAISE" ακολουθούμενη από το όνομα της εξαίρεσης για να αυξήσουμε τη συγκεκριμένη εξαίρεση που ορίζεται/προκαθορίζεται από το χρήστη. Αυτό μπορεί να χρησιμοποιηθεί τόσο στο τμήμα εκτέλεσης όσο και στο τμήμα χειρισμού εξαιρέσεων για την αύξηση της εξαίρεσης.
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Επεξήγηση σύνταξης:
- Στην παραπάνω σύνταξη, η λέξη-κλειδί RAISE χρησιμοποιείται στο τμήμα εκτέλεσης ακολουθούμενη από την εξαίρεση «όνομα_εξαίρεσης».
- Αυτό θα δημιουργήσει αυτήν τη συγκεκριμένη εξαίρεση κατά τη στιγμή της εκτέλεσης, και αυτό πρέπει να αντιμετωπιστεί ή να αυξηθεί περαιτέρω.
Παράδειγμα 1: Σε αυτό το παράδειγμα, θα δούμε
- Πώς να δηλώσετε την εξαίρεση
- Πώς να αυξήσετε τη δηλωθείσα εξαίρεση και
- Πώς να το διαδώσετε στο κύριο μπλοκ
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 εξαιρέσεις
- Χειρισμός των εξαιρέσεων
- Ορίστε μια εξαίρεση
- Αυξήστε την εξαίρεση
- Διάδοση εξαίρεσης