Δρομείς σε αποθηκευμένες διαδικασίες MySQL. Εντολή DECLARE CURSOR γενικοί κανόνες Τι είναι ο δρομέας sql

Ένας ρητός δρομέας είναι μια δήλωση SELECT που ορίζεται ρητά στην ενότητα δήλωσης του προγράμματος. Όταν δηλώνεται ένας ρητός δρομέας, του δίνεται ένα όνομα. Για εντολές INSERT, UPDATE, MERGE και DELETE, δεν μπορούν να οριστούν ρητά δρομείς.

Ορίζοντας την εντολή SELECT ως ρητό δρομέα, ο προγραμματιστής αποκτά τον έλεγχο των βασικών βημάτων ανάκτησης πληροφοριών από τη βάση δεδομένων Oracle. Καθορίζει πότε θα ανοίξει ο κέρσορας (OPEN), πότε θα ληφθούν σειρές από αυτόν (FETCH), πόσες σειρές θα ληφθούν και πότε θα κλείσετε τον κέρσορα με την εντολή ΚΛΕΙΣΙΜΟ. Πληροφορίες σχετικά με την τρέχουσα κατάσταση του δρομέα είναι διαθέσιμες μέσω των χαρακτηριστικών του. Είναι η λεπτή ακρίβεια του ελέγχου που κάνει τους ρητούς δρομείς ένα ανεκτίμητο εργαλείο για τον προγραμματιστή.

Εξετάστε ένα παράδειγμα:

1 ΣΥΝΑΡΤΗΣΗ jealousy_level (2 NAME_IN ΣΕ φίλους.NAME%TYPE) ΕΠΙΣΤΡΟΦΗ ΑΡΙΘΜΟΥ 3 ΩΣ 4 CURSOR jealousy_cur 5 IS 6 ΕΠΙΛΟΓΗ τοποθεσίας ΑΠΟ φίλους 7 WHERE NAME = UPPER (NAME_IN); 8 8 jealousy_rec jealousy_cur%ROWTYPE; 9 επανάληψη ΑΡΙΘΜΟΣ; 10 ΑΡΧΗ 11 ΑΝΟΙΞΤΕ jealousy_cur; 13 12 FETCH jealousy_cur INTO jealousy_rec; 15 13 ΑΝ jealousy_cur%FOUND 14 ΤΟΤΕ 15 ΑΝ jealousy_rec.location = "ΠΟΥΕΡΤΟ ΡΙΚΟ" 16 ΤΟΤΕ retval:= 10; 17 ELSIF jealousy_rec.location = "CHICAGO" 18 ΜΕΤΑ retval:= 1; 19 ENDIF; 20 ΤΕΛΟΣ ΑΝ; 24 21 ΚΛΕΙΣΙΜΟ jealousy_cur; 26 22 RETURN retval; 23 ΕΞΑΙΡΕΣΗ 24 ΟΤΑΝ ΑΛΛΟΙ ΤΟΤΕ 25 ΑΝ jealousy_cur%ISOPEN ΤΟΤΕ 26 ΚΛΕΙΣΙΜΟ jealousy_cur; 27 ΤΕΛΟΣ ΑΝ; 28ΤΕΛΟΣ;

Οι επόμενες ενότητες εξετάζουν κάθε μία από αυτές τις λειτουργίες λεπτομερώς. Ο όρος "δρομέας" σε αυτά αναφέρεται σε ρητούς δρομείς, εκτός εάν το κείμενο ορίζει ρητά το αντίθετο.

Δήλωση ρητής δρομέα

Για να μπορείτε να χρησιμοποιήσετε έναν ρητό δρομέα, πρέπει να δηλωθεί στην ενότητα δήλωσης ενός μπλοκ ή πακέτου PL/SQL:

CURSOR cursor_name [ ([ παράμετρος [, παράμετρος...]) ] [ RETURN refEurn_spec ] IS SELECT_command ];

Εδώ το όνομα του δρομέα είναι το όνομα του δρομέα που δηλώνεται. special_te?um - προαιρετική ενότητα RETURN. KOMaHdaSELECT - οποιαδήποτε έγκυρη εντολή SQL SELECT. Οι παράμετροι μπορούν επίσης να μεταβιβαστούν στον κέρσορα (δείτε την ενότητα Παράμετροι δρομέα παρακάτω). Τέλος, μετά την εντολή ΕΠΙΛΟΓΗ...ΓΙΑ ΕΝΗΜΕΡΩΣΗ, μπορείτε να καθορίσετε τη λίστα των στηλών προς ενημέρωση (δείτε επίσης παρακάτω). Αφού δηλωθεί ο κέρσορας, η εντολή OPEN τον ανοίγει και η ανάκτηση γραμμών από αυτόν γίνεται με την εντολή FETCH.

Μερικά παραδείγματα ρητών δηλώσεων δρομέα.

  • Δρομέας χωρίς παραμέτρους. Το σύνολο αποτελεσμάτων σειρών αυτού του δρομέα είναι ένα σύνολο εταιρικών αναγνωριστικών που επιλέγονται από όλες τις σειρές του πίνακα:
CURSOR company_cur ΕΙΝΑΙ SELECT company_id ΑΠΟ εταιρεία.
  • Δρομέας με παραμέτρους.Το σύνολο γραμμών αποτελεσμάτων για αυτόν τον κέρσορα περιέχει μια μόνο σειρά με το όνομα της εταιρείας που ταιριάζει με την τιμή της παραμέτρου που πέρασε:
CURSOR name_cur (company_id_in IN NUMBER) ΕΙΝΑΙ ΕΠΙΛΕΓΜΕΝΟ όνομα ΑΠΟ την εταιρεία ΟΠΟΥ company_id = company_id_in;
  • Δρομέας με ρήτρα RETURN. Το σύνολο αποτελεσμάτων αυτού του δρομέα περιέχει όλα τα δεδομένα στον πίνακα υπαλλήλων για το τμήμα ID 10:
CURSOR emp_cur RETURN υπάλληλοι%ROWTYPE IS SELECT * ΑΠΟ εργαζομένους WHERE Department_id = 10;

Όνομα δρομέα

Ένα ρητό όνομα δρομέα πρέπει να έχει μήκος έως 30 χαρακτήρες και να ακολουθεί τους ίδιους κανόνες με άλλα αναγνωριστικά PL/SQL. Το όνομα του δρομέα δεν είναι μεταβλητή - είναι το αναγνωριστικό του δείκτη στο ερώτημα. Στο όνομα του δρομέα δεν εκχωρείται τιμή και δεν μπορεί να χρησιμοποιηθεί σε εκφράσεις. Ο δρομέας χρησιμοποιείται μόνο στις εντολές OPEN, CLOSE και FETCH και για να χαρακτηρίσει το χαρακτηριστικό του δρομέα.

Δήλωση δρομέα σε πακέτο

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

ΠΑΚΕΤΟ book_info ΕΙΝΑΙ CURSOR titles_cur ΕΙΝΑΙ ΕΠΙΛΟΓΟΣ τίτλος ΑΠΟ βιβλία. CURSOR books_cur (title_filter_in IN books.title%TYPE) RETURN books%ROWTYPE IS SELECT * FROM books WHERE title LIKE title_filter_in; ΤΕΛΟΣ;

