Oracle Δρομέας PL/SQL: Implicit, Explicit, For Loop με Παράδειγμα

⚡ Έξυπνη Σύνοψη

Δρομείς σε Oracle Τα PL/SQL είναι δείκτες στην περιοχή περιβάλλοντος που περιέχει τις γραμμές που επιστρέφονται από μια πρόταση SQL. Υπάρχουν δύο είδη: οι έμμεσοι κέρσορες, που δημιουργούνται αυτόματα για την DML, και οι σαφείς κέρσορες, που δηλώνονται και ελέγχονται από τον προγραμματιστή.

  • 📍 Περιοχή περιβάλλοντος: Ένας δρομέας δείχνει στην περιοχή περιβάλλοντος που αποθηκεύει μια πρόταση SQL και το ενεργό σύνολο που επιστρέφει.
  • ⚙️ Σιωπηρός δρομέας: Oracle ανοίγει αυτόματα έναν έμμεσο κέρσορα για κάθε πρόταση DML και SELECT INTO μίας γραμμής.
  • ✋ Σαφής δρομέας: Ένας προγραμματιστής δηλώνει, ανοίγει, ανακτά και κλείνει έναν συγκεκριμένο κέρσορα για πλήρη έλεγχο.
  • 🔎 Χαρακτηριστικά δρομέα: Οι %FOUND, %NOTFOUND, %ISOPEN και %ROWCOUNT αναφέρουν την κατάσταση της πιο πρόσφατης λειτουργίας.
  • 🔁 Δρομέας ΓΙΑ βρόχος: Ένας βρόχος FOR ανοίγει, ανακτά και κλείνει έναν κέρσορα έμμεσα, χωρίς να χρειάζεται χειροκίνητα βήματα.
  • 🤖 Βοήθεια AI: Βοηθοί τεχνητής νοημοσύνης, όπως το GitHub Copilot, σχεδιάζουν βρόχους κέρσορα και επισημαίνουν μη κλειστούς κέρσορες.

Oracle Δρομέας PL/SQL, έμμεσος, ρητός και βρόχος FOR

Τι είναι το 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.

Παράδειγμα σαφούς δρομέα για την ανάκτηση ονομάτων υπαλλήλων από τον πίνακα emp στο Oracle PL / SQL

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.

Συχνές Ερωτήσεις

Ένας REF CURSOR (μεταβλητή δρομέα) είναι ένας δείκτης σε ένα σύνολο αποτελεσμάτων ερωτήματος. Σε αντίθεση με έναν στατικό δρομέα, μπορεί να ανοίξει διαφορετικά ερωτήματα κατά τον χρόνο εκτέλεσης και να μεταβιβάσει αποτελέσματα μεταξύ μπλοκ PL/SQL ή σε προγράμματα-πελάτες.

Ένας κανονικός δρομέας ανακτά μία γραμμή ανά FETCH, προκαλώντας πολλές αλλαγές περιβάλλοντος. ΧΥΜΑ ΣΥΛΛΟΓΗ φορτώνει πολλές γραμμές σε μια συλλογή με μία μόνο ανάκτηση, μειώνοντας σημαντικά την επιβάρυνση σε μεγάλα σύνολα αποτελεσμάτων.

Ναι. Δηλώστε έναν παραμετροποιημένο κέρσορα όπως CURSOR c(dept NUMBER) IS SELECT … και, στη συνέχεια, περάστε τιμές στο OPEN c(10). Οι παράμετροι σάς επιτρέπουν να επαναχρησιμοποιήσετε έναν ορισμό κέρσορα με διαφορετικές τιμές φίλτρου.

Η συνάρτηση FOR UPDATE κλειδώνει τις γραμμές που επιλέγει ένας κέρσορας, ώστε κανείς άλλος να μην μπορεί να τις αλλάξει. Η συνάρτηση WHERE CURRENT OF ενημερώνει ή διαγράφει την ακριβή γραμμή που μόλις ανακτήθηκε, χωρίς να επαναλαμβάνει τη συνθήκη WHERE.

Οι ανοιχτοί κέρσορες διατηρούν τη μνήμη τους δεσμευμένη και υπολογίζονται στο όριο OPEN_CURSORS. Αν αφήσετε πολλούς ανοιχτούς, τελικά αυξάνεται το ORA-01000: ξεπεράστηκε ο μέγιστος αριθμός ανοιχτών κέρσορων, επομένως ΚΛΕΙΣΤΕ πάντα έναν συγκεκριμένο κέρσορα μετά τη χρήση.

Κάθε FETCH εναλλάσσεται μεταξύ των μηχανών PL/SQL και SQL. Χιλιάδες τέτοιοι διακόπτες περιβάλλοντος αθροίζονται, επομένως μια ενιαία πρόταση SQL που βασίζεται σε σύνολα ή BULK COLLECT συνήθως επεξεργάζεται τις ίδιες γραμμές πολύ πιο γρήγορα.

Ναί. GitHub Copilot συντάσσει σαφείς βρόχους OPEN, FETCH και CLOSE ή βρόχους cursor FOR από ένα σχόλιο, προσθέτει ελέγχους εξόδου %NOTFOUND και προτείνει ονόματα χαρακτηριστικών, αν και θα πρέπει πρώτα να ελέγξετε τη λογική.

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

Συνοψίστε αυτήν την ανάρτηση με: