Χρήση δρομέων και βρόχων στο Transact-SQL. Δρομείς σε αποθηκευμένες διαδικασίες MySQL Δρομείς σε διακομιστή sql

Η εντολή 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

(title_price_val.title, new_price) CLOSE title_price_cursor; ΤΕΛΟΣ;

Εφόσον αυτό το παράδειγμα χρησιμοποιεί 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 Server (από το 2008). Δεδομένα SQL AzureSQL AzureParallel Data Warehouse

Καθορίζει χαρακτηριστικά ενός δρομέα από την πλευρά του διακομιστή Transact-SQL, όπως ιδιότητες αναζήτησης και το ερώτημα που χρησιμοποιείται για τη δημιουργία του συνόλου αποτελεσμάτων στο οποίο λειτουργεί ο δρομέας. Η δήλωση DECLARE CURSOR υποστηρίζει τόσο την τυπική σύνταξη ISO όσο και τη σύνταξη χρησιμοποιώντας το σετ επέκτασης γλώσσας Transact-SQL.

Σύνταξη ISO ΔΗΛΩΣΤΕ το όνομα_δρομέα [ ΑΝΕΥΑΙΣΘΗΤΟ ] [ ΚΥΛΙΣΗ ] ΔΡΟΜΕΑ ΓΙΑ select_statement [ ΓΙΑ ( ΜΟΝΟ ΔΙΑΒΑΣΗ | ΕΝΗΜΕΡΩΣΗ [ OF column_name [ ,...n ] ] ) ] [;] Transact-SQL Extended Syntax ΔΗΛΩΣΗ δρομέα_όνομα ΔΡΟΜΕΑ [ ΤΟΠΙΚΟ | ΠΑΓΚΟΣΜΙΑ ] [ FORWARD_ONLY | ΚΥΛΙΣΗ ] [ ΣΤΑΤΙΚΟ | ΣΕΤ ΠΛΗΚΤΡΟ | ΔΥΝΑΜΙΚΟ | FAST_FORWARD] [ READ_ONLY | SCROLL_LOCKS | ΑΙΣΙΟΔΟΞΗ ] [ TYPE_WARNING ] FOR select_statement [ ΓΙΑ ΕΝΗΜΕΡΩΣΗ [ OF column_name [ ,...n ] ] ] [;]

όνομα_δρομέα
όνομα_δρομέα

ΑΝΑΙΣΘΗΤΟΣ
tempdb; Ως εκ τούτου, οι αλλαγές στους πίνακες βάσης δεν αντικατοπτρίζονται στα δεδομένα που επιστρέφονται από τις επιλογές αυτού του δρομέα και αυτός ο κέρσορας δεν τροποποιείται. Κατά τη χρήση της σύνταξης ISO, εάν δεν έχει καθοριστεί η επιλογή ΑΣΑΦΗΣ, οι δεσμευμένες ενημερώσεις και οι διαγραφές που έγιναν στους πίνακες βάσης αντικατοπτρίζονται στις επόμενες επιλογές.

ΠΑΠΥΡΟΣ
Καθορίζει ότι είναι διαθέσιμες όλες οι επιλογές δειγματοληψίας (ΠΡΩΤΟ, ΤΕΛΕΥΤΑΙΟ, ΠΡΟΗΓΟΥΜΕΝΟ, ΕΠΟΜΕΝΟ, ΣΧΕΤΙΚΟ, ΑΠΟΛΥΤΟ). Εάν η δήλωση ISO DECLARE CURSOR δεν καθορίζει την επιλογή SCROLL, τότε υποστηρίζεται μόνο η επιλογή NEXT fetch. Η επιλογή SCROLL δεν μπορεί να καθοριστεί με την επιλογή FAST_FORWARD.

select_statement
Μια τυπική δήλωση SELECT που ορίζει ένα σύνολο αποτελεσμάτων δρομέα. Οι λέξεις-κλειδιά FOR Browse και INTO δεν είναι έγκυρες select_statementδήλωση δρομέα.

select_statementδιένεξη με δρομέα του ζητούμενου τύπου.

ΜΟΝΟ ΓΙΑ ΑΝΑΓΝΩΣΗ

Ενημέρωση ]
στήλη_όνομα [, .. .n] καθορίζεται, μόνο οι στήλες που αναφέρονται επιτρέπουν αλλαγές. Εάν η δήλωση UPDATE χρησιμοποιείται χωρίς λίστα στηλών, τότε η ενημέρωση είναι δυνατή για όλες τις στήλες.

όνομα_δρομέα
Το όνομα Transact-SQL του συγκεκριμένου δρομέα διακομιστή. όνομα_δρομέαπρέπει να συμμορφώνονται με τους κανόνες για τα αναγνωριστικά.

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

ΠΑΓΚΟΣΜΙΑ
Καθορίζει ότι ο κέρσορας είναι καθολικός στη σύνδεση. Το όνομα του δρομέα μπορεί να χρησιμοποιηθεί από οποιαδήποτε αποθηκευμένη διαδικασία ή πακέτο που εκτελείται στη σύνδεση. Ο κέρσορας απελευθερώνεται σιωπηρά μόνο εάν διακοπεί η σύνδεση.