Ο πρώτος δρομέας titles_cur επιστρέφει μόνο τους τίτλους των βιβλίων. Το δεύτερο, books_cur , επιστρέφει όλες τις σειρές στον πίνακα βιβλίων όπου οι τίτλοι των βιβλίων ταιριάζουν με το μοτίβο που έχει καθοριστεί ως παράμετρος δρομέα (για παράδειγμα, "Όλα τα βιβλία που περιέχουν τη συμβολοσειρά "PL/SQL"). Σημειώστε ότι ο δεύτερος δρομέας χρησιμοποιεί μια ρήτρα RETURN που δηλώνει τη δομή δεδομένων που επιστρέφεται από την εντολή FETCH.

Οποιαδήποτε από τις ακόλουθες δομές δεδομένων μπορεί να καθοριστεί στην ενότητα RETURN:

  • Μια εγγραφή που ορίζεται με βάση μια γραμμή πίνακα δεδομένων, χρησιμοποιώντας το χαρακτηριστικό %ROWTYPE.
  • Μια καταχώρηση που ορίζεται με βάση έναν άλλο προηγουμένως δηλωμένο δρομέα, χρησιμοποιώντας επίσης το χαρακτηριστικό %rowtype.
  • Μια εγγραφή που ορίζεται από τον προγραμματιστή.

Ο αριθμός των παραστάσεων στη λίστα επιλογής του δρομέα πρέπει να ταιριάζει με τον αριθμό των στηλών στον πίνακα_όνομα εγγραφής%ROWTYPE, Kypcop%ROWTYPE ή τον τύπο εγγραφής. Οι τύποι δεδομένων των στοιχείων πρέπει επίσης να είναι συμβατοί. Για παράδειγμα, εάν το δεύτερο στοιχείο της λίστας επιλογής είναι τύπου NUMBER, τότε η δεύτερη στήλη της καταχώρισης στην ενότητα RETURN δεν μπορεί να είναι τύπου VARCHAR2 ή BOOLEAN.

Πριν μπούμε στις λεπτομέρειες της ενότητας ΕΠΙΣΤΡΟΦΗ και των πλεονεκτημάτων της, ας δούμε πρώτα τι νόημα θα είχε η δήλωση δρομέων σε ένα πακέτο; Γιατί να μην δηλώσετε έναν ρητό δρομέα στο πρόγραμμα στο οποίο χρησιμοποιείται - σε μια διαδικασία, συνάρτηση ή ανώνυμο μπλοκ;

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

Αξίζει επίσης να σκεφτείτε τη δημιουργία μιας συνάρτησης που επιστρέφει μια μεταβλητή δρομέα με βάση το REF CURSOR . Το καλούν πρόγραμμα ανακτά σειρές μέσω της μεταβλητής του δρομέα. Για περισσότερες πληροφορίες, ανατρέξτε στις μεταβλητές του δρομέα και στο REF CURSOR.

Υπάρχει ένα σημαντικό πράγμα που πρέπει να λάβετε υπόψη όταν δηλώνετε δρομείς σε επαναχρησιμοποιήσιμα πακέτα. Όλες οι δομές δεδομένων, συμπεριλαμβανομένων των δρομέων, που δηλώνονται σε "επίπεδο πακέτου" (όχι εντός συγκεκριμένης συνάρτησης ή διαδικασίας), διατηρούν τις τιμές τους σε όλη τη διάρκεια της συνεδρίας. Αυτό σημαίνει ότι ο δρομέας παρτίδας θα παραμείνει ανοιχτός μέχρι να τον κλείσετε ρητά ή μέχρι να τελειώσει η περίοδος λειτουργίας. Οι δρομείς που δηλώνονται σε τοπικά μπλοκ κλείνουν αυτόματα όταν τελειώνουν αυτά τα μπλοκ.

Τώρα ας ασχοληθούμε με την ενότητα ΕΠΙΣΤΡΟΦΗ. Η δήλωση του δρομέα σε ένα πακέτο έχει ένα ενδιαφέρον χαρακτηριστικό: ο τίτλος του δρομέα μπορεί να διαχωριστεί από το σώμα του. Μια τέτοια κεφαλίδα, περισσότερο σαν κεφαλίδα συνάρτησης, περιέχει πληροφορίες που χρειάζεται ο προγραμματιστής για να εργαστεί: το όνομα του δρομέα, τις παραμέτρους του και τον τύπο των δεδομένων που επιστρέφονται. Το σώμα του δρομέα είναι η πρόταση SELECT. Αυτή η τεχνική παρουσιάζεται στη νέα έκδοση της δήλωσης δρομέα books_cur στο πακέτο book_info:

PACKAGE book_info ΕΙΝΑΙ CURSOR books_cur (title_filter_in IN books.title%TYPE) RETURN books%ROWTYPE; ΤΕΛΟΣ; PACKAGE BODY book_info IS CURSOR books_cur (title_filter_in IN books.title%TYPE) ΕΠΙΣΤΡΟΦΗ βιβλίων%ROWTYPE IS SELECT * FROM books WHERE title LIKE title_filter_in; ΤΕΛΟΣ;

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

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

Άνοιγμα ρητού δρομέα

Η χρήση ενός δρομέα ξεκινά με τον ορισμό του στην ενότητα δήλωση. Στη συνέχεια, ο δηλωμένος δρομέας πρέπει να ανοίξει. Η σύνταξη της δήλωσης OPEN είναι πολύ απλή:

OPEN cursor_name [ (όρισμα [, όρισμα...]) ];

Εδώ το όνομα του δρομέα είναι το όνομα του προηγουμένως δηλωμένου δρομέα και το όρισμα είναι η τιμή που μεταβιβάζεται στον δρομέα εάν δηλώνεται με μια λίστα παραμέτρων.

Η Oracle υποστηρίζει επίσης τη σύνταξη FOR κατά το άνοιγμα ενός δρομέα, η οποία χρησιμοποιείται και για τις μεταβλητές του δρομέα (δείτε Μεταβλητές δρομέα και REF CURSOR ) και για την ενσωματωμένη δυναμική SQL.

Κατά το άνοιγμα ενός δρομέα, το PL/SQL εκτελεί το ερώτημα που περιέχει. Επιπλέον, προσδιορίζει το ενεργό σύνολο δεδομένων - τις σειρές όλων των πινάκων που συμμετέχουν στο ερώτημα που ταιριάζουν με το κριτήριο WHERE και τη συνθήκη σύνδεσης. Η εντολή OPEN δεν ανακτά δεδομένα - αυτή είναι η δουλειά της εντολής FETCH.

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

Επιπλέον, εάν η πρόταση SELECT περιέχει έναν όρο ΓΙΑ ΕΝΗΜΕΡΩΣΗ, όλες οι σειρές που προσδιορίζονται από τον κέρσορα κλειδώνονται όταν ανοίγει.

Εάν προσπαθήσετε να ανοίξετε έναν ήδη ανοιχτό δρομέα, το PL/SQL θα δημιουργήσει το ακόλουθο μήνυμα σφάλματος:

ORA-06511: PL/SQL: ο κέρσορας είναι ήδη ανοιχτός

Επομένως, πριν ανοίξετε τον κέρσορα, θα πρέπει να ελέγξετε την κατάστασή του από την τιμή του χαρακτηριστικού %είναι ανοιχτό:

ΑΝ ΟΧΙ company_cur%ISOPEN ΤΟΤΕ ΑΝΟΙΞΤΕ company_cur; ΤΕΛΟΣ ΕΑΝ;

Τα σαφή χαρακτηριστικά του δρομέα περιγράφονται στην ενότητα τους παρακάτω.

Εάν ένα πρόγραμμα εκτελεί έναν βρόχο FOR χρησιμοποιώντας έναν δρομέα, αυτός ο δρομέας δεν χρειάζεται να ανοίξει ρητά (ανάκτηση δεδομένων, κλείσιμο). Ο πυρήνας PL/SQL το κάνει αυτό αυτόματα.

Ανάκτηση δεδομένων από έναν ρητό δρομέα

Η εντολή SELECT δημιουργεί έναν εικονικό πίνακα - ένα σύνολο γραμμών που ορίζονται από έναν όρο WHERE με στήλες που ορίζονται από μια λίστα στηλών SELECT. Έτσι, ο κέρσορας αντιπροσωπεύει αυτόν τον πίνακα σε ένα πρόγραμμα PL/SQL. Ο πρωταρχικός σκοπός ενός δρομέα σε προγράμματα PL/SQL είναι η ανάκτηση σειρών για επεξεργασία. Η ανάκτηση των σειρών του δρομέα γίνεται με την εντολή FETCH:

FETCH cursor_name INTO record_or_var_list;

Εδώ το όνομα δρομέα είναι το όνομα του δρομέα από τον οποίο επιλέγεται η εγγραφή και η εγγραφή ή η λίστα μεταβλητών είναι οι δομές δεδομένων PL/SQL στις οποίες αντιγράφεται η επόμενη σειρά του ενεργού συνόλου εγγραφών. Τα δεδομένα μπορούν να τοποθετηθούν σε μια εγγραφή PL/SQL (δηλωμένη με χαρακτηριστικό %ROWTYPE ή δήλωση TYPE) ή σε μεταβλητές (μεταβλητές PL/SQL ή μεταβλητές σύνδεσης - όπως στα στοιχεία Oracle Forms).

Παραδείγματα ρητών δρομέων

Τα ακόλουθα παραδείγματα δείχνουν διαφορετικούς τρόπους ανάκτησης δεδομένων.

  • Ανάκτηση δεδομένων από έναν δρομέα σε μια εγγραφή PL/SQL:
ΔΗΛΩΣΗ ΔΙΑΔΡΟΜΕΑ Η εταιρεία_cur είναι ΕΠΙΛΟΓΗ ...; company_rec company_cur%ROWTYPE; ΑΡΧΙΣΤΕ ΑΝΟΙΓΜΑ company_cur; FETCH company_cur INTO company_rec;
  • Ανάκτηση δεδομένων από έναν δρομέα σε μια μεταβλητή:
ΑΝΑΛΗΨΗ new_balance_cur ΣΕ new_balance_dollars.
  • Ανάκτηση δεδομένων από έναν δρομέα σε μια γραμμή πίνακα PL/SQL, μια μεταβλητή και μια μεταβλητή δέσμευσης Oracle Forms:
FETCH emp_name_cur INTO emp_name(1), hiredate, :dept.min_salary;

Τα δεδομένα που λαμβάνονται από έναν δρομέα πρέπει πάντα να τοποθετούνται σε μια εγγραφή που δηλώνεται με βάση τον ίδιο δρομέα με το χαρακτηριστικό %ROWTYPE. αποφύγετε την ανάκτηση σε λίστες μεταβλητών. Το Fetch-to-record κάνει τον κώδικα πιο συμπαγή και ευέλικτο, σας επιτρέπει να αλλάξετε τη λίστα ανάκτησης χωρίς να αλλάξετε την εντολή FETCH.

Λήψη μετά την επεξεργασία της τελευταίας σειράς

Όταν ανοίγετε έναν δρομέα, επιλέγετε σειρές από αυτόν μία προς μία μέχρι να εξαντληθούν όλες. Ωστόσο, μπορείτε να εκτελέσετε την εντολή FETCH μετά από αυτό.

Παραδόξως, το PL/SQL δεν κάνει εξαίρεση σε αυτήν την περίπτωση. Απλώς δεν κάνει τίποτα. Δεδομένου ότι δεν υπάρχει τίποτα άλλο για επιλογή, οι τιμές των μεταβλητών στην ενότητα INTO της εντολής FETCH δεν αλλάζουν. Με άλλα λόγια, η εντολή FETCH δεν ορίζει αυτές τις μεταβλητές σε NULL.

Ρητά ψευδώνυμα στηλών δρομέα

Η εντολή SELECT σε μια δήλωση δρομέα ορίζει τη λίστα των στηλών που επιστρέφει. Μαζί με τα ονόματα στηλών πίνακα, αυτή η λίστα μπορεί να περιέχει εκφράσεις που ονομάζονται υπολογισμένες ή εικονικές στήλες.

Το ψευδώνυμο στήλης είναι ένα εναλλακτικό όνομα που καθορίζεται σε μια εντολή SELECT για μια στήλη ή μια έκφραση. Καθορίζοντας κατάλληλα ψευδώνυμα στο SQL*Plus , μπορείτε να εμφανίσετε τα αποτελέσματα ενός αυθαίρετου ερωτήματος σε μορφή αναγνώσιμη από τον άνθρωπο. Σε περιπτώσεις όπως αυτή, τα ψευδώνυμα είναι προαιρετικά. Από την άλλη πλευρά, όταν χρησιμοποιείτε ρητούς δρομείς, απαιτούνται υπολογισμένα ψευδώνυμα στηλών στις ακόλουθες περιπτώσεις:

  • κατά την ανάκτηση δεδομένων από έναν δρομέα σε μια εγγραφή που δηλώνεται με το χαρακτηριστικό %ROWTYPE που βασίζεται στον ίδιο δρομέα.
  • όταν το πρόγραμμα περιέχει αναφορά σε μια υπολογιζόμενη στήλη.

Εξετάστε το ακόλουθο ερώτημα. Η εντολή SELECT επιλέγει τα ονόματα όλων των εταιρειών που παρήγγειλαν αγαθά κατά το 2001, καθώς και το συνολικό ποσό των παραγγελιών (υποθέτοντας ότι η προεπιλεγμένη μάσκα μορφής για την τρέχουσα παρουσία βάσης δεδομένων είναι ΗΗ-ΔΕΥ-ΕΕΕΕ):

SELECT company_name, SUM (inv_amt) FROM company c, invoice i WHERE c.company_id = i.company_id ΚΑΙ i.invoice_date ΜΕΤΑΞΥ "01-JAN-2001" ΚΑΙ "31-DEC-2001";

Η εκτέλεση αυτής της εντολής στο SQL*Plus θα παράγει την ακόλουθη έξοδο:

ΟΝΟΜΑ ΕΤΑΙΡΕΙΑΣ SUM (INV_AMT)
ACME TURBO INC. 1000
WASHINGTON HAIR CO. 25.20

Όπως μπορείτε να δείτε, η κεφαλίδα στήλης SUM (INV_AMT) δεν είναι κατάλληλη για μια αναφορά, αλλά είναι κατάλληλη για απλή προβολή δεδομένων. Τώρα ας εκτελέσουμε το ίδιο ερώτημα σε ένα πρόγραμμα PL/SQL χρησιμοποιώντας έναν ρητό δρομέα και ας προσθέσουμε ένα ψευδώνυμο στήλης:

ΔΗΛΩΣΤΕ CURSOR comp_cur ΕΙΝΑΙ ΕΠΙΛΕΓΜΕΝΟ c.name, SUM (inv_amt) total_sales FROM company C, invoice I WHERE C.company_id = I.company_id ΚΑΙ I.invoice_date ΜΕΤΑΞΥ "01-JAN-2001" ΚΑΙ "31-DEC-2"; comp_rec comp_cur%ROWTYPE; ΑΡΧΙΣΤΕ ΑΝΟΙΓΜΑ comp_cur; FETCH comp_cur INTO comp_rec; ΤΕΛΟΣ;

Χωρίς το ψευδώνυμο, δεν θα μπορώ να αναφέρω τη στήλη στη δομή εγγραφής comp_rec. Με δεδομένο ένα ψευδώνυμο, μπορείτε να εργαστείτε με μια υπολογιζόμενη στήλη όπως κάθε άλλη στήλη ερωτήματος:

IF comp_rec.total_sales > 5000 THEN DBMS_OUTPUT.PUT_LINE (" Έχετε υπερβεί το πιστωτικό όριο των $5000 κατά " || TO_CHAR (comp_rec.total_sales - 5000, "$9999")); ΤΕΛΟΣ ΕΑΝ;

Κατά την ανάκτηση μιας σειράς σε μια εγγραφή που δηλώνεται με το χαρακτηριστικό %ROWTYPE, η πρόσβαση στην υπολογισμένη στήλη είναι δυνατή μόνο με το όνομά της, καθώς η δομή της εγγραφής καθορίζεται από τη δομή του ίδιου του δρομέα.

Κλείσιμο ρητού δρομέα

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

Η σύνταξη για την εντολή CLOSE είναι:

ΚΛΕΙΣΙΜΟ όνομα_δρομέα.

Ακολουθούν ορισμένες σημαντικές συμβουλές και σκέψεις για το κλείσιμο των ασαφών δρομέων.

  • Εάν ένας δρομέας δηλωθεί και ανοίξει σε μια διαδικασία, μην ξεχάσετε να τον κλείσετε όταν τελειώσετε με αυτόν. Διαφορετικά, ο κωδικός σας θα διαρρεύσει στη μνήμη. Θεωρητικά, ένας δρομέας (όπως κάθε δομή δεδομένων) θα πρέπει να κλείνει αυτόματα και να καταστρέφεται όταν βγει εκτός πεδίου εφαρμογής. Συνήθως, κατά την έξοδο από μια διαδικασία, μια συνάρτηση ή ένα ανώνυμο μπλοκ, το PL/SQL κλείνει στην πραγματικότητα όλους τους δρομείς που είναι ανοιχτοί σε αυτό. Ωστόσο, αυτή η διαδικασία έχει κόστος, επομένως για λόγους αποτελεσματικότητας το PL/SQL καθυστερεί μερικές φορές τον εντοπισμό και το κλείσιμο των ανοιχτών δρομέων. Οι ΔΕΡΜΕΙΣ REF, εξ ορισμού, δεν μπορούν να κλείσουν σιωπηρά. Το μόνο πράγμα για το οποίο μπορείτε να είστε σίγουροι είναι ότι όταν τερματιστεί το "εξώτατο" μπλοκ PL/SQL, όταν ο έλεγχος επιστρέφεται στην SQL ή σε άλλον καλούντα, το PL/SQL θα κλείσει σιωπηρά όλους τους δρομείς που ανοίγουν από αυτό το μπλοκ ή τα ένθετα μπλοκ, εκτός από το REF CURSOR . Το άρθρο Oracle Technology Network επαναχρησιμοποίηση δρομέα σε στατική SQL PL/SQL παρέχει μια λεπτομερή ανάλυση του πώς και πότε το PL/SQL κλείνει τους δρομείς. Τα ένθετα ανώνυμα μπλοκ είναι ένα παράδειγμα μιας κατάστασης στην οποία η PL/SQL δεν κλείνει σιωπηρά τους δρομείς. Για μερικές ενδιαφέρουσες πληροφορίες σχετικά με αυτό το θέμα, δείτε το άρθρο του Jonathan Gennick "Does PL/SQL Close Implicitly Cursors?".
  • Εάν ένας δρομέας δηλωθεί σε ένα πακέτο σε επίπεδο πακέτου και ανοίξει σε κάποιο μπλοκ ή πρόγραμμα, θα παραμείνει ανοιχτός μέχρι να τον κλείσετε ρητά ή μέχρι να τελειώσει η περίοδος λειτουργίας. Επομένως, όταν ολοκληρώσετε την εργασία με έναν δρομέα σε επίπεδο παρτίδας, θα πρέπει να τον κλείσετε αμέσως με την εντολή CLOSE (και παρεμπιπτόντως, θα πρέπει να κάνετε το ίδιο στην ενότητα εξαίρεσης):
ΑΡΧΙΣΤΕ ΑΝΟΙΓΜΑ my_package.my_cursor; ... Εργασία με τον κέρσορα CLOSE my_package.my_cursor; ΕΞΑΙΡΕΣΗ ΟΤΑΝ ΑΛΛΟΙ ΤΟΤΕ ΑΝ mypackage.my_cursor%ISOPEN ΤΟΤΕ ΚΛΕΙΣΤΕ my_package.my_cursor; ΤΕΛΟΣ ΕΑΝ; ΤΕΛΟΣ;
  • Ένας δρομέας μπορεί να κλείσει μόνο εάν ήταν προηγουμένως ανοιχτός. Διαφορετικά, θα δημιουργηθεί μια εξαίρεση INVALID_CURS0R. Η κατάσταση του δρομέα ελέγχεται χρησιμοποιώντας το χαρακτηριστικό %ISOPEN:
ΑΝ company_cur%ISOPEN ΤΟΤΕ ΚΛΕΙΣΤΕ company_cur; ΤΕΛΟΣ ΕΑΝ;
  • Εάν απομένουν πάρα πολλοί ανοιχτοί δρομείς στο πρόγραμμα, ο αριθμός τους μπορεί να υπερβαίνει την τιμή της παραμέτρου βάσης δεδομένων OPEN_CURSORS. Όταν λαμβάνετε ένα μήνυμα σφάλματος, το πρώτο πράγμα που πρέπει να κάνετε είναι να βεβαιωθείτε ότι οι δρομείς που δηλώνονται σε πακέτα είναι κλειστοί όταν δεν χρειάζονται πλέον.

Σαφείς ιδιότητες δρομέα

Η Oracle υποστηρίζει τέσσερα χαρακτηριστικά (%FOUND, %NOTFOUND, %ISOPEN, %ROWCOUNTM) για τη λήψη πληροφοριών σχετικά με την κατάσταση ενός ρητού δρομέα. Μια αναφορά χαρακτηριστικού έχει την ακόλουθη σύνταξη: cursor%attribute

Εδώ δρομέας είναι το όνομα του δηλωμένου δρομέα.

Οι τιμές που επιστρέφονται από τα σαφή χαρακτηριστικά του δρομέα φαίνονται στον Πίνακα 1. 1.

Τραπέζι 1.Σαφείς ιδιότητες δρομέα

Οι τιμές των χαρακτηριστικών του δρομέα πριν και μετά την εκτέλεση διαφόρων λειτουργιών με αυτά εμφανίζονται στον Πίνακα. 2.

Όταν εργάζεστε με ξεκάθαρα χαρακτηριστικά δρομέα, έχετε υπόψη τα εξής:

  • Εάν προσπαθήσετε να αποκτήσετε πρόσβαση στο χαρακτηριστικό %FOUND, %NOTFOUND ή %ROWCOUNT πριν ανοίξει ο δρομέας ή μετά το κλείσιμο του, η Oracle δημιουργεί μια εξαίρεση ΜΗ ΕΓΚΥΡΟΥ ΔΡΟΜΕΑ (ORA-01001).
  • Εάν το σύνολο σειρών αποτελέσματος είναι κενό μετά την πρώτη εκτέλεση της εντολής FETCH, τα χαρακτηριστικά του δρομέα επιστρέφουν τις ακόλουθες τιμές: %FOUND = FALSE , %NOTFOUND = TRUE και %ROWCOUNT = 0.
  • Όταν χρησιμοποιείτε Μαζική ΣΥΛΛΟΓΗ, το χαρακτηριστικό %ROWCOUNT επιστρέφει τον αριθμό των σειρών που ανακτήθηκαν στις δεδομένες συλλογές.

Πίνακας 2.Τιμές χαρακτηριστικών δρομέα

Λειτουργία %ΒΡΕΘΗΚΑΝ %ΔΕΝ ΒΡΕΘΗΚΕ %ΕΙΝΑΙ ΑΝΟΙΧΤΟ %ROWCOUNT
Πριν ΑΝΟΙΞΕΙ Εξαίρεση
ORA-01001
Εξαίρεση
ORA-01001
ΨΕΥΔΗΣ Εξαίρεση
ORA-01001
Μετά το OPEN ΜΗΔΕΝΙΚΟ ΜΗΔΕΝΙΚΟ ΑΛΗΘΗΣ 0
Πριν από το πρώτο FETCH ΜΗΔΕΝΙΚΟ ΜΗΔΕΝΙΚΟ ΑΛΗΘΗΣ 0
Μετά το πρώτο δείγμα
ΦΕΡΩ
ΑΛΗΘΗΣ ΨΕΥΔΗΣ ΑΛΗΘΗΣ 1
Πριν από το επόμενο
ΦΕΡΩ
ΑΛΗΘΗΣ ΨΕΥΔΗΣ ΑΛΗΘΗΣ 1
Μετά την επακόλουθη ΑΝΑΛΗΨΗ ΑΛΗΘΗΣ ΨΕΥΔΗΣ ΑΛΗΘΗΣ Εξαρτάται από τα δεδομένα
Πριν από το τελευταίο FETCH ΑΛΗΘΗΣ ΨΕΥΔΗΣ ΑΛΗΘΗΣ Εξαρτάται από τα δεδομένα
Μετά το τελευταίο FETCH ΑΛΗΘΗΣ ΨΕΥΔΗΣ ΑΛΗΘΗΣ Εξαρτάται από τα δεδομένα
Πριν από το ΚΛΕΙΣΙΜΟ ΨΕΥΔΗΣ ΑΛΗΘΗΣ ΑΛΗΘΗΣ Εξαρτάται από τα δεδομένα
Μετά το ΚΛΕΙΣΙΜΟ Εξαίρεση Εξαίρεση ΨΕΥΔΗΣ Εξαίρεση

Η χρήση όλων αυτών των χαρακτηριστικών αποδεικνύεται στο ακόλουθο παράδειγμα:

Παλαιότερα ιστολόγια έχουν δώσει επανειλημμένα παραδείγματα χρήσης παραμέτρων διαδικασιών και συναρτήσεων. Οι παράμετροι είναι ένα μέσο μετάδοσης πληροφοριών προς και από μια ενότητα προγράμματος. Όταν χρησιμοποιούνται σωστά, κάνουν τις ενότητες πιο χρήσιμες και ευέλικτες.

Το PL/SQL σάς επιτρέπει να μεταβιβάζετε παραμέτρους στους δρομείς. Εκτελούν τις ίδιες λειτουργίες με τις παραμέτρους των μονάδων του προγράμματος, καθώς και μερικές πρόσθετες.

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

Ο αριθμός των παραμέτρων του δρομέα είναι απεριόριστος. Όταν καλείται OPEN, ο κέρσορας πρέπει να ρυθμιστεί σε όλες τις παραμέτρους (εκτός από τις παραμέτρους που έχουν προεπιλεγμένες τιμές).

Πότε ένας δρομέας απαιτεί παραμέτρους; Ο γενικός κανόνας εδώ είναι ο ίδιος όπως για τις διαδικασίες και τις συναρτήσεις: εάν ο κέρσορας αναμένεται να χρησιμοποιηθεί σε διαφορετικά σημεία και με διαφορετικές τιμές στον όρο WHERE, θα πρέπει να ορίσετε μια παράμετρο για αυτόν. Ας συγκρίνουμε δρομείς με και χωρίς παράμετρο. Ένα παράδειγμα δρομέα χωρίς παραμέτρους:

CURSOR joke_cur ΕΙΝΑΙ ΕΠΙΛΟΓΗ όνομα, κατηγορία, last_used_date ΑΠΟ Ανέκδοτα.

Το σύνολο αποτελεσμάτων του δρομέα περιλαμβάνει όλες τις εγγραφές στον πίνακα αστείων. Εάν χρειαζόμαστε μόνο ένα υποσύνολο των σειρών, η ρήτρα WHERE περιλαμβάνεται στο ερώτημα:

CURSOR joke_cur ΕΙΝΑΙ ΕΠΙΛΟΓΗ όνομα, κατηγορία, last_used_date ΑΠΟ αστεία WHERE κατηγορία = "ΑΝΤΡΑΣ";

Για να ολοκληρώσουμε αυτήν την εργασία, δεν χρησιμοποιήσαμε παραμέτρους και δεν χρειάζονται. Σε αυτήν την περίπτωση, ο κέρσορας επιστρέφει όλες τις σειρές που ανήκουν σε μια συγκεκριμένη κατηγορία. Τι γίνεται όμως αν η κατηγορία αλλάζει κάθε φορά που γίνεται πρόσβαση σε αυτόν τον κέρσορα;

Δρομείς με παραμέτρους

Φυσικά, δεν θα ορίσουμε ξεχωριστό δρομέα για κάθε κατηγορία - αυτό είναι εντελώς ασυνεπές με την αρχή της ανάπτυξης εφαρμογών που βασίζονται σε δεδομένα. Χρειαζόμαστε μόνο έναν δρομέα, αλλά έναν για τον οποίο θα μπορούσαμε να αλλάξουμε την κατηγορία - και θα επέστρεφε τις απαιτούμενες πληροφορίες. Και η καλύτερη (αν και όχι η μόνη) λύση σε αυτό το πρόβλημα είναι να ορίσετε έναν παραμετροποιημένο δρομέα:

ΔΙΑΔΙΚΑΣΙΑ εξηγώ_ανέκδοτο (κύρια_κατηγορία_σε ΣΕ joke_category.category_id%TYPE) ΕΙΝΑΙ /* || Δρομέας με λίστα παραμέτρων που αποτελείται από || από μία παράμετρο συμβολοσειράς. */ CURSOR joke_cur (category_in IN VARCHAR2) IS SELECT name, category, last_used_date FROM Joke WHERE κατηγορία = UPPER (category_in); joke_rec joke_cur%ROWTYPE; BEGIN /* Τώρα ένα όρισμα περνά στον κέρσορα όταν ανοίγει */ OPEN joke_cur (main_category_in); ΑΝΑΛΗΨΗ joke_cur ΣΕ joke_rec;

Υπάρχει τώρα μια λίστα επιλογών μεταξύ του ονόματος του δρομέα και της λέξης-κλειδιού IS. Η κωδικοποιημένη τιμή HUSBAND στην ρήτρα WHERE έχει αντικατασταθεί με αναφορά στην παράμετρο UPPER (κατηγορία_σε). Όταν ανοίγετε τον κέρσορα, μπορείτε να ορίσετε την τιμή σε HUSBAND , σύζυγος ή HuSbAnD - ο κέρσορας θα εξακολουθεί να λειτουργεί. Το όνομα της κατηγορίας για την οποία ο κέρσορας πρέπει να επιστρέψει τις σειρές του πίνακα αστείων καθορίζεται στην πρόταση OPEN (σε παρένθεση) ως κυριολεκτική, σταθερά ή έκφραση. Τη στιγμή που ανοίγει ο κέρσορας, γίνεται ανάλυση της εντολής SELECT και η παράμετρος συσχετίζεται με την τιμή. Στη συνέχεια ορίζεται το σύνολο των σειρών αποτελεσμάτων - και ο δρομέας είναι έτοιμος για ανάκτηση.

Άνοιγμα δρομέα με παραμέτρους

Ένας νέος δρομέας μπορεί να ανοίξει με οποιαδήποτε κατηγορία:

OPEN joke_cur(Jokes_pkg.category); OPEN joke_cur("σύζυγος"); OPEN joke_cur("πολιτικός"); OPEN joke_cur(Jokes_pkg.relation || "-IN-LAW");

Οι παράμετροι του δρομέα χρησιμοποιούνται πιο συχνά στον όρο WHERE, αλλά μπορούν να αναφέρονται αλλού στη δήλωση SELECT:

DECLARE CURSOR joke_cur(category_in IN ARCHAR2) IS SELECT name, category_in, last_used_date FROM joke WHERE κατηγορία = UPPER(category_in);

Αντί να διαβάζουμε την κατηγορία από τον πίνακα, απλώς αντικαθιστούμε την παράμετρο category_in στη λίστα επιλογής. Το αποτέλεσμα παραμένει το ίδιο επειδή η ρήτρα WHERE περιορίζει την κατηγορία επιλογής στην τιμή της παραμέτρου.

Εύρος παραμέτρου δρομέα

Το εύρος μιας παραμέτρου δρομέα περιορίζεται σε αυτόν τον κέρσορα. Δεν είναι δυνατή η αναφορά μιας παραμέτρου δρομέα εκτός της εντολής SELECT που σχετίζεται με τον κέρσορα. Το παρακάτω απόσπασμα PL/SQL δεν μεταγλωττίζεται επειδή το όνομα_προγράμματος δεν είναι τοπική μεταβλητή στο μπλοκ. Αυτή είναι μια επίσημη παράμετρος δρομέα που ορίζεται μόνο μέσα στον κέρσορα:

ΔΗΛΩΣΤΕ CURSOR scariness_cur (program_name VARCHAR2) IS SELECT SUM (scary_level) total_scary_level FROM tales_from_the_crypt WHERE prog_name = program_name; BEGIN program_name:= "Η ΑΝΑΠΝΟΗ ΜΟΥΜΙΑ"; /* Μη έγκυρη αναφορά */ OPEN scariness_cur (program_name); .... ΚΛΕΙΣΙΜΟ scariness_cur; ΤΕΛΟΣ;

Λειτουργίες παραμέτρων δρομέα

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

Προεπιλεγμένες τιμές παραμέτρων

Στις παραμέτρους του δρομέα μπορούν να εκχωρηθούν προεπιλεγμένες τιμές. Παράδειγμα δρομέα με προεπιλεγμένη τιμή παραμέτρου:

CURSOR emp_cur (emp_id_in ΑΡΙΘΜΟΣ:= 0) ΕΙΝΑΙ SELECT staff_id, emp_name FROM υπάλληλος WHERE staff_id = emp_id_in;

Επειδή η παράμετρος emp_id_in έχει μια προεπιλεγμένη τιμή, μπορείτε να παραλείψετε την τιμή της στην εντολή FETCH. Σε αυτήν την περίπτωση, ο κέρσορας θα επιστρέψει πληροφορίες για τον υπάλληλο με κωδικό 0.

Η εντολή DECLARE CURSOR σας επιτρέπει να ανακτήσετε εγγραφές σειρά προς σειρά από έναν πίνακα για χειρισμό. Αυτό επιτρέπει την επεξεργασία σειρά προς σειρά αντί για την παραδοσιακή επεξεργασία δεδομένων που κάνει η SQL.

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

Ο κέρσορας δημιουργείται με την εντολή DECLARE. Ο κέρσορας ανοίγει με την εντολή OPEN.

Οι λειτουργίες του δρομέα εκτελούνται χρησιμοποιώντας την εντολή FETCH. Ο κέρσορας κλείνει με την εντολή ΚΛΕΙΣΙΜΟ.

Η εντολή DECLARE CURSOR καθορίζει μια πρόταση SELECT. Κάθε σειρά που επιστρέφεται από μια δήλωση SELECT μπορεί να ανακτηθεί και να υποβληθεί σε επεξεργασία ξεχωριστά. Στο ακόλουθο παράδειγμα Oracle, ο δρομέας δηλώνεται σε ένα μπλοκ δήλωσης μαζί με πολλές άλλες μεταβλητές. Μετά από αυτό, στο επόμενο μπλοκ BEGIN…END, ο κέρσορας ανοίγει, γίνεται μια επιλογή σε αυτόν και ο δρομέας κλείνει.

CURSOR title_price_cursor ΕΙΝΑΙ ΕΠΙΛΟΓΟΣ τίτλος, τιμή ΑΠΟ τίτλους

ΟΠΟΥ η τιμή ΔΕΝ ΕΙΝΑΙ ΜΗΧΑΝΗ. title_price_val title_price_cursor ROWTYPE; new_price NUMBER(10,2);

OPEN title_price_Cursor;

FETCH title_price_cur-sor INTO title_price_val.

new_price:= "title_price_val.price" * 1.25 INSERT INTO new_title_price VALUES

(τίτλος_τιμή_τιμή. τίτλος, νέα_τιμή) ΚΛΕΙΣΙΜΟ Τίτλου_τιμής_δρομέα; ΤΕΛΟΣ;

Εφόσον αυτό το παράδειγμα χρησιμοποιεί PL/SQL, το μεγαλύτερο μέρος του κώδικα δεν θα εξηγηθεί σε αυτό το βιβλίο. Ωστόσο, η δήλωση του δρομέα είναι σαφώς ορατή στο μπλοκ DECLARE. Σε ένα εκτελέσιμο μπλοκ PL/SQL, ο κέρσορας αρχικοποιείται με μια δήλωση OPEN, οι τιμές ανακτώνται με μια πρόταση FETCH και, τέλος, ο δρομέας κλείνει με μια δήλωση CLOSE.

Η πρόταση SELECT είναι ο πυρήνας του δρομέα, επομένως είναι καλή πρακτική να τη δοκιμάσετε διεξοδικά πριν τη συμπεριλάβετε σε μια δήλωση DECLARE CURSOR. Η δήλωση SELECT μπορεί να λειτουργήσει σε έναν υποκείμενο πίνακα ή προβολή. Επομένως, οι δρομείς μόνο για ανάγνωση μπορούν να λειτουργούν με προβολές που δεν μπορούν να ενημερώσουν. Η πρόταση SELECT μπορεί να περιέχει ρήτρες όπως ORDER BY, GROUP BY και HAVING, εφόσον αυτές οι ρήτρες δεν ενημερώνουν τον πίνακα προέλευσης. Εάν ο κέρσορας ορίζεται ως ΓΙΑ ΕΝΗΜΕΡΩΣΗ, τότε συνιστάται να αφαιρεθούν τέτοιες ρήτρες από την πρόταση SELECT.

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

Στο ακόλουθο απλό παράδειγμα DB2, θα δηλώσουμε έναν δρομέα που αναζητά αριθμούς τμημάτων, ονόματα τμημάτων και αριθμούς διαχειριστών στην ομάδα_διαχειριστή "XO1".

DECLARE dept_cursor CURSOR

ΓΙΑ SELECT dept_nbr, dept_name, mgr_nbr

WHERE admin_group="X01"

ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ d "ept_name ASC, dept_nbr DESC, mgr_nbr DESC;

Το ακόλουθο παράδειγμα για τον Microsoft SQL Server δηλώνει και ανοίγει έναν δρομέα στον πίνακα εκδοτών. Ο κέρσορας επιλέγει την πρώτη εγγραφή από τον πίνακα εκδοτών που ταιριάζει με τη δήλωση SELECT και την εισάγει σε έναν άλλο πίνακα. Στη συνέχεια, περνά στην επόμενη εγγραφή, μετά στην επόμενη, μέχρι να υποβληθούν σε επεξεργασία όλες οι εγγραφές. Τέλος, ο κέρσορας κλείνει και η μνήμη ελευθερώνεται (η εντολή DEALLOCATE χρησιμοποιείται μόνο στον Microsoft SQL Server).

ΔΗΛΩΣΤΕ @publisher_name VARCHAR(20)

ΔΗΛΩΣΤΕ pub_cursor CURSOR FOR SELECT pub_name ΑΠΟ εκδότες WHERE χώρα "ΗΠΑ"

ΑΝΑΓΚΗ ΤΗΣ ΕΠΟΜΕΝΗΣ ΑΠΟ PUB_cursor ΣΤΟ όνομα_εκδότη

WHILE @s>FETCH_STATUS=0

INSERT INTO Foreign_publishers VALUES("j>όνομα_εκδότη)

ΚΛΕΙΣΙΜΟ pub_cursor ΑΠΟΣΤΟΛΗ pub_cursor

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

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

Σύμφωνα με το πρότυπο SQL, όταν εργάζεστε με δρομείςτα ακόλουθα κύρια Ενέργειες:

  • δημιουργία ή δήλωση δρομέα ;
  • άνοιγμα του δρομέα, εκείνοι. γεμίζοντάς το με δεδομένα που είναι αποθηκευμένα σε μνήμη πολλαπλών επιπέδων.
  • λήψη από τον κέρσοραΚαι αλλαγήμε αυτό σειρές δεδομένων?
  • κλείσιμο του δρομέα, μετά το οποίο γίνεται απρόσιτο για τα προγράμματα των χρηστών.
  • ελευθερώνοντας τον κέρσορα, δηλ. μετακίνηση δρομέαςως αντικείμενο, γιατί κλείσιμοπροαιρετικά απελευθερώνει τη μνήμη που σχετίζεται με αυτό.

Ο SQL Server υποστηρίζει τρία τύπος δρομέα:

  • δρομείςΗ SQL χρησιμοποιείται κυρίως μέσα σε εναύσματα, αποθηκευμένες διαδικασίες και σενάρια.
  • δρομείςοι διακομιστές λειτουργούν στον διακομιστή και υλοποιούν τη διεπαφή προγραμματισμού εφαρμογών για ODBC, OLE DB, DB_Library.
  • δρομείςπελάτης υλοποιούνται στον ίδιο τον πελάτη. Λαμβάνουν ολόκληρο το σύνολο αποτελεσμάτων των σειρών από τον διακομιστή και το αποθηκεύουν τοπικά, γεγονός που επιταχύνει τις λειτουργίες επεξεργασίας δεδομένων μειώνοντας τη σπατάλη των λειτουργιών δικτύου.

Έλεγχος δρομέα σε περιβάλλον MS SQL Server

Έλεγχος δρομέαυλοποιείται εκτελώντας τις ακόλουθες εντολές:

  • ΔΗΛΩΣΤΕ - δημιουργήστε ή δήλωση δρομέα ;
  • ΑΝΟΙΞΕ- άνοιγμα του δρομέα, δηλ. συμπληρώνοντάς το με δεδομένα.
  • ΦΕΡΩ- λήψη από τον κέρσοραΚαι αλλαγήσειρές δεδομένων που χρησιμοποιούν τον κέρσορα.
  • ΚΛΕΙΣΕ- κλείσιμο του δρομέα ;
  • ΑΝΑΘΕΣΗ- ελευθερώνοντας τον κέρσορα, δηλ. διαγραφή του δρομέα ως αντικείμενο.

Δήλωση δρομέα

Στο πρότυπο SQL για δημιουργία δρομέαςπαρέχεται η ακόλουθη εντολή:

<создание_курсора>::= ΔΗΛΩΣΗ δρομέα_όνομα ΔΡΟΜΕΑ ΓΙΑ SELECT_statement ])]

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



