Oracle Δρομέας PL/SQL: Implicit, Explicit, For Loop με Παράδειγμα
⚡ Έξυπνη Σύνοψη
Δρομείς σε Oracle Τα PL/SQL είναι δείκτες στην περιοχή περιβάλλοντος που περιέχει τις γραμμές που επιστρέφονται από μια πρόταση SQL. Υπάρχουν δύο είδη: οι έμμεσοι κέρσορες, που δημιουργούνται αυτόματα για την DML, και οι σαφείς κέρσορες, που δηλώνονται και ελέγχονται από τον προγραμματιστή.

Τι είναι το CURSOR στο PL/SQL;
Ένας δρομέας είναι ένας δείκτης προς την περιοχή περιβάλλοντος. Oracle δημιουργεί μια περιοχή περιβάλλοντος για την επεξεργασία ενός SQL δήλωση, και αυτή η περιοχή περιέχει όλες τις πληροφορίες σχετικά με τη δήλωση.
PL / SQL επιτρέπει στον προγραμματιστή να ελέγχει την περιοχή περιβάλλοντος μέσω του κέρσορα. Ένας κέρσορας περιέχει τις γραμμές που επιστρέφονται από την πρόταση SQL και το σύνολο των γραμμών που περιέχει ο κέρσορας αναφέρεται ως ενεργό σύνολο. Αυτοί οι κέρσορες μπορούν επίσης να ονομαστούν έτσι ώστε να μπορούν να αναφερθούν από άλλο σημείο του κώδικα.
Ο κέρσορας είναι δύο τύπων:
- Σιωπηρός Δρομέας
- Σαφής Δρομέας
Σιωπηρός Δρομέας
Όποτε Λειτουργία DML Όταν συμβεί κάτι τέτοιο στη βάση δεδομένων, δημιουργείται ένας έμμεσος κέρσορας που περιέχει τις γραμμές που επηρεάζονται σε αυτήν τη συγκεκριμένη λειτουργία. Αυτοί οι κέρσορες δεν μπορούν να ονομαστούν και, ως εκ τούτου, δεν μπορούν να ελεγχθούν ή να αναφερθούν από άλλο σημείο του κώδικα. Μπορούμε να αναφερθούμε μόνο στον πιο πρόσφατο κέρσορα μέσω των χαρακτηριστικών του κέρσορα.
Σαφής Δρομέας
Οι προγραμματιστές επιτρέπεται να δημιουργήσουν μια επώνυμη περιοχή περιβάλλοντος για να εκτελέσουν τις λειτουργίες DML και να αποκτήσουν περισσότερο έλεγχο πάνω σε αυτήν. Ο σαφής δρομέας θα πρέπει να οριστεί στην ενότητα δήλωσης του Μπλοκ PL/SQLκαι δημιουργείται για την πρόταση SELECT που πρέπει να χρησιμοποιηθεί στον κώδικα.
Παρακάτω παρατίθενται τα βήματα που εμπλέκονται στην εργασία με σαφείς κέρσορες:
- Δήλωση του κέρσορα: Η δήλωση του δρομέα σημαίνει απλώς τη δημιουργία μιας επώνυμης περιοχής περιβάλλοντος για την πρόταση SELECT που ορίζεται στο τμήμα δήλωσης. Το όνομα αυτής της περιοχής περιβάλλοντος είναι το ίδιο με το όνομα του δρομέα.
- Άνοιγμα του κέρσορα: Το άνοιγμα του κέρσορα δίνει εντολή στην PL/SQL να εκχωρήσει τη μνήμη για αυτόν τον κέρσορα. Αυτό τον καθιστά έτοιμο να ανακτήσει τις εγγραφές.
- Ανάκτηση δεδομένων από τον κέρσορα: Σε αυτήν τη διαδικασία, εκτελείται η εντολή SELECT και οι ανακτημένες γραμμές αποθηκεύονται στην εκχωρημένη μνήμη. Αυτά ονομάζονται πλέον ενεργά σύνολα. Η ανάκτηση δεδομένων από τον κέρσορα είναι μια δραστηριότητα σε επίπεδο εγγραφής, που σημαίνει ότι μπορούμε να έχουμε πρόσβαση στα δεδομένα με τρόπο εγγραφή προς εγγραφή. Κάθε εντολή fetch ανακτά ένα ενεργό σύνολο και διατηρεί τις πληροφορίες αυτής της συγκεκριμένης εγγραφής. Αυτή η εντολή είναι η ίδια με μια εντολή SELECT που ανακτά την εγγραφή και την αντιστοιχίζει στη μεταβλητή στον όρο INTO, αλλά δεν θα ρίξει καμία εξαιρέσεις.
- Κλείσιμο του κέρσορα: Μόλις ανακτηθούν όλες οι εγγραφές, πρέπει να κλείσουμε τον κέρσορα έτσι ώστε να απελευθερωθεί η μνήμη που έχει διατεθεί σε αυτήν την περιοχή περιβάλλοντος.
Σύνταξη
DECLARE CURSOR <cursor_name> IS <SELECT statement>; <cursor_variable declaration>; BEGIN OPEN <cursor_name>; FETCH <cursor_name> INTO <cursor_variable>; . . CLOSE <cursor_name>; END;
Στην παραπάνω σύνταξη, το τμήμα δήλωσης περιέχει τη δήλωση του δρομέα και τη μεταβλητή δρομέα στην οποία θα αντιστοιχιστούν τα δεδομένα που ανακτώνται. Ο δρομέας δημιουργείται για την πρόταση SELECT που δίνεται στη δήλωση δρομέα. Στο τμήμα εκτέλεσης, ο δηλωμένος δρομέας ανοίγει, ανακτάται και κλείνει.
Χαρακτηριστικά δρομέα
Τόσο ο έμμεσος όσο και ο σαφής δρομέας έχουν ορισμένα χαρακτηριστικά στα οποία είναι δυνατή η πρόσβαση. Αυτά τα χαρακτηριστικά παρέχουν περισσότερες πληροφορίες σχετικά με τις λειτουργίες του δρομέα. Παρακάτω παρατίθενται τα διαφορετικά χαρακτηριστικά του δρομέα και η χρήση τους.
| Χαρακτηριστικό δρομέα | Περιγραφή |
|---|---|
| %ΒΡΕΘΗΚΑΝ | Επιστρέφει το λογικό αποτέλεσμα TRUE εάν η πιο πρόσφατη λειτουργία ανάκτησης ανέκτησε μια εγγραφή με επιτυχία. Διαφορετικά, επιστρέφει FALSE. |
| %ΔΕΝ ΒΡΕΘΗΚΕ | Λειτουργεί αντίθετα με το %FOUND. Επιστρέφει TRUE εάν η πιο πρόσφατη λειτουργία ανάκτησης δεν μπόρεσε να ανακτήσει καμία εγγραφή. |
| %ΕΙΝΑΙ ΑΝΟΙΧΤΟ | Επιστρέφει το λογικό αποτέλεσμα TRUE εάν ο δεδομένος δρομέας είναι ήδη ανοιχτός, διαφορετικά επιστρέφει FALSE. |
| % rowCount | Επιστρέφει μια αριθμητική τιμή που δίνει τον πραγματικό αριθμό εγγραφών που επηρεάζονται ή ανακτώνται από τη λειτουργία. |
Παράδειγμα σαφούς δρομέα: Σε αυτό το παράδειγμα, θα δούμε πώς να δηλώσουμε, να ανοίξουμε, να ανακτήσουμε και να κλείσουμε έναν σαφή κέρσορα. Θα προβάλουμε όλα τα ονόματα των υπαλλήλων από τον πίνακα emp χρησιμοποιώντας έναν κέρσορα. Θα χρησιμοποιήσουμε επίσης ένα χαρακτηριστικό κέρσορα για να ορίσουμε τον βρόχο ώστε να ανακτά όλες τις εγγραφές από τον κέρσορα.
Το παρακάτω στιγμιότυπο οθόνης δείχνει αυτό το σαφές παράδειγμα δρομέα και την έξοδό του σε Oracle.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; lv_emp_name emp.emp_name%type; BEGIN OPEN guru99_det; LOOP FETCH guru99_det INTO lv_emp_name; IF guru99_det%NOTFOUND THEN EXIT; END IF; Dbms_output.put_line('Employee Fetched:'||lv_emp_name); END LOOP; Dbms_output.put_line('Total rows fetched is'||guru99_det%ROWCOUNT); CLOSE guru99_det; END; /
Παραγωγή
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY Total rows fetched is 3
Code εξήγηση
- Code γραμμή 2: Δηλώνοντας τον κέρσορα guru99_det για την πρόταση 'SELECT emp_name FROM emp'.
- Code γραμμή 3: Δηλώνοντας τη μεταβλητή lv_emp_name με την %τύπος αγκυρωμένο στο emp.emp_name.
- Code γραμμή 5: Άνοιγμα του κέρσορα guru99_det.
- Code γραμμή 6: Ορισμός της βασικής εντολής βρόχου για την ανάκτηση όλων των εγγραφών στον πίνακα emp.
- Code γραμμή 7: Ανακτά τα δεδομένα guru99_det και αντιστοιχίζει την τιμή στο lv_emp_name.
- Code γραμμή 8: Χρησιμοποιώντας το χαρακτηριστικό cursor %NOTFOUND για να ελέγξετε εάν έχουν ανακτηθεί όλες οι εγγραφές στον κέρσορα. Εάν ανακτηθεί, επιστρέφει TRUE και ο έλεγχος τερματίζει τον βρόχο. Διαφορετικά, ο έλεγχος συνεχίζει να ανακτά τα δεδομένα από τον κέρσορα και τα εκτυπώνει.
- Code γραμμή 10: Συνθήκη EXIT για την πρόταση βρόχου.
- Code γραμμή 12: Εκτυπώστε το όνομα υπαλλήλου που ανακτήθηκε.
- Code γραμμή 14: Χρησιμοποιώντας το χαρακτηριστικό %ROWCOUNT του δρομέα για να βρείτε τον συνολικό αριθμό εγγραφών που ανακτήθηκαν από τον δρομέα.
- Code γραμμή 15: Μετά την έξοδο από τον βρόχο, ο κέρσορας κλείνει και η εκχωρημένη μνήμη ελευθερώνεται.
Δήλωση δρομέα βρόχου FOR
Ένας δρομέας βρόχος ΓΙΑ μπορεί να χρησιμοποιηθεί για εργασία με δρομείς. Μπορούμε να δώσουμε το όνομα του δρομέα αντί για ένα όριο εύρους στην εντολή βρόχου FOR, έτσι ώστε ο βρόχος να λειτουργεί από την πρώτη εγγραφή του δρομέα έως την τελευταία εγγραφή του δρομέα. Η μεταβλητή δρομέα, το άνοιγμα του δρομέα, η ανάκτηση και το κλείσιμο του δρομέα γίνονται όλα έμμεσα από τον βρόχο FOR.
Σύνταξη
DECLARE CURSOR <cursor_name> IS <SELECT statement>; BEGIN FOR I IN <cursor_name> LOOP . . END LOOP; END;
Στην παραπάνω σύνταξη, το τμήμα δήλωσης περιέχει τη δήλωση του δρομέα. Ο δρομέας δημιουργείται για την πρόταση SELECT που δίνεται στη δήλωση του δρομέα. Στο τμήμα εκτέλεσης, ο δηλωμένος δρομέας ορίζεται στον βρόχο FOR και η μεταβλητή βρόχου 'I' συμπεριφέρεται ως η μεταβλητή δρομέα σε αυτήν την περίπτωση.
Oracle Παράδειγμα δρομέα για βρόχο: Σε αυτό το παράδειγμα, θα προβάλουμε όλα τα ονόματα των υπαλλήλων από τον πίνακα emp χρησιμοποιώντας έναν βρόχο cursor-FOR.
DECLARE CURSOR guru99_det IS SELECT emp_name FROM emp; BEGIN FOR lv_emp_name IN guru99_det LOOP Dbms_output.put_line('Employee Fetched:'||lv_emp_name.emp_name); END LOOP; END; /
Παραγωγή
Employee Fetched:BBB Employee Fetched:XXX Employee Fetched:YYY
Code εξήγηση
- Code γραμμή 2: Δηλώνοντας τον κέρσορα guru99_det για την πρόταση 'SELECT emp_name FROM emp'.
- Code γραμμή 4: Κατασκευή του βρόχου FOR για τον κέρσορα με τη μεταβλητή βρόχου lv_emp_name.
- Code γραμμή 6: Εκτύπωση του ονόματος υπαλλήλου σε κάθε επανάληψη του βρόχου.
- Code γραμμή 7: Έξοδος από τον βρόχο (ΤΕΛΟΣ ΒΡΟΧΟΥ).
Σημείωση: Σε έναν βρόχο δρομέα-FOR, τα χαρακτηριστικά του δρομέα δεν μπορούν να χρησιμοποιηθούν, καθώς το άνοιγμα, η ανάκτηση και το κλείσιμο του δρομέα γίνονται έμμεσα από τον βρόχο FOR.