FORWARD_ONLY
Καθορίζει ότι ο κέρσορας μπορεί να μετακινηθεί μόνο από την πρώτη γραμμή στην τελευταία. Υποστηρίζεται μόνο η επιλογή FETCH NEXT fetch. Εάν έχει καθοριστεί FORWARD_ONLY χωρίς τις λέξεις-κλειδιά STATIC, KEYSET ή DYNAMIC, τότε ο δρομέας συμπεριφέρεται σαν ΔΥΝΑΜΙΚΟΣ δρομέας. Εάν δεν έχει καθοριστεί ούτε το όρισμα FORWARD_ONLY ούτε το όρισμα SCROLL, το όρισμα FORWARD_ONLY χρησιμοποιείται από προεπιλογή, εκτός εάν υπάρχουν οι λέξεις-κλειδιά STATIC, KEYSET ή DYNAMIC. Οι δρομείς STATIC, KEYSET και DYNAMIC από προεπιλογή είναι SCROLL. Σε αντίθεση με τα API βάσης δεδομένων όπως το ODBC και το ADO, η λειτουργία FORWARD_ONLY υποστηρίζεται από τους ακόλουθους δρομείς γλώσσας Transact-SQL: STATIC, KEYSET και DYNAMIC.

ΣΤΑΤΙΚΟΣ
Καθορίζει έναν δρομέα που δημιουργεί ένα προσωρινό αντίγραφο των δεδομένων για χρήση από τον κέρσορα. Όλα τα ερωτήματα του δρομέα αναφέρονται στον καθορισμένο προσωρινό πίνακα στο tempdb; Ως εκ τούτου, οι αλλαγές στους πίνακες βάσης δεν αντικατοπτρίζονται στα δεδομένα που επιστρέφονται από τις επιλογές αυτού του δρομέα και αυτός ο κέρσορας δεν τροποποιείται.

ΣΕΤ ΠΛΗΚΤΡΟ
Καθορίζει ότι η ιδιότητα μέλους ή η σειρά των σειρών στον κέρσορα παραμένει αμετάβλητη όταν ανοίγει. Ένα σύνολο κλειδιών που προσδιορίζουν μοναδικά τις σειρές είναι ενσωματωμένο σε έναν πίνακα tempdbπου ονομάζεται κλειδιά.

Οι αλλαγές σε τιμές χωρίς κλειδί σε βασικούς πίνακες που έγιναν από τον κάτοχο του δρομέα ή πραγματοποιήθηκαν από άλλους χρήστες εμφανίζονται όταν ο κάτοχος προβάλλει τον κέρσορα. Οι αλλαγές που έγιναν από άλλους χρήστες δεν εμφανίζονται (οι αλλαγές δεν μπορούν να γίνουν χρησιμοποιώντας δρομέα διακομιστή Transact-SQL). Εάν μια σειρά διαγράφεται, μια προσπάθεια ανάκτησης σειρών επιστρέφει @@FETCH_STATUS -2. Οι ενημερώσεις σε τιμές κλειδιών εκτός του δρομέα είναι παρόμοιες με τη διαγραφή μιας παλιάς σειράς και στη συνέχεια την εισαγωγή μιας νέας σειράς. Η σειρά με τις νέες τιμές δεν είναι ορατή και προσπαθεί να ανακτήσει τη σειρά με τις παλιές τιμές επιστρέφει @@FETCH_STATUS -2. Οι ενημερώσεις είναι άμεσα ορατές εάν γίνονται μέσω του δρομέα χρησιμοποιώντας την πρόταση WHERE CURRENT OF.

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

ΓΡΗΓΟΡΗ ΠΡΟΩΘΗΣΗ
Καθορίζει έναν δρομέα FORWARD_ONLY, READ_ONLY για τον οποίο είναι ενεργοποιημένη η βελτιστοποίηση απόδοσης. Η επιλογή FAST_FORWARD δεν μπορεί να καθοριστεί με τις επιλογές SCROLL ή FOR_UPDATE.

ΜΟΝΟ ΓΙΑ ΑΝΑΓΝΩΣΗ
Αποτρέπει τις αλλαγές που γίνονται μέσω αυτού του δρομέα. Η πρόταση WHERE CURRENT OF δεν μπορεί να αναφέρεται σε δρομέα σε μια πρόταση ΕΝΗΜΕΡΩΣΗ ή ΔΙΑΓΡΑΦΗ. Αυτή η ρύθμιση υπερισχύει της προεπιλεγμένης δυνατότητας ενημέρωσης του δρομέα.

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

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

TYPE_WARNING
Υποδεικνύει ότι θα σταλεί μια προειδοποίηση στον πελάτη εάν ο δρομέας μετατραπεί σιωπηρά από έναν τύπο που ζητήθηκε στον άλλο.

select_statement
Μια τυπική δήλωση SELECT που ορίζει ένα σύνολο αποτελεσμάτων δρομέα. Οι λέξεις-κλειδιά COMPUTE, COMPUTE BY, FOR Browse και INTO δεν επιτρέπονται σε select_statementδήλωση δρομέα.

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

ΓΙΑ ΕΝΗΜΕΡΩΣΗ]
Καθορίζει τις στήλες με δυνατότητα ενημέρωσης στον κέρσορα. αν ΟΦ στήλη_όνομα [, ... n] παρέχεται, μόνο οι στήλες που αναφέρονται επιτρέπουν αλλαγές. Εάν χρησιμοποιείται μια δήλωση UPDATE χωρίς λίστα στηλών, η ενημέρωση είναι δυνατή για όλες τις στήλες, εκτός εάν έχει καθοριστεί η επιλογή συγχρονισμού READ_ONLY.