Κατά τον καθορισμό της λέξης-κλειδιού SCROLL, το παραγόμενο δρομέαςμπορεί να μετακινηθεί προς οποιαδήποτε κατεύθυνση, επιτρέποντας την εφαρμογή οποιασδήποτε εντολής δείγματα. Εάν αυτό το όρισμα παραλειφθεί, τότε δρομέαςθα είναι σταθερός, δηλ. η προβολή του θα είναι δυνατή μόνο προς μία κατεύθυνση - από την αρχή μέχρι το τέλος.

Η δήλωση SELECT καθορίζει το σώμα του ερωτήματος SELECT, το οποίο καθορίζει το σύνολο αποτελεσμάτων των σειρών δρομέας.

Όταν ορίζεται το όρισμα ΓΙΑ READ_ONLY, α δρομέαςμόνο για ανάγνωση και δεν επιτρέπονται τροποποιήσεις δεδομένων. Διαφέρει από στατικός, αν και το τελευταίο δεν σας επιτρέπει επίσης να αλλάξετε τα δεδομένα. Ως δρομέας μόνο για ανάγνωση μπορεί να δηλωθεί δυναμικός κέρσορας, το οποίο θα εμφανιστεί αλλαγέςέγινε από άλλο χρήστη.

Δημιουργία δρομέαςμε το όρισμα ΓΙΑ ΕΝΗΜΕΡΩΣΗ σας επιτρέπει να εκτελέσετε μέσα δεδομένα αλλαγής δρομέαείτε στις καθορισμένες στήλες είτε, ελλείψει του ορίσματος στήλη_όνομα OF, σε όλες τις στήλες.

Στο περιβάλλον του MS SQL Server, η ακόλουθη σύνταξη για την εντολή δημιουργίας είναι αποδεκτή δρομέας:

<создание_курсора>::= ΔΗΛΩΣΗ δρομέα_όνομα ΔΡΟΜΕΤΗ ΓΙΑ SELECT_statement ]]

Η χρήση της λέξης-κλειδιού LOCAL θα δημιουργήσει ένα τοπικό δρομέαςΈνα που είναι ορατό μόνο εντός του πακέτου, της ενεργοποίησης, της αποθηκευμένης διαδικασίας ή της συνάρτησης που καθορίζεται από το χρήστη που το δημιούργησε. Όταν ολοκληρωθεί ένα πακέτο, έναυσμα, διαδικασία ή λειτουργία δρομέαςκαταστράφηκε σιωπηρά. Για αποστολή περιεχομένου δρομέαςεκτός της κατασκευής που το δημιούργησε, πρέπει να αντιστοιχίσετε ένα όρισμα OUTPUT στην παράμετρό του.

Εάν έχει καθοριστεί η λέξη-κλειδί GLOBAL, μια καθολική δρομέας; υπάρχει μέχρι να κλείσει η τρέχουσα σύνδεση.

Ο καθορισμός FORWARD_ONLY δημιουργεί διαδοχικός δρομέας ; δειγματοληψίαΤα δεδομένα μπορούν να πραγματοποιηθούν μόνο προς την κατεύθυνση από την πρώτη γραμμή προς την τελευταία.