Η δήλωση DECLARE CURSOR ορίζει τα χαρακτηριστικά ενός δρομέα από την πλευρά του διακομιστή Transact-SQL, όπως ιδιότητες αναζήτησης και το ερώτημα που χρησιμοποιείται για τη δημιουργία του συνόλου αποτελεσμάτων στο οποίο λειτουργεί ο δρομέας. Η δήλωση OPEN συμπληρώνει το σύνολο αποτελεσμάτων και η πρόταση FETCH επιστρέφει μια σειρά από αυτό. Η δήλωση CLOSE διαγράφει το τρέχον σύνολο αποτελεσμάτων που σχετίζεται με τον κέρσορα. Η δήλωση DEALLOCATE απελευθερώνει τους πόρους που χρησιμοποιούνται από τον δρομέα.

Η πρώτη μορφή της δήλωσης DECLARE CURSOR χρησιμοποιεί σύνταξη ISO για να ορίσει τις επιλογές του δρομέα. Η δεύτερη μορφή της δήλωσης DECLARE CURSOR χρησιμοποιεί επεκτάσεις Transact-SQL για να ορίσει δρομείς χρησιμοποιώντας τους ίδιους τύπους με αυτούς που χρησιμοποιούνται σε συναρτήσεις δρομέα API βάσης δεδομένων όπως ODBC και ADO.

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

Εάν οι επιλογές READ_ONLY, OPTIMISTIC ή SCROLL_LOCKS δεν έχουν καθοριστεί για τη δήλωση DECLARE CURSOR κατά τη χρήση της σύνταξης Transact-SQL, τότε θεωρείται η ακόλουθη προεπιλεγμένη τιμή.

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

    Οι δρομείς STATIC και FAST_FORWARD από προεπιλογή είναι READ_ONLY.

    Οι δρομείς DYNAMIC και KEYSET από προεπιλογή είναι OPTIMISTIC.

Οι δρομείς μπορούν να αναφέρονται μόνο από άλλες δηλώσεις Transact-SQL. Οι συναρτήσεις API βάσης δεδομένων δεν μπορούν να αναφέρονται σε δρομείς. Για παράδειγμα, αφού έχει δηλωθεί ένας δρομέας, οι συναρτήσεις και οι μέθοδοι OLE DB, ODBC ή ADO δεν μπορούν να αναφέρονται στο όνομά του. Οι σειρές δρομέα δεν μπορούν να επιλεγούν χρησιμοποιώντας τις κατάλληλες συναρτήσεις και μεθόδους API. Για το σκοπό αυτό πρέπει να χρησιμοποιούνται δηλώσεις Transact-SQL FETCH.

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

Οι μεταβλητές μπορούν να χρησιμοποιηθούν ως μέρος select_statementΤο στο οποίο δηλώνεται ο κέρσορας. Οι τιμές των μεταβλητών του δρομέα μετά τη δήλωσή του δεν αλλάζουν.

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

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

Α. Χρήση απλού δρομέα και σύνταξης

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

ΔΗΛΩΣΗ vend_cursor CURSOR FOR SELECT * FROM Purchasing.Vendor OPEN vend_cursor FETCH NEXT FROM vend_cursor;

Β. Χρήση ένθετων δρομέων για εμφάνιση αναφοράς

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

ΕΝΕΡΓΟΠΟΙΗΣΗ NO COUNT ; ΔΗΛΩΣΤΕ @vendor_id int , @vendor_name nvarchar (50 ), @message varchar (80 ), @product nvarchar (50 );ΤΥΠΩΝΩ" -------- Αναφορά προϊόντων προμηθευτή --------"; ΔΗΛΩΣΤΕ vendor_cursor ΔΙΑΜΟΡΦΩΣΗ ΓΙΑ ΕΠΙΛΕΓΜΕΝΟ Αναγνωριστικό Προμηθευτή, Όνομα ΑΠΟ Αγορά. OPEN vendor_cursor FETCH ΕΠΟΜΕΝΟ ΑΠΟ vendor_cursor INTO @vendor_id, @vendor_name ΕΝΩ @@FETCH_STATUS = 0 BEGIN PRINT " " SELECT @message = "----- Προϊόντα από τον προμηθευτή: "+ @vendor_name PRINT @message -- Δηλώστε έναν εσωτερικό δρομέα που βασίζεται -- στο vendor_id από τον εξωτερικό δρομέα. DECLARE product_cursor CURSOR FOR SELECT v.Name FROM Purchasing.ProductVendor pv, Production.Product v WHERE pv.ProductID = v.ProductID ΚΑΙ pv.VendorID = @vendor_id -- Μεταβλητή τιμή από τον εξωτερικό δρομέα OPEN product_cursor FETCH NEXT FROM product_cursor INTO @product IF @@FETCH_STATUS<>0 ΕΚΤΥΠΩΣΗ"<>" WHILE @@FETCH_STATUS = 0 BEGIN SELECT @message = " " + @product PRINT @message FETCH NEXT FROM product_cursor INTO @product END CLOSE product_cursor product_cursor -- Λήψη του επόμενου προμηθευτή. FETCH NEXT FROM vendor_cursor INTO @vendor_ ΚΛΕΙΣΙΜΟ vendor_cursor; DEALLOCATE vendor_cursor;