Ο καθορισμός του SCROLL δημιουργεί με δυνατότητα κύλισης; Τα δεδομένα μπορούν να προσπελαστούν με οποιαδήποτε σειρά και προς οποιαδήποτε κατεύθυνση.

Ο καθορισμός STATIC δημιουργεί στατικό δρομέα.

Ο καθορισμός του KEYSET δημιουργεί έναν δρομέα κλειδιού.

Ο καθορισμός του DYNAMIC δημιουργεί δυναμικός κέρσορας.

Αν για δρομέας READ_ONLY καθορίστε το όρισμα FAST_FORWARD και στη συνέχεια δημιουργήθηκε δρομέαςθα βελτιστοποιηθεί για γρήγορη πρόσβαση στα δεδομένα. Αυτό το όρισμα δεν μπορεί να χρησιμοποιηθεί σε συνδυασμό με τα ορίσματα FORWARD_ONLY και OPTIMISTIC.

ΣΕ δρομέαςπου δημιουργήθηκε με το όρισμα ΑΙΣΙΟΔΟΞΟΣ απαγορεύεται αλλαγήΚαι διαγραφή σειρώνπου άλλαξαν μετά άνοιγμα του δρομέα.

Καθορίζοντας το όρισμα TYPE_WARNING, ο διακομιστής θα ενημερώσει τον χρήστη για την σιωπηρή αλλαγή τύπου δρομέαςεάν δεν είναι συμβατό με το ερώτημα SELECT.

Άνοιγμα του κέρσορα

Για άνοιγμα του δρομέακαι συμπληρώνοντάς το με δεδομένα από τα καθορισμένα κατά τη δημιουργία δρομέαςΤο ερώτημα SELECT χρησιμοποιεί την ακόλουθη εντολή:

OPEN ((cursor_name ) |@cursor_variable_name)

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

Ανάκτηση δεδομένων από δρομέα

Αμέσως μετά άνοιγμα του δρομέαμπορείτε να επιλέξετε το περιεχόμενό του (το αποτέλεσμα του αντίστοιχου ερωτήματος) με την ακόλουθη εντολή:

ΑΝΑΓΚΗ [ ΑΠΟ ]((όνομα_δρομέα )| @cursor_variable_name ) ]

Ο καθορισμός FIRST θα επιστρέψει την πρώτη σειρά του πλήρους συνόλου αποτελεσμάτων δρομέας, που γίνεται η τρέχουσα γραμμή.

Ο καθορισμός LAST επιστρέφει την πιο πρόσφατη σειρά δρομέας. Γίνεται και η τρέχουσα γραμμή.

Ο καθορισμός NEXT επιστρέφει τη σειρά αμέσως μετά την τρέχουσα σειρά στο πλήρες σύνολο αποτελεσμάτων. Τώρα γίνεται επίκαιρο. Η εντολή FETCH χρησιμοποιεί αυτή τη μέθοδο από προεπιλογή. δείγματαγραμμές.

Η λέξη-κλειδί PRIOR επιστρέφει τη γραμμή πριν από την τρέχουσα. Γίνεται επίκαιρη.

ABSOLUTE(rownumber | @rownumbervariable) επιστρέφει μια σειρά με βάση την απόλυτη τακτική της στο πλήρες σύνολο αποτελεσμάτων δρομέας. Ο αριθμός γραμμής μπορεί να καθοριστεί χρησιμοποιώντας μια σταθερά ή ως όνομα μιας μεταβλητής που αποθηκεύει τον αριθμό γραμμής. Η μεταβλητή πρέπει να έχει έναν ακέραιο τύπο δεδομένων. Υποδεικνύονται τόσο οι θετικές όσο και οι αρνητικές τιμές. Εάν καθορίσετε μια θετική τιμή, η συμβολοσειρά μετράται από την αρχή του συνόλου, μια αρνητική τιμή - από το τέλος. Η επιλεγμένη γραμμή γίνεται η τρέχουσα γραμμή. Εάν οριστεί null, δεν επιστρέφεται καμία συμβολοσειρά.

Το όρισμα RELATIVE (line_count | @line_count_variable) επιστρέφει τη συμβολοσειρά που είναι ο καθορισμένος αριθμός γραμμών μετά την τρέχουσα. Εάν καθορίσετε μια αρνητική τιμή για τον αριθμό των γραμμών, τότε θα επιστραφεί η γραμμή που είναι ο καθορισμένος αριθμός γραμμών πριν από την τρέχουσα. Ο καθορισμός null θα επιστρέψει την τρέχουσα σειρά. Η σειρά που επιστρέφεται γίνεται η τρέχουσα.

Προς την ανοίξτε τον καθολικό δρομέα, απαιτεί τη λέξη-κλειδί GLOBAL πριν από το όνομά του. Ονομα δρομέαςμπορεί επίσης να καθοριστεί χρησιμοποιώντας μια μεταβλητή.

Η κατασκευή INTO @variable_name [,...n] καθορίζει μια λίστα μεταβλητών που θα αποθηκεύουν τις αντίστοιχες τιμές στήλης της συμβολοσειράς που επιστρέφεται. Η σειρά με την οποία καθορίζονται οι μεταβλητές πρέπει να ταιριάζει με τη σειρά των στηλών στο δρομέας, και ο τύπος δεδομένων της μεταβλητής είναι ο τύπος δεδομένων στη στήλη δρομέας. Εάν η κατασκευή INTO δεν έχει καθοριστεί, τότε η συμπεριφορά της εντολής FETCH θα μοιάζει με τη συμπεριφορά της εντολής SELECT - τα δεδομένα εμφανίζονται στην οθόνη.

Ο κέρσορας ορίζεται. Δίνεται περιγραφή των τύπων και της συμπεριφοράς του: στατικοί, δυναμικοί, διαδοχικοί και βασικοί δρομείς. Περιγράφονται οι αρχές ελέγχου του δρομέα: δημιουργία και άνοιγμα δρομέα, ανάγνωση δεδομένων, κλείσιμο δρομέα. Δίνονται παραδείγματα προγραμματισμού δρομέα.

Έννοια δρομέα

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

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

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

Σύμφωνα με το πρότυπο SQL, όταν εργάζεστε με δρομείς, μπορούν να διακριθούν οι ακόλουθες κύριες ενέργειες:

  • δημιουργία ή δήλωση δρομέα;
  • άνοιγμα του δρομέα, δηλ. γεμίζοντάς το με δεδομένα που είναι αποθηκευμένα σε μνήμη πολλαπλών επιπέδων.
  • λήψη από τον κέρσορακαι αλλαγή σειρών δεδομένων με αυτό.
  • κλείσιμο του δρομέα, μετά το οποίο γίνεται απρόσιτο για τα προγράμματα των χρηστών.
  • ελευθερώνοντας τον κέρσορα, δηλ. διαγραφή του δρομέα ως αντικείμενο, καθώς το κλείσιμό του δεν απελευθερώνει απαραίτητα τη μνήμη που σχετίζεται με αυτόν.

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

Σε ορισμένες περιπτώσεις, η χρήση δρομέα είναι αναπόφευκτη. Ωστόσο, εάν είναι δυνατόν, αυτό θα πρέπει να αποφεύγεται και να λειτουργεί με τυπικές εντολές επεξεργασίας δεδομένων: SELECT , UPDATE , INSERT , DELETE . Εκτός από το γεγονός ότι οι δρομείς δεν σας επιτρέπουν να εκτελέσετε λειτουργίες τροποποίησης σε ολόκληρο τον όγκο δεδομένων, η ταχύτητα εκτέλεσης λειτουργιών επεξεργασίας δεδομένων με χρήση δρομέα είναι αισθητά χαμηλότερη από αυτή των τυπικών εργαλείων SQL.

Υλοποίηση δρομέων σε περιβάλλον MS SQL Server

Ο SQL Server υποστηρίζει τρία είδη δρομέων:

  • Οι δρομείς SQL χρησιμοποιούνται κυρίως μέσα σε εναύσματα, αποθηκευμένες διαδικασίες και σενάρια.
  • Οι δρομείς διακομιστή λειτουργούν στον διακομιστή και υλοποιούν τη διεπαφή προγραμματισμού εφαρμογών για ODBC, OLE DB, DB_Library.
  • Οι δρομείς πελάτη εφαρμόζονται στον ίδιο τον πελάτη. Λαμβάνουν ολόκληρο το σύνολο αποτελεσμάτων των σειρών από τον διακομιστή και το αποθηκεύουν τοπικά, γεγονός που επιταχύνει τις λειτουργίες επεξεργασίας δεδομένων μειώνοντας τη σπατάλη των λειτουργιών δικτύου.

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

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

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

Ο SQL Server υποστηρίζει στατικά, δυναμικά, συνεχήςκαι ελέγχεται από ένα σύνολο πλήκτρων.

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

Εάν άλλοι χρήστες αλλάξουν τα δεδομένα που περιλαμβάνονται στον δρομέα στον πίνακα προέλευσης, αυτό δεν θα επηρεάσει το στατικό δρομέα.

ΣΕ στατικό δρομέαΔεν μπορείτε να κάνετε αλλαγές, επομένως ανοίγει πάντα σε λειτουργία μόνο για ανάγνωση.

Δυναμικός κέρσοραςδιατηρεί τα δεδομένα ζωντανά, αλλά απαιτεί πόρους δικτύου και λογισμικού. Χρησιμοποιώντας δυναμικούς δρομείςδεν δημιουργείται πλήρες αντίγραφο των δεδομένων προέλευσης, αλλά εκτελείται μια δυναμική επιλογή από τους πίνακες προέλευσης μόνο όταν ο χρήστης έχει πρόσβαση σε συγκεκριμένα δεδομένα. Κατά τη διάρκεια της ανάκτησης, ο διακομιστής κλειδώνει τις σειρές και τυχόν αλλαγές που κάνει ο χρήστης στο πλήρες σύνολο αποτελεσμάτων του δρομέα θα είναι ορατές στον κέρσορα. Ωστόσο, εάν κάποιος άλλος χρήστης έχει κάνει αλλαγές μετά την ανάκτηση των δεδομένων από τον κέρσορα, αυτές δεν θα αντικατοπτρίζονται στον κέρσορα.

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

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

Στατικοί δρομείςπαρέχει μια σταθερή προβολή των δεδομένων. Είναι καλά για συστήματα "αποθήκης" πληροφοριών: εφαρμογές για συστήματα αναφοράς ή για στατιστικούς και αναλυτικούς σκοπούς. Εκτός, στατικό δρομέακαλύτερα από άλλους αντιμετωπίζει τη δειγματοληψία μεγάλου όγκου δεδομένων. Αντίθετα, στα συστήματα ηλεκτρονικών αγορών ή κρατήσεων εισιτηρίων είναι απαραίτητη η δυναμική αντίληψη των ενημερωμένων πληροφοριών καθώς γίνονται αλλαγές. Σε τέτοιες περιπτώσεις, χρησιμοποιήστε δυναμικός κέρσορας. Σε αυτές τις εφαρμογές, ο όγκος των δεδομένων που μεταφέρονται είναι συνήθως μικρός και η πρόσβαση σε αυτά πραγματοποιείται σε επίπεδο σειρών (μεμονωμένες εγγραφές). Η ομαδική πρόσβαση είναι πολύ σπάνια.

Έλεγχος δρομέα σε περιβάλλον MS SQL Server

Έλεγχος δρομέαυλοποιείται εκτελώντας τις ακόλουθες εντολές:

  • ΔΗΛΩΣΤΕ - δημιουργήστε ή δήλωση δρομέα;
  • ΑΝΟΙΞΕ- άνοιγμα του δρομέα, δηλ. συμπληρώνοντάς το με δεδομένα.
  • ΦΕΡΩ- λήψη από τον κέρσορακαι αλλαγή σειρών δεδομένων με δρομέα.
  • ΚΛΕΙΣΕ- κλείσιμο του δρομέα;
  • ΑΝΑΘΕΣΗ- ελευθερώνοντας τον κέρσορα, δηλ. διαγραφή του δρομέα ως αντικείμενο.

Δήλωση δρομέα

Το πρότυπο SQL παρέχει την ακόλουθη εντολή για τη δημιουργία ενός δρομέα:

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

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

Η δήλωση SELECT καθορίζει το σώμα του ερωτήματος SELECT, το οποίο χρησιμοποιείται για τον προσδιορισμό του συνόλου αποτελεσμάτων των σειρών του δρομέα.

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

Η δημιουργία ενός δρομέα με ένα όρισμα ΓΙΑ ΕΝΗΜΕΡΩΣΗ σάς επιτρέπει να εκτελέσετε στον κέρσορα αλλαγή δεδομένωνείτε στις καθορισμένες στήλες, είτε, ελλείψει του ορίσματος OF στήλη_όνομα , σε όλες τις στήλες.

Στο περιβάλλον του MS SQL Server, η ακόλουθη σύνταξη για την εντολή δημιουργίας δρομέα είναι αποδεκτή:

<создание_курсора>::= ΔΗΛΩΣΗ δρομέα_όνομα ΔΡΟΜΕΤΗ ΓΙΑ SELECT_statement ]]

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

Εάν έχει καθοριστεί η λέξη-κλειδί GLOBAL, δημιουργείται ένας καθολικός δρομέας. υπάρχει μέχρι να κλείσει η τρέχουσα σύνδεση.

Ο καθορισμός FORWARD_ONLY δημιουργεί διαδοχικός δρομέας; Τα δεδομένα μπορούν να δειγματιστούν μόνο προς την κατεύθυνση από την πρώτη σειρά προς την τελευταία.

Ο καθορισμός του SCROLL δημιουργεί με δυνατότητα κύλισης; Τα δεδομένα μπορούν να προσπελαστούν με οποιαδήποτε σειρά και προς οποιαδήποτε κατεύθυνση.

Ο καθορισμός STATIC δημιουργεί στατικό δρομέα.

Ο καθορισμός του KEYSET δημιουργεί έναν δρομέα κλειδιού.

Ο καθορισμός του DYNAMIC δημιουργεί δυναμικός κέρσορας.

Εάν καθορίσετε το όρισμα FAST_FORWARD για έναν δρομέα READ_ONLY, ο δρομέας που δημιουργείται θα βελτιστοποιηθεί για γρήγορη πρόσβαση στα δεδομένα. Αυτό το όρισμα δεν μπορεί να χρησιμοποιηθεί σε συνδυασμό με τα ορίσματα FORWARD_ONLY και OPTIMISTIC.

Ένας δρομέας που δημιουργήθηκε με το όρισμα OPTIMISTIC αποτρέπει την τροποποίηση και τη διαγραφή σειρών που έχουν τροποποιηθεί από τότε άνοιγμα του δρομέα.

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

Άνοιγμα του κέρσορα

Για άνοιγμα του δρομέακαι συμπληρώνοντάς το με δεδομένα από τα καθορισμένα κατά τη δημιουργία του δρομέα ερωτήματος SELECT, χρησιμοποιείται η ακόλουθη εντολή:

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

Ανάκτηση δεδομένων από δρομέα

Αμέσως μετά άνοιγμα του δρομέαμπορείτε να επιλέξετε το περιεχόμενό του (το αποτέλεσμα του αντίστοιχου ερωτήματος) με την ακόλουθη εντολή:

Ο καθορισμός FIRST θα επιστρέψει την πρώτη σειρά του πλήρους συνόλου αποτελεσμάτων δρομέα, η οποία γίνεται η τρέχουσα σειρά.

Ο καθορισμός LAST επιστρέφει την πιο πρόσφατη σειρά του δρομέα. Γίνεται και η τρέχουσα γραμμή.

Ο καθορισμός NEXT επιστρέφει τη σειρά αμέσως μετά την τρέχουσα σειρά στο πλήρες σύνολο αποτελεσμάτων. Τώρα γίνεται επίκαιρο. Από προεπιλογή, η εντολή FETCH χρησιμοποιεί αυτήν τη μέθοδο ανάκτησης σειρών.

Η λέξη-κλειδί PRIOR επιστρέφει τη γραμμή πριν από την τρέχουσα. Γίνεται επίκαιρη.

Διαφωνία ΑΠΟΛΥΤΟ (αριθμός_γραμμής | @line_number_variable)επιστρέφει μια σειρά από την απόλυτη τακτική της στο πλήρες σύνολο αποτελεσμάτων του δρομέα. Ο αριθμός γραμμής μπορεί να καθοριστεί χρησιμοποιώντας μια σταθερά ή ως όνομα μιας μεταβλητής που αποθηκεύει τον αριθμό γραμμής. Η μεταβλητή πρέπει να έχει έναν ακέραιο τύπο δεδομένων. Υποδεικνύονται τόσο οι θετικές όσο και οι αρνητικές τιμές. Εάν καθορίσετε μια θετική τιμή, η συμβολοσειρά μετράται από την αρχή του συνόλου, μια αρνητική τιμή - από το τέλος. Η επιλεγμένη γραμμή γίνεται η τρέχουσα γραμμή. Εάν οριστεί null, δεν επιστρέφεται καμία συμβολοσειρά.

Διαφωνία ΣΧΕΤΙΚΟ (αριθμός_σειράς | @row_number_variable)επιστρέφει τη συμβολοσειρά που είναι ο καθορισμένος αριθμός γραμμών μετά την τρέχουσα. Εάν καθορίσετε μια αρνητική τιμή για τον αριθμό των γραμμών, τότε θα επιστραφεί η γραμμή που είναι ο καθορισμένος αριθμός γραμμών πριν από την τρέχουσα. Ο καθορισμός null θα επιστρέψει την τρέχουσα σειρά. Η σειρά που επιστρέφεται γίνεται η τρέχουσα.