Δρομέας - ένας σύνδεσμος προς την περιοχή της μνήμης περιβάλλοντος. Σε ορισμένες υλοποιήσεις της γλώσσας προγραμματισμού SQL (Oracle, Microsoft SQL Server), το σύνολο αποτελεσμάτων που προκύπτει κατά την εκτέλεση ενός ερωτήματος και ο δείκτης τρέχουσας εγγραφής που σχετίζεται με αυτό. θα έλεγε ότι ο κέρσορας είναι ένας εικονικός πίνακας που είναι ένας εναλλακτικός χώρος αποθήκευσης δεδομένων. Ταυτόχρονα, ο κέρσορας σάς επιτρέπει να έχετε πρόσβαση στα δεδομένα σας σαν να ήταν ένας κανονικός πίνακας.
Οι δρομείς χρησιμοποιούνται σε αποθηκευμένες διαδικασίες. Αρκετή θεωρία, ας δούμε ένα παράδειγμα:
Έχουμε μια βάση δεδομένων (η βάση δεδομένων δεν είναι λίγο καλή, αυτή είναι μια από τις δικές μου εργαστηριακές εργασίες, αλλά ο δάσκαλος της βάσης δεδομένων μας επέμενε σε μια τέτοια δομή)
/* τραπεζικά στοιχεία */
ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ "τράπεζα" (

`BankName` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "" ,


ΚΥΡΙΟ ΚΛΕΙΔΙ ("BankId")

)ENGINE=InnoDB
ΣΕΤ ΧΑΡΑΚΤΗΡΩΝ "utf8" ΣΥΓΚΕΝΤΡΩΣΗ "utf8_bin" ;
/*καταθέτει δεδομένα */
ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ "διανομή τράπεζας" (
«BankId» ΑΚΕΡΑΙΟΣ (11) ΟΧΙ NULL,
"Persent" INTEGER (11) DEFAULT NULL ,
`ContributeAmount` ΔΕΚΑΔΙΚΟ (10,0) ΟΧΙ ΜΗΧΑΝΟ,
«ClientId» INTEGER (11) ΟΧΙ NULL,
ΚΥΡΙΟ ΚΛΕΙΔΙ ('BankId', 'ClientId'),
KEY `BankId` (`BankId`),
KEY `ClientId` (`ClientId`),
ΠΕΡΙΟΡΙΣΜΟΣ `bankdistribution_fk` ΞΕΝΟ ΚΛΕΙΔΙ (`BankId`) ΑΝΑΦΟΡΕΣ `bank` (`BankId`),
ΠΕΡΙΟΡΙΣΜΟΣ `bankdistribution_fk1` ΞΕΝΟ ΚΛΕΙΔΙ (`ClientId`) ΑΝΑΦΟΡΕΣ `client` (`ClientId`)
)ENGINE=InnoDB
/*δεδομένα σχετικά με τους συντελεστές*/
ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ "πελάτη" (
`ClientId` ΑΚΕΡΑΙΟΣ (3) ΟΧΙ NULL AUTO_INCREMENT,
`CreditCardId` BIGINT(10) NOT NULL,
`Επώνυμο` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "" ,
`Όνομα` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "" ,
`FirstName` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "" ,
`Τηλέφωνο` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "" ,
`Διεύθυνση` VARCHAR (50) COLLATE utf8_bin NOT NULL DEFAULT "" ,
«SafeId» INTEGER (5) ΟΧΙ NULL,
ΚΥΡΙΟ ΚΛΕΙΔΙ ("ClientId", "CreditCardId"),
KEY `ClientId` (`ClientId`)

)ENGINE=InnoDB
AUTO_INCREMENT=11 ΣΕΤ ΧΑΡΑΚΤΗΡΩΝ "utf8" ΣΥΓΚΡΟΤΗΜΑ "utf8_bin"

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

Επιλέξτε «τράπεζα».* ΑΠΟ ΤΟ ΟΡΙΟ «Τράπεζα» RECORD_NUMBER_ΧΡΕΙΑΖΟΜΑΣΤΕ,1
. Έτσι, χρησιμοποιώντας LIMIT NUMBER_NECESSARY_US_RECORD,1 εξάγουμε σε βρόχο από τον πίνακα τράπεζας κάθε εγγραφή με τη σειρά και εκτελούμε τις ενέργειες που χρειαζόμαστε με αυτήν, αυξάνοντας παράλληλα την τιμή NUMBER_NECESSARY_US_RECORD κατά 1. Τώρα θα κάνουμε το ίδιο, αλλά χρησιμοποιώντας τον κέρσορα
Αρχίζουν
/* μεταβλητές όπου ανακτούμε δεδομένα */
Δήλωση ακέραιου αριθμού vBankId ;
Δήλωση vBankName VARCHAR(50);
Δήλωση vAddress VARCHAR(50);
Δήλωση vPhone VARCHAR (50);
/* μεταβλητή hadler - a*/
Δηλώστε ολοκληρωμένο ακέραιος προεπιλογή 0.
/*Δήλωση δρομέα*/
Δήλωση δρομέα BankCursor για Επιλογή `bank`.`BankId`,`bank`.`BankName`,`bank`.`Address`,`bank`.
/*Ανάθεση HANDLER, η οποία θα εξηγηθεί παρακάτω */
ΔΗΛΩΣΤΕ ΣΥΝΕΧΙΣΗ ΧΕΙΡΙΣΤΗΡΙΟΥ ΓΙΑ ΣΕΤ "02000" SQLSTATE done=1;
/* άνοιγμα κέρσορα */
OpenBankCursor;
/* εξαγωγή δεδομένων */
ΕΝΩ ολοκληρώθηκε = 0 DO