Προς την ανοίξτε τον καθολικό δρομέα, απαιτεί τη λέξη-κλειδί GLOBAL πριν από το όνομά του. Το όνομα του δρομέα μπορεί επίσης να καθοριστεί χρησιμοποιώντας μια μεταβλητή.

Υπό κατασκευή INTO @variable_name [,...n]καθορίζεται μια λίστα μεταβλητών στην οποία θα αποθηκευτούν οι αντίστοιχες τιμές στηλών της επιστρεφόμενης σειράς. Η σειρά των μεταβλητών πρέπει να ταιριάζει με τη σειρά των στηλών στον κέρσορα και ο τύπος δεδομένων της μεταβλητής πρέπει να ταιριάζει με τον τύπο δεδομένων στη στήλη του δρομέα. Εάν η κατασκευή INTO δεν έχει καθοριστεί, τότε η συμπεριφορά της εντολής FETCH θα μοιάζει με τη συμπεριφορά της εντολής SELECT - τα δεδομένα εμφανίζονται στην οθόνη.

Αλλαγή και διαγραφή δεδομένων

Για να κάνετε αλλαγές χρησιμοποιώντας τον κέρσορα, πρέπει να εκδώσετε μια εντολή UPDATE στην ακόλουθη μορφή:

Πολλαπλές στήλες της τρέχουσας σειράς του δρομέα μπορούν να τροποποιηθούν σε μία λειτουργία, αλλά πρέπει όλες να ανήκουν στον ίδιο πίνακα.

Για να διαγράψετε δεδομένα χρησιμοποιώντας δρομέα, χρησιμοποιήστε την εντολή DELETE στην ακόλουθη μορφή:

Ως αποτέλεσμα, το ρεύμα που έχει οριστεί γραμμή στον κέρσορα θα διαγραφεί.

Κλείσιμο του δρομέα

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

Ελευθέρωση του δρομέα

Κλείσιμο του δρομέαπροαιρετικά απελευθερώνει τη μνήμη που σχετίζεται με αυτό. Σε ορισμένες υλοποιήσεις, πρέπει να το αντιστοιχίσετε ρητά με την πρόταση DEALLOCATE. Μετά ελευθερώνοντας τον κέρσοραΗ μνήμη ελευθερώνεται επίσης και το όνομα του δρομέα μπορεί να επαναχρησιμοποιηθεί.

Για να ελέγξετε πότε φτάνει στο τέλος του δρομέα, συνιστάται η χρήση της συνάρτησης: @@FETCH_STATUS

Η συνάρτηση @@FETCH_STATUS επιστρέφει:

0 εάν η ανάκτηση ήταν επιτυχής.

1 εάν η ανάκτηση απέτυχε λόγω προσπάθειας ανάκτησης μιας σειράς εκτός του δρομέα .

2 εάν η ανάκτηση απέτυχε λόγω προσπάθειας πρόσβασης σε μια διαγραμμένη ή τροποποιημένη σειρά.

DECLARE @id_kl INT, @firm VARCHAR(50), @fam VARCHAR(50), @message VARCHAR(80), @nam VARCHAR(50), @d DATETIME, @p INT, @s INT SET @s=0 PRINT " Λίστα αγορών" ΔΗΛΩΣΤΕ klient_cursor CURSOR LOCAL FOR SELECT Client ID, Company, Last Name FROM Client WHERE City="Moscow" ORDER BY Company, Last Name OPEN klient_cursor FETCH NEXT FROM klient_cursor INTO @id_kl, @firm, @fam@FAM WETCHLE =0 BEGIN SELECT @message="Customer "+@fam+ " Company "+ @firm PRINT @message SELECT @message="Όνομα προϊόντος Ημερομηνία Αγοράς Τιμή" PRINT @message DECLARE tovar_cursor CURSOR FOR SELECT Item.Name, Deal.Date, Item .Τιμή* Συναλλαγή Ποσότητα ΩΣ Κόστος ΑΠΟ ΕΜΠΟΡΕΥΜΑ ΕΣΩΤΕΡΙΚΗ ΣΥΜΜΕΤΟΧΗ Συναλλαγή ON Commodity. ItemID=Trade.ItemID WHERE Trade.CustomerID=@id_kl OPEN tovar_cursor FETCH NEXT FROM tovar_cursor INTO @nam, @d, @p IF @@FETCH_STATUS<>0 PRINT " Χωρίς αγορές" WHILE @@FETCH_STATUS=0 BEGIN SELECT @message=" "+@nam+" "+ CAST(@d AS CHAR(12))+" "+ CAST(@p AS CHAR(6)) PRINT @message SET @s=@s+@p FETCH NEXT FROM tovar_cursor INTO @nam, @d, @p END CLOSE tovar_cursor DEALLOCATE tovar_cursor SELECT @message="Συνολικό κόστος "+ CAST(@s AS CHAR(6)) PRINT @message -- μετακίνηση στον επόμενο πελάτη-- FETCH NEXT FROM klient_cursor INTO @id_kl, @firm, @fam END CLOSE klient_cursor DEALLOCATE klient_cursor Παράδειγμα 13.6. Δρομέας για την εμφάνιση μιας λίστας αγαθών που αγοράστηκαν από πελάτες από τη Μόσχα και το συνολικό κόστος τους.

Παράδειγμα 13.7.Αναπτύξτε έναν κυλιόμενο δρομέα για πελάτες από τη Μόσχα. Εάν ο αριθμός τηλεφώνου ξεκινά με 1, αφαιρέστε τον πελάτη με αυτόν τον αριθμό και στην πρώτη καταχώριση του δρομέα, αντικαταστήστε το πρώτο ψηφίο στον αριθμό τηλεφώνου με 4.

ΔΗΛΩΣΤΕ @firm VARCHAR(50), @fam VARCHAR(50), @tel VARCHAR(8), @message VARCHAR(80) PRINT " Client List" ΔΗΛΩΣΤΕ klient_cursor CURSOR GLOBAL SCROLL KEYSET FOR SELECT Company, Επίθετο, Τηλέφωνο ΑΠΟ Πελάτη ΑΠΟ Πόλη ="Μόσχα" ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ Εταιρία, Επώνυμο ΓΙΑ ΕΝΗΜΕΡΩΣΗ ΑΝΟΙΧΤΟ klient_cursor FETCH NEXT FROM klient_cursor INTO @firm, @fam, @tel WHILE @@FETCH_STATUS=0 BEGIN SELECT @message="Πελάτης "+@fam+" Εταιρεία "+@ εταιρεία " Τηλέφωνο "+ @tel PRINT @message -- εάν ο αριθμός τηλεφώνου ξεκινά με 1, -- διαγραφή πελάτη με αυτόν τον αριθμό ΑΝ @tel LIKE '1%' DELETE Client WHERE CURRENT OF klient_cursor ALSE -- μετάβαση στον επόμενο πελάτη ΑΝΑΓΚΗ ΕΠΟΜΕΝΟ ΑΠΟ klient_cursor INTO @firm, @fam, @tel END FETCH ABSOLUTE 1 FROM klient_cursor INTO @firm, @fam, @tel -- στην πρώτη καταχώριση, αντικαταστήστε το πρώτο ψηφίο στο -- αριθμό τηλεφώνου με 4 UPDATE Client SET Phone='4' + RIGHT(@ tel,LEN(@tel)-1)) WHERE CURRENT OF klient_cursor SELECT @message="Client "+@fam+" Firm "+ @firm " Phone "+ @tel PRINT @message CLOSE klient_cursor DEALLOCATE klient_cursor Παράδειγμα 13.7. Με δυνατότητα κύλισης για πελάτες από τη Μόσχα.

Παράδειγμα 13.8.Χρήση δρομέα ως παράμετρος εξόδου μιας διαδικασίας. Η διαδικασία επιστρέφει ένα σύνολο δεδομένων - μια λίστα αγαθών.

Η κλήση της διαδικασίας και η εκτύπωση δεδομένων από τον κέρσορα εξόδου εκτελούνται ως εξής:

ΔΗΛΩΣΤΕ @my_cur CURSOR ΔΗΛΩΣΤΕ @n VARCHAR(20) EXEC my_proc @cur=@my_cur ΑΝΑΓΚΗ ΕΞΟΔΟΥ ΕΠΟΜΕΝΟ ΑΠΟ @my_cur ΣΕ @n ΕΠΙΛΟΓΗ @n ΕΝΩ (@@FETCH_STATUS=0) ΑΡΧΙΣΤΕ ΛΗΨΗ ΕΠΟΜΕΝΟ ΑΠΟ @_n ΤΕΛΟΣ ΚΛΕΙΣΙΜΟ @my_cur ΑΝΑΘΕΣΗ @my_cur

1) Έννοια του δρομέα
Στη διαδραστική SQL, δεν υπάρχει διαφορά μεταξύ ερωτημάτων μονής και πολλαπλών σειρών. Στην ενσωματωμένη SQL, αυτά τα ερωτήματα εκτελούνται διαφορετικά. Τα ερωτήματα μιας γραμμής επιστρέφουν μία σειρά και το έχουμε ήδη εξετάσει. Όταν ένα ερώτημα καταλήγει σε περισσότερες από μία σειρές, η ενσωματωμένη SQL πρέπει να επιτρέπει στην εφαρμογή να ανακτά τα αποτελέσματα του ερωτήματος σειρά προς σειρά. Για αυτό, χρησιμοποιούνται δρομείς. Ο δρομέας είναι μια μεταβλητή που σχετίζεται με ένα ερώτημα. Η τιμή του είναι κάθε σειρά που ικανοποιεί το ερώτημα. Όπως και οι μεταβλητές, έτσι και οι δρομείς πρέπει να δηλωθούν για να μπορέσουν να χρησιμοποιηθούν. Σε αντίθεση με τις προβολές, οι δρομείς έχουν σχεδιαστεί για επεξεργασία γραμμή προς γραμμή.

2) Δήλωση δρομέα

ΔΗΛΩΝΩ [{}] [[ΟΧΙ] ΠΑΠΥΡΟΣ] ΔΡΟΜΕΑΣ [{ΜΕ|ΧΩΡΙΣ} ΚΡΑΤΗΣΤΕ] ΓΙΑ [ΓΙΑ {ΜΟΝΟ ΔΙΑΒΑΣΤΕ|ΕΝΗΜΕΡΩΣΗ [ΤΟΥ ]}]

3) Λέξεις-κλειδιά
. ΕΥΑΙΣΘΗΤΟ|ΑΝΕΥΑΙΣΘΗΤΟ|ΕΥΑΙΣΘΗΤΟ– οι αλλαγές στο σύνολο αποτελεσμάτων είναι ορατές | απαγορεύεται (διορθώνεται με ένα αντίγραφο του συνόλου δεδομένων)|Το ίδιο το DBMS αποφασίζει εάν θα δημιουργήσει ένα αντίγραφο (ενεργεί από προεπιλογή).
. ΜΕ|ΧΩΡΙΣ ΚΡΑΤΗΜΑ– αφήνει ανοιχτά | κλείνει τον κέρσορα εάν εμφανιστεί μια δήλωση COMMIT.
. ΠΑΠΥΡΟΣ– [απαγορεύει] την ανάκτηση σειρών αποτελεσμάτων με τυχαία σειρά.
. ΜΟΝΟ ΓΙΑ ΔΙΑΒΑΣΗ– ορίζει έναν δρομέα μόνο για ανάγνωση.
. ΓΙΑ ΕΝΗΜΕΡΩΣΗ ΤΟΥ– Αποκλείει την ενημέρωση μόνο των καθορισμένων στηλών.