κάνουμε αυτό που πρέπει να κάνουμε
ΤΕΛΟΣ ΕΝΩ ;
/* κλείσιμο κέρσορα */
Κλείσιμο BankCursor.
ΤΕΛΟΣ ;

* Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα .

Σφάλμα: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)

Μήνυμα: Δεν υπάρχουν δεδομένα - μηδέν σειρές ανακτήθηκαν, επιλέχθηκαν ή υποβλήθηκαν σε επεξεργασία

SQLSTATE: Το 02000 ενεργοποιείται όταν φτάσει στο τέλος του δρομέα ή όταν η επιλογή ή η ενημέρωση επιστρέφει μια κενή συμβολοσειρά.

Στην επόμενη γραμμή, δηλώσαμε τον κέρσορα DECLARE cursor_name CURSOR FOR select_statement.
Άνοιγμα δρομέα Άνοιγμα cursor_name.
Περαιτέρω, μέχρι να φτάσουμε στο τέλος του δρομέα (WHILE done = 0 DO), εξάγουμε τα δεδομένα και τα επεξεργαζόμαστε.
Κλείστε τον κέρσορα πριν βγείτε από την αποθηκευμένη διαδικασία. κλείσιμο cursor_name;

Δεν φαίνεται τίποτα περίπλοκο. Υπάρχουν όμως πολλές παγίδες που σχετίζονται με το SQLSTATE "02000".

ΕΝΩ ολοκληρώθηκε = 0 DO
ΑΝΑΚΤΗΣΗ BankCursor INTO vBankId,vBankName,vAddress,vPhone.

Επιλέξτε (ContributeAmount) INTO vContributeAmountSUM FROM bankdistribute όπου BankId = vBankId όριο 1.
κάνε κάποια δράση
ΤΕΛΟΣ ΕΝΩ ;

* Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα .


Όλα είναι καλά, και σωστά από άποψη σύνταξης. Αλλά λογικά, όχι. Μπορεί να συμβεί ότι οι συνεισφέροντες δεν άνοιξαν λογαριασμούς σε καμία τράπεζα, στη συνέχεια για Select (ContributeAmount) INTO vContributeAmountSUM FROM bankdistribution όπου BankId = vBankId όριο 1. SQLSTATE: Θα ενεργοποιηθεί το 02000, η ​​μεταβλητή done θα οριστεί σε 1 και ο βρόχος while θα τελειώσει νωρίτερα από ό,τι περιμέναμε. Αυτό μπορεί να αποφευχθεί κάνοντας τα εξής
ΕΝΩ ολοκληρώθηκε = 0 DO
ΑΝΑΚΤΗΣΗ BankCursor INTO vBankId,vBankName,vAddress,vPhone.
/* εξάγει το ποσό οποιασδήποτε από τις καταθέσεις του για την τράπεζα */


εάν (vContributeAmountSUM > 0) τότε
/* εξάγει το ποσό οποιασδήποτε από τις καταθέσεις του για την τράπεζα */

τέλος εαν ;
κάνε κάποια δράση
ΤΕΛΟΣ ΕΝΩ ;

* Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα .


Με το πρώτο αίτημα, ελέγξαμε αν υπάρχουν συνεισφορές (αν δεν υπάρχουν, τότε vContributeAmountSUM == 0) και μόνο αν υπάρχουν, εξάγουμε τα δεδομένα.

Τώρα ας υποθέσουμε ότι πρέπει να ανακτήσουμε το συνολικό ποσό σε λογαριασμούς σε διαφορετικές τράπεζες για κάθε πελάτη
Δηλώστε το ClientSummCursor Cursor για Select sum

Δήλωση του δρομέα ClientSummCursor για Select sum (`bankdistribution`.`ContributeAmount`),`bankdistribution`.`ClientId` FROM `bankdistribution` Inner Join πελάτη στο (client.ClientId = bankdistribution.`ClientId`) όπου 1 ομάδα διανομής κατά ``kdistribution`. `ClientId`;

Άνοιγμα ClientSummCursor.
ΕΝΩ ολοκληρώθηκε = 0 DO
ΑΝΑΚΤΗΣΗ BankCursor INTO vBankId,vBankName,vAddress,vPhone.
/* εξάγει το ποσό οποιασδήποτε από τις καταθέσεις του για την τράπεζα */
Επιλέξτε Count(ContributeAmount) INTO vContributeAmountSUM FROM bankdistribution όπου BankId = όριο vBankId 1.
/* ελέγξτε αν υπάρχουν όντως καταθέσεις σε αυτήν την τράπεζα */
εάν (vContributeAmountSUM > 0) τότε
/* εξάγει το ποσό οποιασδήποτε από τις καταθέσεις του για την τράπεζα */
Επιλέξτε ContributeAmount INTO vContributeAmountSUM FROM bankdistribution όπου BankId = vBankId όριο 1.
τέλος εαν ;


κάνουμε κάποια δράση.
ΤΕΛΟΣ ΕΝΩ ;

* Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα .

Η ίδια κατάσταση μπορεί να συμβεί όταν τα δεδομένα στο ClientSummCursor τελειώνουν νωρίτερα από τα δεδομένα στο BankCursor, ενεργοποιείται το SQLSTATE: 02000, η ​​μεταβλητή done ορίζεται σε 1 και ο βρόχος while τελειώνει νωρίτερα από ό,τι περιμέναμε. Αυτό μπορεί να αποφευχθεί κάνοντας τα εξής

Άνοιγμα ClientSummCursor.
ΕΝΩ ολοκληρώθηκε = 0 DO
ΑΝΑΚΤΗΣΗ BankCursor INTO vBankId,vBankName,vAddress,vPhone.
/* εξάγει το ποσό οποιασδήποτε από τις καταθέσεις του για την τράπεζα */
Επιλέξτε Count(ContributeAmount) INTO vContributeAmountSUM FROM bankdistribution όπου BankId = όριο vBankId 1.
/* ελέγξτε αν υπάρχουν όντως καταθέσεις σε αυτήν την τράπεζα */
εάν (vContributeAmountSUM > 0) τότε
/* εξάγει το ποσό οποιασδήποτε από τις καταθέσεις του για την τράπεζα */
Επιλέξτε ContributeAmount INTO vContributeAmountSUM FROM bankdistribution όπου BankId = vBankId όριο 1.
τέλος εαν ;
/* πριν λάβετε δεδομένα από τον δεύτερο δρομέα, θυμηθείτε την κατάσταση του sqlstate */
SET old_status = ολοκληρωμένο.
/* εξάγουμε τα δεδομένα που χρειαζόμαστε */
FETCH ClientSummCursor INTO vSum,vClientId;
/* ελέγξτε εάν ελήφθησαν δεδομένα, εάν το sqlstate 0200 απέτυχε */
αν (ολοκληρώθηκε = 0) τότε
κάνουμε κάποια δράση.
τέλος εαν ;
/* πριν το τέλος του while, επαναφέρετε την τιμή της μεταβλητής done */
set done = old_status;
ΤΕΛΟΣ ΕΝΩ ;

* Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα .

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

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

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

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

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

Σε ορισμένες περιπτώσεις, η χρήση δρομέα είναι απαραίτητη. Ωστόσο, εάν είναι δυνατόν, θα πρέπει να αποφύγετε τη χρήση δρομέα και να εργαστείτε με τυπικές εντολές επεξεργασίας δεδομένων: ΕΠΙΛΟΓΗ, ΕΝΗΜΕΡΩΣΗ, ΕΝΙΣΧΥΣΗ, ΔΙΑΓΡΑΦΗ. Αυτό οφείλεται στο γεγονός ότι οι δρομείς δεν επιτρέπουν την αλλαγή λειτουργιών σε ολόκληρη την ποσότητα δεδομένων και η ταχύτητα των εργασιών επεξεργασίας δεδομένων με χρήση δρομέα είναι αισθητά χαμηλότερη από αυτή του τυπικά μέσα SQL.

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

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

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

Δήλωση cursor_name cursor για select_statement ])]

Αυτή η έκφραση δηλώνει δρομέα δήλωση κέρσοραμε το όνομα "cursor_name".

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

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

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

Όταν δίνετε ένα επιχείρημα ΜΟΝΟ ΓΙΑ ΔΙΑΒΑΣΗθα δημιουργηθεί ένας δρομέας μόνο για ανάγνωση και δεν επιτρέπονται τροποποιήσεις δεδομένων. Ένας δρομέας μόνο για ανάγνωση μπορεί να δηλωθεί ως δυναμικός δρομέας για να αντικατοπτρίζει τις αλλαγές που έγιναν από άλλο χρήστη.

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

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

Δρομέας ανοιχτός

Η SQL ορίζει την ακόλουθη σύνταξη για το άνοιγμα ενός δρομέα "ανοιχτός δρομέας"" :

άνοιγμα cursor_name;

Λήψη δεδομένων από δρομέα, ανάκτηση δρομέα

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

Ανάκτηση cursor_name στο var_name [, var_name] ...;

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

Κλείσιμο δρομέα, κλείσιμο κέρσορα

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

κλείσιμο cursor_name;

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

Κάθε DBMS έχει τις δικές του ιδιαιτερότητες στη χρήση δρομέα.

Δυνατότητες χρήσης δρομέων στο Oracle

Υπάρχουν τέσσερα χαρακτηριστικά δρομέα στο PL/SQL %ΒΡΕΘΗΚΑΝ, %ΔΕΝ ΒΡΕΘΗΚΕ, %ΕΙΝΑΙ ΑΝΟΙΧΤΟΚαι %ROWCOUNT. Τα χαρακτηριστικά του δρομέα δηλώνονται όπως οι προτάσεις %TYPE και %ROWTYPE, στα δεξιά του ονόματος του δρομέα.

% FOUND χαρακτηριστικό

Χαρακτηριστικό %NOTFOUND

Το χαρακτηριστικό %NOTFOUND είναι ακριβώς το αντίθετο του %FOUND.

Χαρακτηριστικό %ISOPEN

Το χαρακτηριστικό %ISOPEN υποδεικνύει μόνο εάν ο δρομέας είναι ανοιχτός ή όχι.

%ROWCOUNT χαρακτηριστικό

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

Παράδειγμα δρομέα SQL στο Oracle DBMS

Δήλωση v_id managers.id %TYPE; v_name managers.name%TYPE; v_comm managers.comm%TYPE; δρομέας crs για επιλογή αναγνωριστικού, όνομα, άθροισμα(comm) ως comm από διαχειριστές όπου τα δεδομένα μεταξύ "2014-11-01" και "2014-11-30" ομαδοποιούνται ανά αναγνωριστικό, όνομα. ξεκινήστε να ανοίγετε το crs. βρόχος ΕΞΟΔΟΣ ΟΤΑΝ crs%ΔΕΝ ΒΡΕΘΗΚΕ. FETCH crs σε v_id, v_name, v_comm; εισαγάγετε τις τιμές bonus(id, name, comm) (crs.id, crs.name, crs.comm); τελικός βρόχος? διαπράττω; Κλείσιμο crs? τέλος;

Δυνατότητες χρήσης δρομέων στον SQL Server

Οι δρομείς που χρησιμοποιούνται στο MSSQL μπορούν να είναι διαδοχικοί και με δυνατότητα κύλισης. Το Sequential σάς επιτρέπει να επιλέξετε δεδομένα μόνο προς μία κατεύθυνση - από την αρχή μέχρι το τέλος. Οι δρομείς με δυνατότητα κύλισης επιτρέπουν την κίνηση και προς τις δύο κατευθύνσεις και σας επιτρέπουν να πλοηγηθείτε σε μια αυθαίρετη σειρά στο σύνολο αποτελεσμάτων του δρομέα.

Ο SQL Server υποστηρίζει δρομείς στατικούς, δυναμικούς, διαδοχικούς και βασισμένους σε keyset.

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

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

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

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

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

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

Δήλωση cursor_name cursor για SELECT_statement ]]

Όταν χρησιμοποιείτε τη λέξη-κλειδί ΤΟΠΙΚΟΣθα δημιουργηθεί ένας τοπικός δρομέας που θα είναι ορατός μόνο σε ένα μπλοκ, ένα κανόνα, μια αποθηκευμένη διαδικασία ή μια συνάρτηση που ορίζει ο χρήστης. Λέξη-κλειδί ΠΑΓΚΟΣΜΙΑ, ορίζει έναν καθολικό δρομέα που υπάρχει μέχρι να κλείσει η τρέχουσα σύνδεση.

Χειριστής FORWARD_ONLYορίζει έναν διαδοχικό δρομέα που επιτρέπει την ανάκτηση δεδομένων μόνο προς την κατεύθυνση από την πρώτη γραμμή προς την τελευταία. Όταν χρησιμοποιείτε τον χειριστή ΠΑΠΥΡΟΣδημιουργείται ένας δρομέας με δυνατότητα κύλισης που επιτρέπει την πρόσβαση στα δεδομένα με οποιαδήποτε σειρά και προς οποιαδήποτε κατεύθυνση.

Ο τύπος του δρομέα καθορίζεται από τους τελεστές:

  • STATIC - δημιουργία στατικού δρομέα.
  • DYNAMIC - δημιουργία δυναμικού δρομέα.
  • KEYSET - δημιουργία δρομέα κλειδιού.

Αν για τον κέρσορα ΜΟΝΟ ΓΙΑ ΑΝΑΓΝΩΣΗκαθορίστε ένα όρισμα ΓΡΗΓΟΡΗ ΠΡΟΩΘΗΣΗ, τότε ο κέρσορας που δημιουργείται θα βελτιστοποιηθεί για γρήγορη πρόσβασηστα δεδομένα. Αυτό το όρισμα δεν μπορεί να χρησιμοποιηθεί σε συνδυασμό με ορίσματα FORWARD_ONLYΚαι ΑΙΣΙΟΔΟΞΟΣ.

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

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

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

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

Όταν χρησιμοποιείτε τον χειριστή ΠΡΩΤΑθα επιστραφεί η πρώτη σειρά του συνόλου αποτελεσμάτων του δρομέα, η οποία γίνεται η τρέχουσα σειρά. Όταν καθορίσετε ΤΕΛΕΥΤΑΙΟΣθα επιστραφεί η τελευταία γραμμή του δρομέα. Γίνεται και η τρέχουσα γραμμή.

Κατά τον καθορισμό ενός χειριστή ΕΠΟΜΕΝΟθα επιστραφεί η σειρά αμέσως μετά την τρέχουσα στο σύνολο αποτελεσμάτων. Αυτή η γραμμή γίνεται η τρέχουσα γραμμή. Προεπιλεγμένη εντολή ΦΕΡΩχρησιμοποιεί ακριβώς αυτόν τον τρόπο ανάκτησης σειρών.

Κατά τον καθορισμό ενός χειριστή ΠΡΙΝθα επιστραφεί η γραμμή πριν από την τρέχουσα. Αυτή η γραμμή γίνεται η τρέχουσα γραμμή.

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

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

Για να ανοίξετε έναν καθολικό δρομέα, τοποθετήστε πριν από το όνομά του μια λέξη-κλειδί ΠΑΓΚΟΣΜΙΑ. Το όνομα του δρομέα μπορεί επίσης να καθοριστεί χρησιμοποιώντας μια μεταβλητή.

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

Αλλαγή και διαγραφή δεδομένων με χρήση του δρομέα

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

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

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

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

Κατανομή μνήμης, εκχώρηση

Για να αφαιρέσετε έναν δρομέα από τη μνήμη, χρησιμοποιήστε την εντολή

Κατάθεση ονόματος_δρομέα.

Χαρακτηριστικό @@FETCH_STATUS

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

Παράδειγμα δρομέα στον SQL Server

Δηλώστε @company varchar(50), @manager varchar(50), @message varchar(256); δήλωση crs_clients δρομέα τοπικό για επιλεγμένη εταιρεία, διαχειριστής από πελάτες όπου πόλη = "Μόσχα" παραγγελία ανά εταιρεία, διαχειριστή. εκτύπωση "Λίστα πελατών"? άνοιγμα crs_clients; ανάκτηση του επόμενου από crs_clients σε @company, @manager; ενώ @@FETCH_STATUS = 0 start επιλέξτε @message = "Εταιρεία " + @company + " manager " + @manager; print@message; -- μεταβείτε στην επόμενη ανάκτηση καταχώρισης από το crs_clients στο @company, @manager. τέλος; κλείσιμο crs_clients? deallocate crs_clients;

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

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

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

Ένας δρομέας στην 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="Client" [email προστατευμένο]+ "Εταιρεία"+ @firm PRINT @message SELECT @message="Όνομα προϊόντος Ημερομηνία αγοράς Τιμή" PRINT @message ΔΗΛΩΣΤΕ tovar_cursor CURSOR FOR SELECT Item.Name, Trade.Date, Item.Price*Trade.Quantity AS Cost INNEROIN Item Συναλλαγή ΣΕ Αγαθά. ItemCode=Deal.ItemCode WHERE Deal.CustomerCode [email προστατευμένο] _kl OPEN tovar_cursor ΑΝΑΓΚΗ ΕΠΟΜΕΝΟ ΑΠΟ tovar_cursor ΣΕ @nam, @d, @p ΑΝ @@FETCH_STATUS<>0 PRINT " Χωρίς αγορές" WHILE @@FETCH_STATUS=0 BEGIN SELECT @message=" " [email προστατευμένο]+" "+ CAST(@d AS CHAR(12))+" "+ CAST(@p AS CHAR(6)) PRINT @message SET @ [email προστατευμένο][email προστατευμένο] 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 ΑΠΟ klient_cursor INTO @id_kl, @firm, @fam ΤΕΛΟΣ ΚΛΕΙΣΙΜΟ klient_cursor DEALLOCATE klient_cursor Παράδειγμα 13.6. Δρομέας για την εμφάνιση μιας λίστας αγαθών που αγοράστηκαν από πελάτες από τη Μόσχα και το συνολικό κόστος τους.

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

ΔΗΛΩΣΤΕ @firm VARCHAR(50), @fam VARCHAR(50), @tel VARCHAR(8), @message VARCHAR(80) ΕΚΤΥΠΩΣΗ "List of Clients" ΔΗΛΩΣΤΕ klient_cursor CURSOR GLOBAL SCROLL KEYSET FOR SELECT Company, Επώνυμο, Τηλέφωνο FROM WHERE City ="Moscow" ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ ΕΤΑΙΡΕΙΑ, Επώνυμο ΓΙΑ ΕΝΗΜΕΡΩΣΗ OPEN klient_cursor FETCH NEXT FROM klient_cursor INTO @firm, @fam, @tel WHILE @@FETCH_STATUS=0 BEGIN SELECT @message="Client" [email προστατευμένο]+ "Ευρώπη" [email προστατευμένο]" Τηλέφωνο "+ @tel PRINT @message -- εάν ο αριθμός τηλεφώνου ξεκινά με 1 -- διαγράψτε τον πελάτη με αυτόν τον αριθμό IF @tel LIKE '1%' DELETE Client WHERE CURRENT OF klient_cursor ALSE -- μεταβείτε στον επόμενο πελάτη FETCH NEXT FROM klient_cursor INTO @firm, @fam, @tel END FETCH ΑΠΟΛΥΤΟ 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" [email προστατευμένο]+" Εταιρεία "+ @firm " Τηλέφωνο "+ @tel PRINT @message ΚΛΕΙΣΙΜΟ klient_cursor DEALLOCATE klient_cursor Παράδειγμα 13.7. Με δυνατότητα κύλισης για πελάτες από τη Μόσχα.

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

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

ΔΗΛΩΣΤΕ @my_cur CURSOR DECLARE @n VARCHAR(20) EXEC my_proc @ [email προστατευμένο] _cur ΑΝΑΓΚΗ ΕΞΟΔΟΥ ΕΠΟΜΕΝΟ ΑΠΟ @my_cur ΣΤΟ @n ΕΠΙΛΟΓΗ @n ΕΝΩ (@@FETCH_STATUS=0) ΑΡΧΙΣΗ ΛΗΨΗ ΕΠΟΜΕΝΟ ΑΠΟ @my_cur ΣΕ @n ΕΠΙΛΟΓΗ @n ΤΕΛΟΣ ΚΛΕΙΣΙΜΟ @my_cur ΑΠΟΣΤΟΛΗ @my_cur




Μπλουζα