4) Δήλωση δρομέα στον SQL Server

ΔΗΛΩΝΩ ΔΡΟΜΕΑΣ [ΤΟΠΙΚΟ|ΠΑΓΚΟΣΜΙΟ] [FORWARD_ONLY|ΚΥΛΙΣΗ] [STATIC|KEYSET|DYNAMIC|FAST_FORWARD] [READ_ONLY|SCROLL_LOCKS|ΑΙΣΙΟΔΟΞΗ] ΓΙΑ [ΓΙΑ ΕΝΗΜΕΡΩΣΗ [ΤΟΥ ]]

. ΣΤΑΤΙΚΟΣ– Ορίζει έναν δρομέα που δημιουργεί ένα προσωρινό αντίγραφο των δεδομένων για χρήση από τον κέρσορα. Όλα τα ερωτήματα του δρομέα αναφέρονται στον καθορισμένο προσωρινό πίνακα στο tempdb, επομένως οι αλλαγές στους πίνακες βάσης δεν επηρεάζουν τα δεδομένα που επιστρέφονται από τις επιλογές για αυτόν τον δρομέα και ο ίδιος ο κέρσορας δεν επιτρέπει αλλαγές.
. ΣΕΤ ΠΛΗΚΤΡΟ– Καθορίζει ότι η ιδιότητα μέλους ή η σειρά των σειρών στον κέρσορα δεν αλλάζει μετά το άνοιγμά του. Ένα σύνολο κλειδιών που προσδιορίζουν μοναδικά τις σειρές είναι ενσωματωμένο σε έναν πίνακα στη βάση δεδομένων tempdb με το όνομα keyset.
. ΔΥΝΑΜΙΚΟΣ– Καθορίζει έναν δρομέα που εμφανίζει όλες τις αλλαγές δεδομένων που έγιναν σε σειρές στο σύνολο αποτελεσμάτων κατά την προβολή αυτού του δρομέα. Οι τιμές δεδομένων, η σειρά και η συμμετοχή των σειρών σε κάθε δείγμα μπορεί να αλλάξουν. Η επιλογή ΑΠΟΛΥΤΗ επιλογή δεν υποστηρίζεται από δυναμικούς δρομείς.
. ΓΡΗΓΟΡΗ ΠΡΟΩΘΗΣΗ– Καθορίζει έναν δρομέα FORWARD_ONLY, READ_ONLY για τον οποίο είναι ενεργοποιημένη η βελτιστοποίηση απόδοσης. Η επιλογή FAST_FORWARD δεν μπορεί να καθοριστεί με τις επιλογές SCROLL ή FOR_UPDATE.
. SCROLL_LOCKS– Υποδεικνύει ότι οι τοποθετημένες ενημερώσεις ή διαγραφές που πραγματοποιούνται μέσω του δρομέα είναι εγγυημένα επιτυχείς. Ο SQL Server κλειδώνει τις σειρές καθώς διαβάζονται στον κέρσορα για να διασφαλίσει ότι είναι διαθέσιμες για μεταγενέστερες τροποποιήσεις. Η επιλογή SCROLL_LOCKS δεν μπορεί να καθοριστεί με την επιλογή FAST_FORWARD ή STATIC.
. ΑΙΣΙΟΔΟΞΟΣ– Καθορίζει ότι οι τοποθετημένες ενημερώσεις ή διαγραφές που γίνονται μέσω του δρομέα δεν θα εκτελούνται εάν η σειρά έχει ενημερωθεί από τότε που διαβάστηκε στον κέρσορα. Ο SQL Server δεν κλειδώνει τις σειρές καθώς διαβάζονται στον κέρσορα. Αντίθετα, μια στήλη χρονικής σήμανσης (ή άθροισμα ελέγχου εάν ο πίνακας δεν έχει στήλη χρονικής σήμανσης) συγκρίνεται για να προσδιοριστεί εάν η σειρά έχει αλλάξει από τότε που διαβάστηκε στον κέρσορα. Εάν η σειρά έχει τροποποιηθεί, τότε η τροποποίηση ή η διαγραφή της θέσης δεν είναι δυνατή. Η επιλογή OPTIMISTIC δεν μπορεί να καθοριστεί με την επιλογή FAST_FORWARD.

5) Άνοιγμα του δρομέα

6) Εξαγωγή γραμμών από τον κέρσορα

ΦΕΡΩ [{ΕΠΟΜΕΝΟ|ΠΡΟΗΓΟΥΜΕΝΟ|ΠΡΩΤΟ|ΤΕΛΕΥΤΑΙΟ|{ΑΠΟΛΥΤΟ|ΣΧΕΤΙΚΟ }}]
ΑΠΟ ΣΕ

7) Επιλογές τοποθέτησης δρομέα
. ΕΠΟΜΕΝΟ|ΠΡΟΗΓΟΥΜΕΝΟ|ΠΡΩΤΟ|ΤΕΛΕΥΤΑΙΟ– στην επόμενη|προηγούμενη|πρώτη|τελευταία σειρά του συνόλου αποτελεσμάτων.
. ΣΧΕΤΙΚΟΣ±Ν– σε μια γραμμή με θετική ή αρνητική μετατόπιση σε σχέση με την τρέχουσα γραμμή.
. ΑΠΟΛΥΤΟ±Ν– σε μια γραμμή με έναν ρητά καθορισμένο αριθμό απόλυτης θέσης από την αρχή ή το τέλος του δρομέα.

Σημείωση: Στον SQL Server, επιτρέπεται η ακέραια μεταβλητή @N αντί για N.

8) Κλείσιμο του δρομέα

9) Σημειώσεις για τους δρομείς
. Εάν ο δρομέας περιέχει περισσότερες από μία γραμμές, είναι απαραίτητο να οργανωθεί ένας βρόχος για την εξαγωγή δεδομένων από αυτόν με περιοδικό έλεγχο για να διαπιστωθεί εάν έχει επιτευχθεί η τελευταία γραμμή.
. Σε αντίθεση με τους πίνακες και τις προβολές, οι σειρές του δρομέα ταξινομούνται είτε ρητά χρησιμοποιώντας μια ενότητα ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ, ή σύμφωνα με τις συμβάσεις που έχουν εγκριθεί σε ένα συγκεκριμένο ΣΔΒΔ.
. Οι δρομείς χρησιμοποιούνται επίσης για την επιλογή ομάδων σειρών από πίνακες, οι οποίες μπορούν να ενημερώνονται ή να διαγράφονται μία κάθε φορά.
. Για να μπορεί ένας δρομέας να μπορεί να ενημερωθεί, πρέπει να πληροί τα ίδια κριτήρια με μια προβολή, δηλαδή να μην περιέχει ενότητες ΕΝΩΣΗ, ΠΑΡΑΓΓΕΛΙΑ ΑΝΑ, ΟΜΑΔΑ ΑΝΑ, ΔΙΑΚΡΙΤΙΚΟ.

10) Παράδειγμα διαγραφής δεδομένων από τον κέρσορα

exec sql δηλώνει δρομέα Cur1 για επιλογή * από τον πελάτη
όπου Βαθμολογία
// εκτύπωση (@f1+' '+convert(Varchar(5),@f2))
exec sql διαγραφή από τον πελάτη
όπου ρεύμα του Cur1; ) – Πάρτε τα δεδομένα που θέλετε να διαγράψετε από τον κέρσορα
δεν ολοκληρώθηκε - δεν έγινε:
exec sql κλείσιμο δρομέα Cur1? - κλείστε τον κέρσορα
έξοδος();

11) Παράδειγμα αυξανόμενης προμήθειας

exec sql δηλώνει δρομέα CurCust για επιλογή * από SalesPeople
όπου SNum in (επιλέξτε SNum από τον πελάτη όπου Βαθμολογία=300); - Ορισμός κέρσορα
exec sql ανοιχτό δρομέα CurCust. - Εκτελέστε τον κέρσορα
ενώ (sqlca.sqlcode==0) ( - Δημιουργήστε έναν βρόχο για να ενημερώσετε τα δεδομένα στον πίνακα
Το exec sql φέρνει το CurCust σε:Id_num, :SalesPerson, :Loc, :Comm;
Ενημερωμένη έκδοση exec sql Το SalesPeople ορίζει Comm=Comm+.01 όπου είναι τρέχον
του CurCust? ) – Τα δεδομένα προς ενημέρωση λαμβάνονται από τον κέρσορα
exec sql κλείσιμο δρομέα CurCust. - κλείστε τον κέρσορα

SELECT S.Name, MAX(S.City) AS City, SUM(O.Amt) AS Amt FROM SalesPeople S INNER JOIN Παραγγελίες O ON S.SNum=O.SNum GROUP BY S.Name ORDER BY 2

DECLARE Cur1 SCROLL CURSOR FOR SELECT S.Name, MAX(S.City) AS City, SUM(O.Amt) AS Amt FROM SalesPeople S NINER JOIN Παραγγελίες O ON S.SNum=O.SNum GROUP BY S.Name ORDER BY
ΑΝΟΙΓΜΑ Cur1
ΛΗΨΗ ΕΠΟΜΕΝΟΥ ΑΠΟ Cur1
ΕΝΩ @@FETCH_STATUS=0
ΑΡΧΙΖΟΥΝ
ΛΗΨΗ ΕΠΟΜΕΝΟΥ ΑΠΟ Cur1
ΤΕΛΟΣ
ΚΛΕΙΣΙΜΟ Cur1
ΑΝΑΘΕΣΗ Cur1

Παρόμοια άρθρα

  • Εντολή DECLARE CURSOR γενικοί κανόνες Τι είναι ο δρομέας sql

    Ένας ρητός δρομέας είναι μια δήλωση SELECT που ορίζεται ρητά στην ενότητα δήλωσης του προγράμματος. Όταν δηλώνεται ένας ρητός δρομέας, του δίνεται ένα όνομα. Για εντολές INSERT, UPDATE, MERGE και DELETE, δεν μπορούν να οριστούν ρητά δρομείς....

  • Ρωσικές μηχανές αναζήτησης

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

  • Αιτίες και θεραπείες

    Μερικές φορές το πρόγραμμα περιήγησης μπορεί να ειδοποιήσει τον χρήστη ότι παρουσιάστηκε σφάλμα σεναρίου. Αυτό ισχύει και για τον τυπικό Internet Explorer. Σε αυτό, παρεμπιπτόντως, μια τέτοια αποτυχία συμβαίνει πιο συχνά από ό, τι σε άλλα προγράμματα περιήγησης. Τι μπορεί να προκαλεί αυτό το πρόβλημα...

  • ετικέτα τίτλου - τίτλος σελίδας

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

  • Ρωσικές μηχανές αναζήτησης

    Στο Διαδίκτυο, ένας ειδικός ιστότοπος στον οποίο ο χρήστης, μετά από ένα δεδομένο αίτημα, μπορεί να λάβει συνδέσμους σε ιστότοπους που ταιριάζουν με αυτό το αίτημα. Το σύστημα αναζήτησης αποτελείται από τρία στοιχεία: 1 ρομπότ αναζήτησης. 2 ευρετήρια συστήματος. και 3...

  • Τίτλος σελίδας - τι είναι και τι πρέπει να είναι;

    Γεια σας φίλοι! Ήρθε πάλι η ώρα για χρήσιμες θεωρητικές αναρτήσεις. Και σήμερα θα ήθελα να μιλήσω για την πιο σημαντική ετικέτα - τον τίτλο. Ποιος είναι ο τίτλος της σελίδας, τι επηρεάζει, πώς να συνθέσετε σωστά τον τίτλο από την άποψη του SEO, τι μπορεί να ...