Δημιουργία αποθηκευμένης διαδικασίας sql. Αποθηκευμένες διαδικασίες στο περιβάλλον διακομιστή ms sql. Δημιουργία Αποθηκευμένης Διαδικασίας

Αποθηκευμένες διαδικασίες

Το θέμα αυτού του κεφαλαίου είναι ένα από τα πιο ισχυρά εργαλεία που προσφέρονται στους προγραμματιστές εφαρμογών βάσεων δεδομένων InterBase για την υλοποίηση της επιχειρηματικής λογικής.Οι αποθηκευμένες διαδικασίες (Αγγλικά, stoied proceduies) σας επιτρέπουν να εφαρμόσετε ένα σημαντικό μέρος της λογικής της εφαρμογής σε επίπεδο βάσης δεδομένων και έτσι να αυξήσετε την απόδοση ολόκληρης της εφαρμογής, συγκεντρώνουν την επεξεργασία δεδομένων και μειώνουν την ποσότητα του κώδικα που απαιτείται για την ολοκλήρωση των εργασιών που έχουν ανατεθεί.Σχεδόν κάθε αρκετά πολύπλοκη εφαρμογή βάσης δεδομένων δεν μπορεί να κάνει χωρίς τη χρήση αποθηκευμένων διαδικασιών.
Εκτός από αυτά τα γνωστά πλεονεκτήματα της χρήσης αποθηκευμένων διαδικασιών, κοινά στα περισσότερα σχεσιακά DBMS, οι αποθηκευμένες διαδικασίες InterBase μπορούν να λειτουργήσουν ως σχεδόν πλήρη σύνολα δεδομένων, επιτρέποντας στα αποτελέσματα που επιστρέφουν να χρησιμοποιηθούν σε συνηθισμένα ερωτήματα SQL.
Συχνά, οι αρχάριοι προγραμματιστές φαντάζονται τις αποθηκευμένες διαδικασίες απλώς ως ένα σύνολο συγκεκριμένων ερωτημάτων SQL που κάνουν κάτι μέσα στη βάση δεδομένων, και υπάρχει η άποψη ότι η εργασία με αποθηκευμένες διαδικασίες είναι πολύ πιο δύσκολη από την εφαρμογή της ίδιας λειτουργικότητας σε μια εφαρμογή πελάτη, σε μια εφαρμογή υψηλού επιπέδου γλώσσας επιπέδου
Ποιες είναι λοιπόν οι αποθηκευμένες διαδικασίες στο InterBase;
Μια αποθηκευμένη διαδικασία (SP) είναι ένα μέρος των μεταδεδομένων της βάσης δεδομένων, το οποίο είναι μια υπορουτίνα μεταγλωττισμένη στην εσωτερική αναπαράσταση της InterBase, γραμμένη σε μια ειδική γλώσσα, ο μεταγλωττιστής της οποίας είναι ενσωματωμένος στον πυρήνα του διακομιστή InteiBase
Μια αποθηκευμένη διαδικασία μπορεί να κληθεί από εφαρμογές πελάτη, από ενεργοποιητές και από άλλες αποθηκευμένες διαδικασίες. Η αποθηκευμένη διαδικασία εκτελείται εντός της διαδικασίας διακομιστή και μπορεί να χειριστεί δεδομένα στη βάση δεδομένων, καθώς και να επιστρέψει τα αποτελέσματα της εκτέλεσής της στον πελάτη που την κάλεσε (δηλαδή έναυσμα, HP, εφαρμογή)
Η βάση των ισχυρών δυνατοτήτων που είναι εγγενείς στην HP είναι μια διαδικαστική γλώσσα προγραμματισμού, η οποία περιλαμβάνει τόσο τροποποιημένες δηλώσεις της κανονικής SQL, όπως INSERT, UPDATE και SELECT, καθώς και εργαλεία για την οργάνωση διακλαδώσεων και βρόχων (IF, WHILE), καθώς και εργαλεία χειρισμού σφαλμάτων και εξαιρετικές καταστάσεις Η γλώσσα των αποθηκευμένων διαδικασιών σάς επιτρέπει να εφαρμόζετε πολύπλοκους αλγόριθμους για την εργασία με δεδομένα και λόγω της εστίασης στην εργασία με σχεσιακά δεδομένα, η HP είναι πολύ πιο συμπαγής από παρόμοιες διαδικασίες σε παραδοσιακές γλώσσες.
Θα πρέπει να σημειωθεί ότι η ίδια γλώσσα προγραμματισμού χρησιμοποιείται για ενεργοποιητές, με εξαίρεση μια σειρά από χαρακτηριστικά και περιορισμούς. Οι διαφορές μεταξύ του υποσυνόλου της γλώσσας που χρησιμοποιείται στους κανόνες ενεργοποίησης και της γλώσσας HP αναλύονται λεπτομερώς στο κεφάλαιο «Ενεργοποιήσεις» (μέρος 1).

Παράδειγμα απλής αποθηκευμένης διαδικασίας

Ήρθε η ώρα να δημιουργήσετε την πρώτη σας αποθηκευμένη διαδικασία και να τη χρησιμοποιήσετε ως παράδειγμα για να μάθετε τη διαδικασία δημιουργίας αποθηκευμένων διαδικασιών. Αλλά πρώτα, πρέπει να πούμε λίγα λόγια για τον τρόπο εργασίας με αποθηκευμένες διαδικασίες.Το γεγονός είναι ότι η HP οφείλει τη φήμη της ως σκοτεινό και άβολο εργαλείο σε εξαιρετικά φτωχά τυπικά εργαλεία για την ανάπτυξη και τον εντοπισμό σφαλμάτων αποθηκευμένων διαδικασιών. Η τεκμηρίωση InterBase συνιστά τη δημιουργία διαδικασιών χρησιμοποιώντας αρχεία δέσμης ενεργειών SQL που περιέχουν κείμενο HP, τα οποία παρέχονται ως είσοδος στον διερμηνέα isql, και επομένως τη δημιουργία και τροποποίηση του HP If σε αυτό το σενάριο SQL, στο στάδιο της μεταγλώττισης του κειμένου της διαδικασίας στο BLR (σχετικά BLR, ανατρέξτε στο Κεφάλαιο "Δομή βάσης δεδομένων InterBase" (Μέρος 4)) εάν παρουσιαστεί σφάλμα, το isql θα εμφανίσει ένα μήνυμα σχετικά με τη γραμμή του αρχείου δέσμης ενεργειών SQL που παρουσιάστηκε αυτό το σφάλμα. Διορθώστε το λάθος και κάντε το ξανά από την αρχή. Δεν γίνεται καθόλου λόγος για αποσφαλμάτωση με τη σύγχρονη έννοια της λέξης, δηλαδή για ιχνηλάτηση εκτέλεσης, με δυνατότητα προβολής ενδιάμεσων τιμών μεταβλητών. Προφανώς, αυτή η προσέγγιση δεν συμβάλλει στην αύξηση της ελκυστικότητας των αποθηκευμένων διαδικασιών στα μάτια του προγραμματιστή
Ωστόσο, εκτός από την τυπική μινιμαλιστική προσέγγιση για την ανάπτυξη της HP<_\ществ\ют также инструменты сторонних разработчиков, которые делают работу с хранимыми процедурами весьма удобной Большинство универсальных продуктов для работы с InterBase, перечисленных в приложении "Инструменты администратора и разработчика InterBase", предоставляют удобный инструментарий для работы с ХП. Мы рекомендуем обязательно воспользоваться одним из этих инструментов для работы с хранимыми процедурами и изложение материала будем вести в предположении, что у вас имеется удобный GUI-инструмент, избавляющий от написания традиционных SQL-скриптов
Η σύνταξη των αποθηκευμένων διαδικασιών περιγράφεται ως εξής:

Όνομα ΔΗΜΙΟΥΡΓΙΑΣ ΔΙΑΔΙΚΑΣΙΑΣ
[ (param datatype [, param datatype ...]) ]
)]
ΟΠΩΣ ΚΑΙ
;
< procedure_body> = []
< block>
< vanable_declaration_list> =
ΔΗΛΩΣΗ VARIABLE var τύπος δεδομένων.

=
ΑΡΧΙΖΟΥΝ
< compound_statement>
[< compound_statement> ...]
ΤΕΛΟΣ
< compound_statement> = (δήλωση;)

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

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ SP_Add(first_arg DOUBLE PRECISION,
second_arg ΔΙΠΛΗ ΑΚΡΙΒΕΙΑ)
ΕΠΙΣΤΡΟΦΕΣ (Αποτέλεσμα ΔΙΠΛΗ ΑΚΡΙΒΕΙΑ)
ΟΠΩΣ ΚΑΙ
ΑΡΧΙΖΟΥΝ
Αποτέλεσμα=first_arg+second_arg;
ΑΝΑΣΤΕΛΛΩ;
ΤΕΛΟΣ

Όπως μπορείτε να δείτε, όλα είναι απλά: μετά την εντολή CREATE PROCEDURE, υποδεικνύεται το όνομα της διαδικασίας που δημιουργήθηκε πρόσφατα (η οποία πρέπει να είναι μοναδική στη βάση δεδομένων) - σε αυτήν την περίπτωση SP_Add, τότε οι παράμετροι εισόδου HP - first_arg και second_arg - είναι παρατίθενται σε παρένθεση, χωρίζονται με κόμμα, υποδεικνύοντας τους τύπους τους.
Η λίστα των παραμέτρων εισαγωγής είναι προαιρετικό μέρος της δήλωσης CREATE PROCEDURE - υπάρχουν περιπτώσεις που μια διαδικασία λαμβάνει όλα τα δεδομένα για την εργασία της μέσω ερωτημάτων σε πίνακες μέσα στο σώμα της διαδικασίας.

Οι αποθηκευμένες διαδικασίες χρησιμοποιούν βαθμωτούς τύπους δεδομένων InteiBase Δεν επιτρέπει τη χρήση πινάκων και τύπων - τομέων που ορίζονται από το χρήστη

Στη συνέχεια ακολουθεί η λέξη-κλειδί RETURNS, μετά την οποία οι επιστρεφόμενες παράμετροι παρατίθενται σε παρένθεση, υποδεικνύοντας τους τύπους τους - σε αυτήν την περίπτωση, μόνο ένα - Αποτέλεσμα.
Εάν η διαδικασία δεν πρέπει να επιστρέψει παραμέτρους, τότε λείπουν η λέξη RETURNS και η λίστα με τις επιστρεφόμενες παραμέτρους.
Μετά την RETURNSQ καθορίζεται η λέξη-κλειδί AS. Πριν πάει η λέξη-κλειδί AS τίτλος,και μετά από αυτό - techoδιαδικασίες.
Το σώμα μιας αποθηκευμένης διαδικασίας είναι μια λίστα περιγραφών των εσωτερικών (τοπικών) μεταβλητών της (εάν υπάρχουν, θα τις εξετάσουμε λεπτομερέστερα παρακάτω), που χωρίζονται με ένα ερωτηματικό (;) και ένα μπλοκ εντολών που περικλείονται σε αγκύλες τελεστή ΑΡΧΗ ΤΕΛΟΣ. Σε αυτήν την περίπτωση, το σώμα του HP είναι πολύ απλό - ζητάμε να προσθέσουμε δύο ορίσματα εισόδου και να αντιστοιχίσουμε το αποτέλεσμά τους στο εξόδου και, στη συνέχεια, να καλέσουμε την εντολή SUSPEND. Λίγο αργότερα θα εξηγήσουμε την ουσία της δράσης αυτής της εντολής, αλλά προς το παρόν θα σημειώσουμε μόνο ότι χρειάζεται να μεταφέρουμε τις παραμέτρους επιστροφής από όπου κλήθηκε η αποθηκευμένη διαδικασία.

Οριοθέτες σε αποθηκευμένες διαδικασίες

Σημειώστε ότι μια δήλωση σε μια διαδικασία τελειώνει με ένα ερωτηματικό (;). Όπως γνωρίζετε, το ερωτηματικό είναι ένα τυπικό διαχωριστικό εντολών στην SQL - είναι ένα σήμα προς τον διερμηνέα SQL ότι το κείμενο της εντολής έχει εισαχθεί πλήρως και πρέπει να ξεκινήσει η επεξεργασία του. Δεν θα αποδειχτεί ότι εάν ο διερμηνέας SQL βρει ένα ερωτηματικό στη μέση της HP, θα υποθέσει ότι η εντολή έχει εισαχθεί πλήρως και θα προσπαθήσει να εκτελέσει μέρος της αποθηκευμένης διαδικασίας; Αυτή η υπόθεση δεν είναι αβάσιμη. Πράγματι, εάν δημιουργήσετε ένα αρχείο στο οποίο θα γράψετε το παραπάνω παράδειγμα, προσθέσετε μια εντολή σύνδεσης από τη βάση δεδομένων και προσπαθήσετε να εκτελέσετε αυτό το σενάριο SQL χρησιμοποιώντας τον διερμηνέα isql, θα επιστραφεί ένα σφάλμα λόγω του απροσδόκητου, κατά τη γνώμη του διερμηνέα, λήξης της εντολής δημιουργίας αποθηκευμένης διαδικασίας. Εάν δημιουργείτε αποθηκευμένες διαδικασίες χρησιμοποιώντας αρχεία δέσμης ενεργειών SQL, χωρίς τη χρήση εξειδικευμένων εργαλείων προγραμματιστή InterBase, τότε πριν από κάθε εντολή δημιουργίας HP (το ίδιο ισχύει για τους κανόνες ενεργοποίησης) πρέπει να αλλάξετε το διαχωριστικό εντολών σεναρίου σε άλλο χαρακτήρα εκτός από ερωτηματικό και μετά το κείμενο HP για να το επαναφέρεις. Η εντολή isql που αλλάζει το διαχωριστικό όρων SQL μοιάζει με αυτό:

ΟΡΙΣΜΟΣ ΟΡΟΥ

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

ΣΕΤ ΟΡΟΥ^;
CREATE PROCEDURE some_procedure
... . .
ΤΕΛΟΣ
^
ΟΡΙΣΜΟΣ ΟΡΟΥ ;^

Κλήση αποθηκευμένης διαδικασίας

Αλλά ας επιστρέψουμε στην αποθηκευμένη διαδικασία μας. Τώρα που δημιουργήθηκε, πρέπει να το καλέσετε με κάποιο τρόπο, να του περάσετε παραμέτρους και να επιστρέψετε τα αποτελέσματα. Αυτό είναι πολύ εύκολο να γίνει - απλώς γράψτε ένα ερώτημα SQL όπως αυτό:

ΕΠΙΛΟΓΗ *
FROM Sp_add(181.35, 23.09)

Αυτό το ερώτημα θα μας επιστρέψει μια γραμμή που περιέχει μόνο ένα πεδίο Αποτέλεσμα, το οποίο θα περιέχει το άθροισμα των αριθμών 181.35 και 23.09, δηλαδή 204.44.
Έτσι, η διαδικασία μας μπορεί να χρησιμοποιηθεί σε συνηθισμένα ερωτήματα SQL που εκτελούνται τόσο σε προγράμματα-πελάτες όσο και σε άλλα HP ή triggers. Αυτή η χρήση της διαδικασίας μας γίνεται δυνατή χρησιμοποιώντας την εντολή SUSPEND στο τέλος της αποθηκευμένης διαδικασίας.
Το γεγονός είναι ότι στο InterBase (και σε όλους τους κλώνους του) υπάρχουν δύο τύποι αποθηκευμένων διαδικασιών: επιλέξιμες διαδικασίες και εκτελέσιμες διαδικασίες. Η διαφορά στη λειτουργία αυτών των δύο τύπων HP είναι ότι οι διαδικασίες δειγματοληψίας συνήθως επιστρέφουν πολλά σύνολα παραμέτρων εξόδου, ομαδοποιημένα γραμμή προς γραμμή, τα οποία μοιάζουν με ένα σύνολο δεδομένων και οι εκτελέσιμες διαδικασίες είτε δεν μπορούν να επιστρέψουν καθόλου παραμέτρους είτε επιστρέφουν μόνο ένα σύνολο παραμέτρων εξόδου , που παρατίθεται στις Επιστροφές, όπου μία γραμμή παραμέτρων. Οι διαδικασίες επιλογής καλούνται σε ερωτήματα SELECT και οι εκτελέσιμες διαδικασίες καλούνται χρησιμοποιώντας την εντολή EXECUTE PROCEDURE.
Και οι δύο τύποι αποθηκευμένων διαδικασιών έχουν την ίδια σύνταξη δημιουργίας και τυπικά δεν διαφέρουν, επομένως οποιαδήποτε εκτελέσιμη διαδικασία μπορεί να κληθεί σε ένα ερώτημα SELECT και οποιαδήποτε διαδικασία επιλογής μπορεί να κληθεί χρησιμοποιώντας τη ΔΙΑΔΙΚΑΣΙΑ EXECUTE. Το ερώτημα είναι πώς θα συμπεριφερθεί η HP σε διαφορετικούς τύπους κλήσεων. Με άλλα λόγια, η διαφορά έγκειται στον σχεδιασμό της διαδικασίας για έναν συγκεκριμένο τύπο κλήσης. Δηλαδή, η διαδικασία επιλογής δημιουργείται ειδικά για να κληθεί από ένα ερώτημα SELECT και η εκτελέσιμη διαδικασία δημιουργείται ειδικά για να καλείται χρησιμοποιώντας τη ΔΙΑΔΙΚΑΣΙΑ ΕΚΤΕΛΕΣΗΣ. Ας δούμε ποιες είναι οι διαφορές στη σχεδίαση αυτών των δύο τύπων HP.
Για να κατανοήσετε πώς λειτουργεί η διαδικασία δειγματοληψίας, θα πρέπει να εμβαθύνετε λίγο στη θεωρία. Ας φανταστούμε ένα κανονικό ερώτημα SQL όπως το SELECT ID, NAME FROM Table_example. Ως αποτέλεσμα της εκτέλεσής του, παίρνουμε έναν πίνακα που αποτελείται από δύο στήλες (ID και NAME) και έναν ορισμένο αριθμό σειρών (ίσο με τον αριθμό των γραμμών στον πίνακα Table_example). Ο πίνακας που επιστρέφεται ως αποτέλεσμα αυτού του ερωτήματος ονομάζεται επίσης σύνολο δεδομένων SQL. Ας σκεφτούμε πώς σχηματίζεται το σύνολο δεδομένων κατά την εκτέλεση αυτού του ερωτήματος. Ο διακομιστής, έχοντας λάβει το ερώτημα, καθορίζει σε ποιους πίνακες αναφέρεται και στη συνέχεια βρίσκει ποιο υποσύνολο εγγραφών από αυτούς τους πίνακες πρέπει να συμπεριληφθεί στο αποτέλεσμα του ερωτήματος. Στη συνέχεια, ο διακομιστής διαβάζει κάθε εγγραφή που ικανοποιεί τα αποτελέσματα του ερωτήματος, επιλέγει τα απαιτούμενα πεδία από αυτήν (στην περίπτωσή μας, ID και NAME) και τα στέλνει στον πελάτη. Στη συνέχεια, η διαδικασία επαναλαμβάνεται ξανά - και ούτω καθεξής για κάθε επιλεγμένη εγγραφή.
Όλη αυτή η παρέκκλιση είναι απαραίτητη ώστε ο αγαπητός αναγνώστης να καταλάβει ότι όλα τα σύνολα δεδομένων SQL δημιουργούνται σειρά προς σειρά, συμπεριλαμβανομένων των αποθηκευμένων διαδικασιών! Και η κύρια διαφορά μεταξύ των διαδικασιών ανάκτησης και των εκτελέσιμων διαδικασιών είναι ότι οι πρώτες έχουν σχεδιαστεί για να επιστρέφουν πολλές σειρές, ενώ οι δεύτερες έχουν σχεδιαστεί για να επιστρέφουν μόνο μία. Γι' αυτό χρησιμοποιούνται διαφορετικά: η διαδικασία Select καλείται χρησιμοποιώντας την εντολή SELECT, η οποία "απαιτεί" η διαδικασία να εγκαταλείψει όλες τις εγγραφές που μπορεί να επιστρέψει. Η εκτελέσιμη διαδικασία καλείται χρησιμοποιώντας EXECUTE PROCEDURE, η οποία «βγάζει» μόνο μία γραμμή από την HP και αγνοεί τις υπόλοιπες (ακόμα και αν υπάρχουν!).
Ας δούμε ένα παράδειγμα διαδικασίας δειγματοληψίας για να γίνει πιο σαφές. Για > συγχώρεση, ας δημιουργήσουμε μια αποθηκευμένη διαδικασία που λειτουργεί ακριβώς όπως ένα ερώτημα SELECT ID, NAME FROM Table_Example, δηλαδή απλώς επιλέγει τα πεδία ID και NAME από ολόκληρο τον πίνακα. Εδώ είναι αυτό το παράδειγμα:

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ Simple_Select_SP
ΕΠΙΣΤΡΟΦΕΣ (
procID ΑΚΕΡΑΙΟΣ,
procNAME VARCHAR(80))
ΟΠΩΣ ΚΑΙ
ΑΡΧΙΖΟΥΝ
ΓΙΑ
SELECT ID, NAME FROM table_example
INTO:procID, :procNAME
ΚΑΝΩ
ΑΡΧΙΖΟΥΝ
ΑΝΑΣΤΕΛΛΩ;
ΤΕΛΟΣ
ΤΕΛΟΣ

Ας δούμε τα βήματα αυτής της διαδικασίας, που ονομάζεται Simple_Select_SP. Όπως μπορείτε να δείτε, δεν έχει παραμέτρους εισόδου και έχει δύο παραμέτρους εξόδου - ID και NAME. Το πιο ενδιαφέρον πράγμα, φυσικά, βρίσκεται στο σώμα της διαδικασίας. Η κατασκευή FOR SELECT χρησιμοποιείται εδώ:

ΓΙΑ
SELECT ID, NAME FROM table_example
INTO:procID, :procNAME
ΚΑΝΩ
ΑΡΧΙΖΟΥΝ

/*κάντε κάτι με τις μεταβλητές procID και procName*/

ΤΕΛΟΣ

Αυτό το κομμάτι κώδικα σημαίνει τα εξής: για κάθε σειρά που επιλέγεται από τον πίνακα Table_example, βάλτε τις επιλεγμένες τιμές στις μεταβλητές procID και procName και μετά κάντε κάτι με αυτές τις μεταβλητές.
Μπορείτε να κάνετε μια έκπληξη και να ρωτήσετε, "Μεταβλητές; Ποιες άλλες μεταβλητές; 9" Είναι κάπως έκπληξη αυτού του κεφαλαίου ότι μπορούμε να χρησιμοποιήσουμε μεταβλητές σε αποθηκευμένες διαδικασίες. Στη γλώσσα HP, μπορείτε να δηλώσετε και τις δύο δικές σας τοπικές μεταβλητές μέσα σε μια διαδικασία και να χρησιμοποιήσετε παραμέτρους εισόδου και εξόδου ως μεταβλητές.
Για να δηλώσετε μια τοπική μεταβλητή σε μια αποθηκευμένη διαδικασία, πρέπει να τοποθετήσετε την περιγραφή της μετά τη λέξη-κλειδί AS και πριν από την πρώτη λέξη BEGIN. Η περιγραφή μιας τοπικής μεταβλητής μοιάζει με αυτό:

ΔΗΛΩΣΤΕ ΜΕΤΑΒΛΗΤΟ ;

Για παράδειγμα, για να δηλώσετε μια ακέραια τοπική μεταβλητή Mylnt, θα εισαγάγετε την ακόλουθη δήλωση μεταξύ AS και BEGIN

ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΗΣ Mylnt ΑΚΕΡΑΙΟΣ;

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

procName="Κάποιο όνομα";

Ας επιστρέψουμε όμως στο σώμα της διαδικασίας μας. Ο όρος FOR SELECT επιστρέφει δεδομένα όχι με τη μορφή πίνακα - ένα σύνολο δεδομένων, αλλά μία σειρά τη φορά. Κάθε πεδίο που επιστρέφεται πρέπει να τοποθετηθεί στη δική του μεταβλητή: ID => procID, NAME => procName. Στο τμήμα DO, αυτές οι μεταβλητές αποστέλλονται στον πελάτη που κάλεσε τη διαδικασία χρησιμοποιώντας την εντολή SUSPEND
Έτσι, η εντολή FOR SELECT...DO κάνει βρόχο μέσα από τις εγγραφές που έχουν επιλεγεί στο τμήμα SELECT της εντολής. Στο σώμα του βρόχου που σχηματίζεται από το τμήμα DO, η επόμενη παραγόμενη εγγραφή μεταφέρεται στον πελάτη χρησιμοποιώντας την εντολή SUSPEND.
Έτσι, η διαδικασία επιλογής έχει σχεδιαστεί για να επιστρέφει μία ή περισσότερες σειρές, για τις οποίες οργανώνεται ένας βρόχος μέσα στο σώμα της HP που συμπληρώνει τις παραμέτρους της μεταβλητής που προκύπτουν. Και στο τέλος του σώματος αυτού του βρόχου υπάρχει πάντα μια εντολή SUSPEND, η οποία θα επιστρέψει την επόμενη σειρά δεδομένων στον πελάτη.

Βρόχοι και δηλώσεις διακλάδωσης

Εκτός από την εντολή FOR SELECT...DO, η οποία οργανώνει έναν βρόχο μέσω των εγγραφών μιας επιλογής, υπάρχει ένας άλλος τύπος βρόχου - WHILE...DO, που σας επιτρέπει να οργανώσετε έναν βρόχο με βάση τον έλεγχο τυχόν συνθηκών. Ακολουθεί ένα παράδειγμα HP που χρησιμοποιεί τον βρόχο WHILE..DO. Αυτή η διαδικασία επιστρέφει τα τετράγωνα των ακεραίων από το 0 στο 99:

ΔΗΜΙΟΥΡΓΗΣΤΕ PROCEDJRE QUAD
ΕΠΙΣΤΡΟΦΕΣ (ΑΚΕΡΑΙΟΣ ΤΕΤΑΡΧΕΙΟ)
ΟΠΩΣ ΚΑΙ
ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΗΣ I ΑΚΕΡΑΙΟΣ;
ΑΡΧΙΖΟΥΝ
I = 1;
Καθώς εγώ<100) DO
ΑΡΧΙΖΟΥΝ
QUADRAT= I*I;
I=I+1;
ΑΝΑΣΤΕΛΛΩ;
ΤΕΛΟΣ
ΤΕΛΟΣ

Ως αποτέλεσμα της εκτέλεσης του ερωτήματος SELECT FROM QUAD, θα λάβουμε έναν πίνακα που περιέχει μια στήλη QUADRAT, η οποία θα περιέχει τα τετράγωνα των ακεραίων από το 1 έως το 99
Εκτός από την επανάληψη στα αποτελέσματα ενός δείγματος SQL και ενός κλασικού βρόχου, η γλώσσα αποθηκευμένης διαδικασίας χρησιμοποιεί τον τελεστή IF...THEN..ELSE, ο οποίος σας επιτρέπει να οργανώνετε διακλάδωση ανάλογα με την εκτέλεση οποιωνδήποτε συνθηκών. Η σύνταξή της είναι παρόμοια στους περισσότερους τελεστές διακλάδωσης σε γλώσσες προγραμματισμού υψηλού επιπέδου, όπως οι Pascal και C.
Ας δούμε ένα πιο περίπλοκο παράδειγμα αποθηκευμένης διαδικασίας που κάνει τα εξής.

  1. Υπολογίζει τη μέση τιμή στον πίνακα Table_example (βλ. κεφάλαιο "Πίνακες Πρωτεύοντα κλειδιά και γεννήτριες")
  2. Στη συνέχεια, για κάθε καταχώρηση στον πίνακα, κάνει τον ακόλουθο έλεγχο: εάν η υπάρχουσα τιμή (PRICE) είναι μεγαλύτερη από τη μέση τιμή, τότε ορίζει μια τιμή ίση με τη μέση τιμή, συν ένα καθορισμένο σταθερό ποσοστό
  3. Εάν η υπάρχουσα τιμή είναι μικρότερη ή ίση με τη μέση τιμή, τότε ορίζεται τιμή ίση με την προηγούμενη τιμή, συν τη μισή διαφορά μεταξύ της προηγούμενης και της μέσης τιμής.
  4. Επιστρέφει όλες τις τροποποιημένες σειρές στον πίνακα.

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

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ Αύξηση Τιμών (
Ποσοστό 2lnαύξηση ΔΙΠΛΗ ΑΚΡΙΒΕΙΑ)
ΕΠΙΣΤΡΟΦΕΣ (ID INTEGER, ΟΝΟΜΑ VARCHAR(SO), new_price DOUBLE
ΑΚΡΙΒΕΙΑ ΩΣ

Η διαδικασία θα ονομάζεται IncreasePrices, έχει μία παράμετρο εισόδου Peiceni21nciease τύπου DOUBLE PRECISION και 3 παραμέτρους εξόδου - ID, NAME και new_pnce. Σημειώστε ότι οι δύο πρώτες παράμετροι εξόδου έχουν τα ίδια ονόματα με τα πεδία του πίνακα Table_example με τα οποία πρόκειται να εργαστούμε. Αυτό επιτρέπεται από τους κανόνες της αποθηκευμένης γλώσσας διαδικασίας.
Τώρα πρέπει να δηλώσουμε μια τοπική μεταβλητή που θα χρησιμοποιηθεί για την αποθήκευση της μέσης τιμής. Η δήλωση θα μοιάζει με αυτό:

ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΟΣ μέση_τιμή ΔΙΠΛΗ ΑΚΡΙΒΕΙΑ;

Τώρα ας προχωρήσουμε στο σώμα της αποθηκευμένης διαδικασίας Ανοίξτε το σώμα της HP λέξη-κλειδί ΑΡΧΗ.
Πρώτα πρέπει να εκτελέσουμε το πρώτο βήμα του αλγορίθμου μας - να υπολογίσουμε τη μέση τιμή. Για να γίνει αυτό, θα χρησιμοποιήσουμε τον ακόλουθο τύπο ερωτήματος:

ΕΠΙΛΟΓΗ AVG (Τιμή_l)
ΑΠΟ Πίνακας_Παράδειγμα
INTO:avg_price,-

Αυτό το ερώτημα χρησιμοποιεί τη συνάρτηση συγκεντρωτικών AVG, η οποία επιστρέφει τον μέσο όρο του πεδίου PRICE_1 μεταξύ των επιλεγμένων σειρών ερωτήματος—στην περίπτωσή μας, τον μέσο όρο του PRICE_1 σε ολόκληρο τον πίνακα Table_example. Η τιμή που επιστρέφεται από το αίτημα τοποθετείται στη μεταβλητή avg_price. Σημειώστε ότι πριν από τη μεταβλητή avg_pnce υπάρχει άνω και κάτω τελεία για να τη διακρίνει από τα πεδία που χρησιμοποιούνται στο αίτημα.
Η ιδιαιτερότητα αυτού του ερωτήματος είναι ότι πάντα επιστρέφει ακριβώς μία μόνο εγγραφή. Τέτοια ερωτήματα ονομάζονται ερωτήματα singleton και μόνο τέτοιες επιλογές μπορούν να χρησιμοποιηθούν σε αποθηκευμένες διαδικασίες. Εάν ένα ερώτημα επιστρέφει περισσότερες από μία σειρές, τότε πρέπει να μορφοποιηθεί ως κατασκευή FOR SELECT...DO, η οποία οργανώνει έναν βρόχο για την επεξεργασία κάθε επιστρεφόμενης σειράς
Έτσι, πήραμε τη μέση τιμή. Τώρα πρέπει να διαβάσετε ολόκληρο τον πίνακα, να συγκρίνετε την τιμή τιμής σε κάθε καταχώριση με τη μέση τιμή και να προβείτε στις κατάλληλες ενέργειες
Από την αρχή, οργανώνουμε την αναζήτηση για κάθε εγγραφή από τον πίνακα Table_example

ΓΙΑ
SELECT ID, NAME, PRICE_1
ΑΠΟ Πίνακας_Παράδειγμα
INTO:ID, :NAME, :new_price
ΚΑΝΩ
ΑΡΧΙΖΟΥΝ
/*_εδώ περιγράφουμε κάθε καταχώρηση*/
ΤΕΛΟΣ

Όταν εκτελεστεί αυτή η κατασκευή, τα δεδομένα θα εξαχθούν από τον πίνακα Table_example σειρά προς σειρά και οι τιμές των πεδίων σε κάθε σειρά θα αντιστοιχιστούν στις μεταβλητές ID, NAME και new_pnce. Φυσικά, θυμάστε ότι αυτές οι μεταβλητές δηλώνονται ως παράμετροι εξόδου, αλλά δεν χρειάζεται να ανησυχείτε ότι τα επιλεγμένα δεδομένα θα επιστραφούν ως αποτελέσματα: το γεγονός ότι οι παράμετροι εξόδου έχουν εκχωρηθεί κάτι δεν σημαίνει ότι ο πελάτης που καλεί την HP θα λάβει αμέσως αυτές τις τιμές! Οι παράμετροι περνούν μόνο όταν εκτελείται η εντολή SUSPEND και πριν από αυτό μπορούμε να χρησιμοποιήσουμε τις παραμέτρους εξόδου ως συνηθισμένες μεταβλητές - στο παράδειγμά μας κάνουμε ακριβώς αυτό με την παράμετρο new_price.
Έτσι, μέσα στο σώμα του βρόχου BEGIN... END μπορούμε να επεξεργαστούμε τις τιμές κάθε σειράς. Όπως θυμάστε, πρέπει να καταλάβουμε πώς συγκρίνεται η υπάρχουσα τιμή με τον μέσο όρο και να λάβουμε τα κατάλληλα μέτρα. Υλοποιούμε αυτήν τη διαδικασία σύγκρισης χρησιμοποιώντας τη δήλωση IF:

ΑΝ (new_price > avg_price) ΤΟΤΕ /*αν η υπάρχουσα τιμή είναι μεγαλύτερη από τη μέση τιμή*/
ΑΡΧΙΖΟΥΝ
/*τότε θα ορίσουμε μια νέα τιμή ίση με τη μέση τιμή, συν ένα σταθερό ποσοστό */
new_price = (μέση_τιμή + μέση_τιμή*(Percent2Increase/100));
ΕΝΗΜΕΡΩΣΗ Πίνακα_παράδειγμα
SET PRICE_1 = :new_price
WHERE ID = :ID;
ΤΕΛΟΣ
ΑΛΛΟΥ
ΑΡΧΙΖΟΥΝ
/* Εάν η υπάρχουσα τιμή είναι μικρότερη ή ίση με τη μέση τιμή, τότε ορίστε μια τιμή ίση με την προηγούμενη τιμή, συν τη μισή διαφορά μεταξύ της προηγούμενης και της μέσης τιμής */
new_price = (new_pnce + ((avg_pnce new_price)/2)) ;
ΕΝΗΜΕΡΩΣΗ Πίνακα_παράδειγμα
SET PRICE_1 = :new_price
WHERE ID = .ID;
ΤΕΛΟΣ

Όπως μπορείτε να δείτε, το αποτέλεσμα είναι μια αρκετά μεγάλη κατασκευή IF, η οποία θα ήταν δύσκολο να κατανοηθεί εάν δεν υπήρχαν τα σχόλια που περικλείονται στα σύμβολα /**/.
Για να αλλάξουμε την τιμή σύμφωνα με την υπολογισμένη διαφορά, θα χρησιμοποιήσουμε τη δήλωση UPDATE, η οποία μας επιτρέπει να τροποποιήσουμε τις υπάρχουσες εγγραφές - μία ή περισσότερες. Για να υποδείξουμε με σαφήνεια σε ποια εγγραφή πρέπει να αλλάξει η τιμή, χρησιμοποιούμε το πεδίο πρωτεύοντος κλειδιού στη συνθήκη WHERE, συγκρίνοντάς το με την τιμή της μεταβλητής που αποθηκεύει την τιμή ID για την τρέχουσα εγγραφή: ID=:ID. Σημειώστε ότι πριν από τη μεταβλητή ID υπάρχει άνω και κάτω τελεία.
Μετά την εκτέλεση της κατασκευής IF...THEN...ELSE, οι μεταβλητές ID, NAME και new_price περιέχουν δεδομένα που πρέπει να επιστρέψουμε στον πελάτη που κάλεσε τη διαδικασία. Για να το κάνετε αυτό, μετά το IF, πρέπει να εισαγάγετε την εντολή SUSPEND, η οποία θα στείλει τα δεδομένα από όπου κλήθηκε η HP. Κατά τη μεταφορά, η διαδικασία θα ανασταλεί και όταν απαιτείται νέα εγγραφή από την HP, θα συνεχιστεί ξανά - και αυτό θα συνεχιστεί έως ότου το FOR SELECT...DO δεν θα επαναλάβει όλες τις εγγραφές στο ερώτημά του.
Θα πρέπει να σημειωθεί ότι εκτός από την εντολή SUSPEND, η οποία αναστέλλει μόνο την αποθηκευμένη διαδικασία, υπάρχει μια εντολή EXIT που τερματίζει την αποθηκευμένη διαδικασία αφού περάσει τη συμβολοσειρά. Ωστόσο, η εντολή EXIT χρησιμοποιείται αρκετά σπάνια, καθώς απαιτείται κυρίως για τη διακοπή του βρόχου όταν επιτευχθεί μια συνθήκη
Ωστόσο, στην περίπτωση που η διαδικασία κλήθηκε με δήλωση SELECT και ολοκληρώθηκε με EXIT, η τελευταία σειρά που ανακτήθηκε δεν θα επιστραφεί. Δηλαδή, εάν χρειάζεται να διακόψετε τη διαδικασία και να λάβετε αυτή τη συμβολοσειρά, πρέπει να χρησιμοποιήσετε την ακολουθία

ΑΝΑΣΤΕΛΛΩ;
ΕΞΟΔΟΣ;

Ο κύριος σκοπός του EXIT είναι να λαμβάνει σύνολα δεδομένων singleton, επιστρεφόμενες παραμέτρους καλώντας EXECUTE PROCEDURE. Σε αυτήν την περίπτωση, ορίζονται οι τιμές των παραμέτρων εξόδου, αλλά το σύνολο δεδομένων SQL δεν δημιουργείται από αυτές και η εκτέλεση της διαδικασίας τελειώνει.
Ας γράψουμε ολόκληρο το κείμενο της αποθηκευμένης διαδικασίας μας, ώστε να καταλάβουμε τη λογική της με μια ματιά:

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ Αύξηση Τιμών (
Ποσοστό 2 Αύξηση ΔΙΠΛΗΣ ΑΚΡΙΒΕΙΑΣ)
ΕΠΙΣΤΡΟΦΕΣ (ID INTEGER, ΟΝΟΜΑ VARCHAR(80),
new_price ΔΙΠΛΗ ΑΚΡΙΒΕΙΑ) ΩΣ
ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΟΣ μέση_τιμή ΔΙΠΛΗ ΑΚΡΙΒΕΙΑ;
ΑΡΧΙΖΟΥΝ
ΕΠΙΛΟΓΗ AVG (Τιμή_l)
ΑΠΟ Πίνακας_Παράδειγμα
INTO:avg_price;
ΓΙΑ
SELECT ID, NAME, PRICE_1
ΑΠΟ Πίνακας_Παράδειγμα
INTO:ID, :NAME, :new_price
ΚΑΝΩ
ΑΡΧΙΖΟΥΝ
/*επεξεργαστείτε κάθε εγγραφή εδώ*/
ΑΝ (new_pnce > avg_price) ΤΟΤΕ /*αν η υπάρχουσα τιμή είναι μεγαλύτερη από τη μέση τιμή*/
ΑΡΧΙΖΟΥΝ
/*ορίστε μια νέα τιμή ίση με τη μέση τιμή συν ένα σταθερό ποσοστό */
new_price = (μέση_τιμή + μέση_τιμή*(Percent2lncrease/100));
ΕΝΗΜΕΡΩΣΗ Πίνακα_παράδειγμα
SET PRICE_1 = :new_price
WHERE ID = :ID;
ΤΕΛΟΣ
ΑΛΛΟΥ
ΑΡΧΙΖΟΥΝ
/* Εάν η υπάρχουσα τιμή είναι μικρότερη ή ίση με τη μέση τιμή, τότε ορίζει μια τιμή ίση με την προηγούμενη τιμή συν το μισό της διαφοράς μεταξύ της προηγούμενης και της μέσης τιμής */
new_price = (new_price + ((μέση_τιμή - νέα_τιμή)/2));
ΕΝΗΜΕΡΩΣΗ Πίνακα_παράδειγμα
SET PRICE_1 = :new_price
WHERE ID = :ID;
ΤΕΛΟΣ
ΑΝΑΣΤΕΛΛΩ;
ΤΕΛΟΣ
ΤΕΛΟΣ

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

Αναδρομικές αποθηκευμένες διαδικασίες

Οι αποθηκευμένες διαδικασίες InterBase μπορεί να είναι αναδρομικές. Αυτό σημαίνει ότι μια αποθηκευμένη διαδικασία μπορεί να καλέσει τον εαυτό της. Επιτρέπονται έως και 1000 επίπεδα ένθεσης αποθηκευμένων διαδικασιών, αλλά πρέπει να θυμόμαστε ότι οι δωρεάν πόροι στον διακομιστή ενδέχεται να εξαντληθούν πριν επιτευχθεί η μέγιστη ένθεση της HP.
Μια κοινή χρήση των αποθηκευμένων διαδικασιών είναι η επεξεργασία δομών δέντρων που είναι αποθηκευμένες σε μια βάση δεδομένων. Τα δέντρα χρησιμοποιούνται συχνά στη σύνθεση προϊόντων, στην αποθήκη, στο προσωπικό και σε άλλες κοινές εφαρμογές.
Ας δούμε ένα παράδειγμα αποθηκευμένης διαδικασίας που επιλέγει όλα τα προϊόντα ενός συγκεκριμένου τύπου, ξεκινώντας από ένα συγκεκριμένο επίπεδο ένθεσης.
Ας έχουμε την ακόλουθη διατύπωση του προβλήματος: έχουμε έναν κατάλογο αγαθών με ιεραρχική δομή του ακόλουθου τύπου:

Εμπορεύματα
- Συσκευές
- Ψυγεία
- Τριθάλαμος
- Διπλός θάλαμος
- Μονοθάλαμος
- Πλυντήρια
- Κάθετη
- Μετωπικό
- Κλασικό
- Στενό
- Τεχνολογία υπολογιστών
....

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

Πλυντήρια - Κάθετα
Πλυντήρια ρούχων - Μπροστά Classic
Πλυντήρια ρούχων - Μπροστά Στενό

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

ΔΗΜΙΟΥΡΓΙΑ ΕΠΙΤΡΑΠΕΖΙΩΝ ΑγαθώνΔέντρο
(ID_GOOD ΑΚΕΡΑΙΟΣ ΟΧΙ NULL,
ID_PARENT_GOOD ΑΚΕΡΑΙΟΣ,
GOOD_NAME VARCHAR(80),
περιορισμός pkGooci πρωτεύον κλειδί (ID_GOOD));

Δημιουργούμε έναν πίνακα GoodsTree, στον οποίο υπάρχουν μόνο 3 πεδία: ID_GOOD - το έξυπνο αναγνωριστικό της κατηγορίας, ID_PARENT_GOOD - το αναγνωριστικό της μητρικής εταιρείας για αυτήν την κατηγορία και GOOD_NAME - το όνομα της κατηγορίας. Για να διασφαλίσουμε την ακεραιότητα των δεδομένων σε αυτόν τον πίνακα, θα επιβάλουμε έναν περιορισμό ξένου κλειδιού σε αυτόν τον πίνακα:

ALTER TABLE GoodsTree
ΠΡΟΣΘΗΚΗ ΠΕΡΙΟΡΙΣΜΟΥ FK_goodstree
ΞΕΝΟ ΚΛΕΙΔΙ (ID_PARENT_GOOD)
ΑΝΑΦΟΡΕΣ GOODSTPEE (ID__GOOD)

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

ID_GOOD

1
2
3
4
5
6
7
8
9
10
11
12

ID_PARENT_GOOD

0
1
1
2
2
4
4
4
5
5
10
10

ΚΑΛΟ ΟΝΟΜΑ

ΕΜΠΟΡΕΥΜΑΤΑ
Συσκευές
Υπολογιστές και εξαρτήματα
Ψυγεία
Πλυντήρια
Τριθάλαμος
Διπλός θάλαμος
Ενιαίος θάλαμος
Κατακόρυφος
Μετωπικός
Στενός
Κλασσικός

Τώρα που έχουμε ένα μέρος για να αποθηκεύσουμε τα δεδομένα, μπορούμε να αρχίσουμε να δημιουργούμε μια αποθηκευμένη διαδικασία που θα παράγει όλες τις "τελικές" κατηγορίες προϊόντων σε μια "διευρυμένη" μορφή - για παράδειγμα, για την κατηγορία "Three-Chamber", την πλήρη κατηγορία το όνομα θα ήταν «Οικιακές Συσκευές Ψυγεία» Τριών θαλάμων».
Οι αποθηκευμένες διαδικασίες που επεξεργάζονται δομές δέντρων έχουν τη δική τους ορολογία. Κάθε στοιχείο του δέντρου ονομάζεται κόμβος. και η σχέση μεταξύ κόμβων που αναφέρονται μεταξύ τους ονομάζεται σχέση γονέα-παιδιού. Οι κόμβοι που βρίσκονται στην άκρη του δέντρου και δεν έχουν παιδιά ονομάζονται "φύλλα".
Για αυτήν την αποθηκευμένη διαδικασία, η παράμετρος εισαγωγής θα είναι το αναγνωριστικό κατηγορίας, από το οποίο θα πρέπει να ξεκινήσουμε την ανάλυση. Η αποθηκευμένη διαδικασία θα μοιάζει με αυτό:

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ GETFULLNAME (ID_GOOD2ΕΜΦΑΝΙΣΗ ΑΚΕΡΑΙΟΥ)
RETURNS (FULL_GOODS_NAME VARCHAR(1000),
ID_CHILD_GOOD ΑΚΕΡΑΙΟΣ)
ΟΠΩΣ ΚΑΙ
ΔΗΛΩΣΤΕ VARIABLE CURR_CHILD_NAME VARCHAR(80);
ΑΡΧΙΖΟΥΝ
/*0οργανώστε τον εξωτερικό βρόχο FOR SELECT σύμφωνα με τους άμεσους απογόνους του προϊόντος με ID_GOOD=ID_GOOD2SHOW */
ΓΙΑ ΕΠΙΛΟΓΗ gtl.id_good, gtl.good_name
ΑΠΟ GoodsTree gtl
WHERE gtl.id_parent_good=:ID_good2show
INTO:ID_CHILD_GOOD, :full_goods_name
ΚΑΝΩ
ΑΡΧΙΖΟΥΝ
/"Ελέγξτε χρησιμοποιώντας τη συνάρτηση EXISTS, η οποία επιστρέφει TRUE εάν το ερώτημα σε αγκύλες επιστρέφει τουλάχιστον μία σειρά. Εάν ο κόμβος που βρέθηκε με ID_PARENT_GOOD = ID_CHILD_GOOD δεν έχει παιδιά, τότε είναι ένα "φύλλο" του δέντρου και περιλαμβάνεται στα αποτελέσματα */
ΑΝ (ΔΕΝ ΥΠΑΡΧΕΙ(
ΕΠΙΛΟΓΗ * ΑΠΟ GoodsTree
WHERE GoodsTree.id_parent_good=:id_child_good))
ΕΠΕΙΤΑ
ΑΡΧΙΖΟΥΝ
/* Περάστε το "φύλλο" του δέντρου στα αποτελέσματα */
ΑΝΑΣΤΕΛΛΩ;
ΤΕΛΟΣ
ΑΛΛΟΥ
/* Για κόμβους που έχουν παιδιά*/
ΑΡΧΙΖΟΥΝ
/*αποθηκεύστε το όνομα του γονικού κόμβου σε μια προσωρινή μεταβλητή */
CURR_CHILD_NAME=full_goods_name;
/* εκτελέστε αυτήν τη διαδικασία αναδρομικά */
ΓΙΑ
SELECT ID_CHILD_GOOD, full_goods_name
FROM GETFULLNAME (:ID_CHILD_GOOD)
INTO:ID_CHILD_GOOD, :full_goods_name
ΞΕΚΙΝΗΣΤΕ
/*προσθέστε το όνομα του γονικού κόμβου στο όνομα θυγατρικού που βρέθηκε χρησιμοποιώντας τη λειτουργία συνένωσης συμβολοσειρών || */
full_goods_name=CURR_CHILD_NAME| "" | f ull_goods_name,-
ΑΝΑΣΤΕΛΛΩ; /* επιστρέψτε το πλήρες όνομα του προϊόντος*/
ΤΕΛΟΣ
ΤΕΛΟΣ
ΤΕΛΟΣ
ΤΕΛΟΣ

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

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

συμπέρασμα

Αυτό ολοκληρώνει την εξέταση των κύριων χαρακτηριστικών της γλώσσας αποθηκευμένης διαδικασίας. Προφανώς, είναι αδύνατο να κατακτήσουμε πλήρως την ανάπτυξη αποθηκευμένων διαδικασιών σε ένα μόνο κεφάλαιο, αλλά εδώ προσπαθήσαμε να εισαγάγουμε και να εξηγήσουμε τις βασικές έννοιες που σχετίζονται με τις αποθηκευμένες διαδικασίες. Τα περιγραφόμενα σχέδια και τεχνικές για το σχεδιασμό της HP μπορούν να εφαρμοστούν στις περισσότερες εφαρμογές βάσεων δεδομένων
Μερικά από τα σημαντικά ζητήματα που σχετίζονται με την ανάπτυξη αποθηκευμένων διαδικασιών θα καλυφθούν στο επόμενο κεφάλαιο - «Προηγμένες δυνατότητες της γλώσσας αποθηκευμένων διαδικασιών InterBase», η οποία είναι αφιερωμένη στον χειρισμό εξαιρέσεων, στην επίλυση καταστάσεων σφαλμάτων σε αποθηκευμένες διαδικασίες και στην εργασία με πίνακες.

Αυτό το θέμα περιγράφει πώς μπορείτε να δημιουργήσετε μια αποθηκευμένη διαδικασία Transact-SQL στο SQL Server Management Studio, χρησιμοποιώντας τη δήλωση Transact-SQL CREATE PROCEDURE.

    Πριν ξεκινήσετε, ολοκληρώστε τα παρακάτω βήματα.Άδειες

    Δημιουργήστε μια διαδικασία χρησιμοποιώντας: SQL Server Management Studio, Transact-SQL

Η εκτέλεση αυτής της δήλωσης απαιτεί το δικαίωμα CREATE PROCEDURE στη βάση δεδομένων και το δικαίωμα ALTER στο σχήμα στο οποίο δημιουργείται η διαδικασία.

Μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες μεθόδους:

    SQL Server Management Studio

Χρήση του SQL Server Management Studio

Δημιουργήστε μια διαδικασία στην Εξερεύνηση αντικειμένων

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

    Ξεδιπλώστε τον κόμβο διαδοχικά Βάση δεδομένων, βάση δεδομένων AdventureWorks2012και κόμβος Προγραμματισμός.

    Στοιχείο δεξί κλικ Αποθηκευμένες διαδικασίεςκαι επιλέξτε Δημιουργία αποθηκευμένης διαδικασίας.

    Στο μενού Αίτησηεπιλέξτε αντικείμενο Καθορίστε τιμές για παραμέτρους προτύπου.

    Στο πλαίσιο διαλόγου Ρύθμιση τιμών για παραμέτρους προτύπουΕισαγάγετε τις ακόλουθες τιμές για τις παραμέτρους που εμφανίζονται.

    ΠαράμετροςΕννοια
    Συγγραφέαςτο όνομα σου
    ημερομηνία δημιουργίαςΗ σημερινή ημερομηνία
    ΠεριγραφήΕπιστρέφει δεδομένα για υπαλλήλους.
    Όνομα_διαδικασίας
    @Param1@Επίθετο
    @Datatype_For_Param1nvarchar(50)
    Default_Value_For_Param1ΜΗΔΕΝΙΚΟ
    @Param2@Ονομα
    @Datatype_For_Param2nvarchar(50)
    Default_Value_For_Param2ΜΗΔΕΝΙΚΟ
  1. Κάντε κλικ στο κουμπί Εντάξει.

    ΣΕ πρόγραμμα επεξεργασίας ερωτημάτωναντικαταστήστε τη δήλωση SELECT με την ακόλουθη πρόταση:

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

    Για να δημιουργήσετε μια διαδικασία, στο μενού Αίτησηεπιλέξτε αντικείμενο Εκτέλεση. Η διαδικασία δημιουργείται ως αντικείμενο στη βάση δεδομένων.

    Για να δείτε τη διαδικασία στην Εξερεύνηση αντικειμένων, κάντε δεξί κλικ στο στοιχείο Αποθηκευμένες διαδικασίεςκαι επιλέξτε Εκσυγχρονίζω.

    Για να εκτελέσετε μια διαδικασία, στην Εξερεύνηση αντικειμένων, κάντε δεξί κλικ στο όνομα της αποθηκευμένης διαδικασίας HumanResources.uspGetEmployeesTestκαι επιλέξτε Εκτέλεση Αποθηκευμένης Διαδικασίας.

    Στο παράθυρο Εκτέλεση της διαδικασίαςΕισαγάγετε Margheim ως τιμή για την παράμετρο @LastName και Diane ως τιμή για την παράμετρο @FirstName.

Χρήση Transact-SQL

Δημιουργία Διαδικασίας στον Επεξεργαστή Ερωτημάτων

    ΣΕ Εξερεύνηση αντικειμένωνΣυνδεθείτε σε μια παρουσία του μηχανισμού βάσης δεδομένων.

    Στο μενού Αρχείοεπιλέξτε αντικείμενο Δημιουργήστε ένα αίτημα.

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

    ΧΡΗΣΗ AdventureWorks2012; ΠΑΤΕ ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑ HumanResources .uspGetEmployeesTest2 @LastName nvarchar (50) , @FirstName nvarchar (50) AS SET NOCOUNT ON ;ΕΠΙΛΕΞΤΕ Όνομα, Επώνυμο, Τμήμα FROM HumanResources.vEmployeeDepartmentHistory WHERE Όνομα = @FirstName AND LastName = @LastName ΚΑΙ Ημερομηνία λήξης είναι NULL; ΠΗΓΑΙΝΩ

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

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

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

2. Ολοκλήρωση όλων των παραδειγμάτων και εργασιών κατά την εργαστηριακή εργασία.

3. Ολοκλήρωση μεμονωμένων εργασιών σύμφωνα με τις επιλογές.

Επεξηγήσεις για την εκτέλεση της εργασίας

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

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

Τύποι αποθηκευμένων διαδικασιών

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

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

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

Δημιουργία, τροποποίηση αποθηκευμένων διαδικασιών

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

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

( ΔΗΜΙΟΥΡΓΙΑ | ΑΛΛΑΓΗ ) PROC[ EDURE] όνομα_διαδικασίας [ ;αριθμός] [ ( @parameter_name data_type ) [ ΠΑΡΑΛΛΟΝ ] [ = ΠΡΟΕΠΙΛΟΓΗ ] [ ΕΞΟΔΟΣ ] ] [ ,... n] [ ΜΕ ( ΕΠΑΝΑΣΥΝΘΕΣΗ | ΚΡΥΠΤΟΠΟΙΗΣΗ | ΕΠΑΝΑΣΥΝΘΕΣΗ, ENCRY)] [ ΓΙΑ ΑΝΑΠΑΡΑΓΩΓΗ] AS sql_statement [ ... n]

Ας δούμε τις παραμέτρους αυτής της εντολής.

Χρησιμοποιώντας τα προθέματα sp_, #, ##, η διαδικασία που δημιουργήθηκε μπορεί να οριστεί ως σύστημα ή προσωρινή. Όπως μπορείτε να δείτε από τη σύνταξη της εντολής, δεν επιτρέπεται να προσδιορίσετε το όνομα του κατόχου που θα κατέχει τη διαδικασία που δημιουργήθηκε, καθώς και το όνομα της βάσης δεδομένων όπου θα πρέπει να βρίσκεται. Επομένως, για να τοποθετήσετε την αποθηκευμένη διαδικασία που δημιουργείτε σε μια συγκεκριμένη βάση δεδομένων, πρέπει να εκδώσετε την εντολή CREATE PROCEDURE στο πλαίσιο αυτής της βάσης δεδομένων. Κατά την πρόσβαση σε αντικείμενα της ίδιας βάσης δεδομένων από το σώμα μιας αποθηκευμένης διαδικασίας, μπορείτε να χρησιμοποιήσετε συντομευμένα ονόματα, δηλαδή χωρίς να καθορίσετε το όνομα της βάσης δεδομένων. Όταν χρειάζεται να αποκτήσετε πρόσβαση σε αντικείμενα που βρίσκονται σε άλλες βάσεις δεδομένων, ο καθορισμός του ονόματος της βάσης δεδομένων είναι υποχρεωτικός.

Για να μεταβιβάσετε δεδομένα εισόδου και εξόδου, τα ονόματα των παραμέτρων στην αποθηκευμένη διαδικασία που δημιουργείτε πρέπει να ξεκινούν με τον χαρακτήρα @. Μπορείτε να καθορίσετε πολλαπλές παραμέτρους σε μία αποθηκευμένη διαδικασία, διαχωρισμένες με κόμματα. Το σώμα μιας διαδικασίας δεν πρέπει να χρησιμοποιεί τοπικές μεταβλητές των οποίων τα ονόματα συμπίπτουν με τα ονόματα των παραμέτρων αυτής της διαδικασίας. Οποιοσδήποτε τύπος δεδομένων SQL, συμπεριλαμβανομένων εκείνων που ορίζονται από το χρήστη, είναι κατάλληλος για τον προσδιορισμό του τύπου δεδομένων των παραμέτρων αποθηκευμένης διαδικασίας. Ωστόσο, ο τύπος δεδομένων CURSOR μπορεί να χρησιμοποιηθεί μόνο ως παράμετρος εξόδου μιας αποθηκευμένης διαδικασίας, π.χ. καθορίζοντας τη λέξη-κλειδί OUTPUT.

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

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

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

Η παράμετρος ΓΙΑ ΑΝΑΠΑΡΑΓΩΓΗ απαιτείται κατά την αναπαραγωγή δεδομένων και τη συμπερίληψη της αποθηκευμένης διαδικασίας που δημιουργήθηκε ως άρθρο σε μια δημοσίευση. Η λέξη-κλειδί ENCRYPTION δίνει εντολή στον διακομιστή να κρυπτογραφήσει τον αποθηκευμένο κώδικα διαδικασίας, ο οποίος μπορεί να παρέχει προστασία από τη χρήση ιδιόκτητων αλγορίθμων που υλοποιούν την αποθηκευμένη διαδικασία. Η λέξη-κλειδί AS τοποθετείται στην αρχή του ίδιου του αποθηκευμένου σώματος της διαδικασίας. Το σώμα της διαδικασίας μπορεί να χρησιμοποιήσει σχεδόν όλες τις εντολές SQL, να δηλώσει συναλλαγές, να ορίσει κλειδώματα και να καλέσει άλλες αποθηκευμένες διαδικασίες. Μπορείτε να βγείτε από μια αποθηκευμένη διαδικασία χρησιμοποιώντας την εντολή RETURN.

Αφαίρεση αποθηκευμένης διαδικασίας

ΔΙΑΔΙΚΑΣΙΑ ΑΠΟΡΡΙΨΗΣ (όνομα_διαδικασίας) [,... n]

Εκτέλεση Αποθηκευμένης Διαδικασίας

Για να εκτελέσετε μια αποθηκευμένη διαδικασία, χρησιμοποιήστε την εντολή: [ [ EXEC [ UTE] όνομα_διαδικασίας [ ;αριθμός] [ [ @parameter_name= ] (τιμή | @variable_name) [ OUTPUT ] | [ ΠΡΟΕΠΙΛΟΓΗ ] ] [ ,... n]

Εάν η κλήση αποθηκευμένης διαδικασίας δεν είναι η μόνη εντολή στη δέσμη, τότε απαιτείται η εντολή EXECUTE. Επιπλέον, αυτή η εντολή απαιτείται για την κλήση μιας διαδικασίας από το σώμα μιας άλλης διαδικασίας ή έναυσμα.

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

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

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

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

Χρήση RETURN σε αποθηκευμένη διαδικασία

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

CREATE PROCEDURE Count_Books AS SELECT COUNT (Code_book) FROM Books GO

Ασκηση 1.

EXEC Count_Books

Ελέγξτε το αποτέλεσμα.

Ένα παράδειγμα δημιουργίας μιας διαδικασίας με μια παράμετρο εισόδου:

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ Count_Books_Pages @Count_pages AS INT AS SELECT COUNT (Code_book) FROM Books WHERE Pages>= @Count_pages GO

Εργασία 2. Δημιουργήστε αυτήν τη διαδικασία στην ενότητα Αποθηκευμένες διαδικασίες της βάσης δεδομένων DB_Books χρησιμοποιώντας το βοηθητικό πρόγραμμα SQL server Management Studio. Εκτελέστε το χρησιμοποιώντας την εντολή

EXEC Count_Books_Pages 100

Ελέγξτε το αποτέλεσμα.

Ένα παράδειγμα δημιουργίας μιας διαδικασίας με παραμέτρους εισόδου:

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ Count_Books_Title @Count_pages AS INT , @Title AS CHAR (10 ) AS SELECT COUNT (Code_book) FROM Books WHERE Pages>= @Count_pages ΚΑΙ Title_book ΚΑΝΤΕ LIKE @Title GO

Εργασία 3.Δημιουργήστε αυτήν τη διαδικασία στην ενότητα Αποθηκευμένες διαδικασίες της βάσης δεδομένων DB_Books χρησιμοποιώντας το βοηθητικό πρόγραμμα SQL server Management Studio. Εκτελέστε το χρησιμοποιώντας την εντολή

EXEC Count_Books_Title 100 , "P%"

Ελέγξτε το αποτέλεσμα.

Ένα παράδειγμα δημιουργίας μιας διαδικασίας με παραμέτρους εισόδου και παραμέτρους εξόδου:

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ Count_Books_Itogo @Count_pages INT , @Title CHAR (10 ) , @Itogo INT OUTPUT AS SELECT @Itogo = COUNT (Code_book) FROM Books WHERE Pages>= @Count_pages AND Title_itle LIKE

Εργασία 4.Δημιουργήστε αυτήν τη διαδικασία στην ενότητα Αποθηκευμένες διαδικασίες της βάσης δεδομένων DB_Books χρησιμοποιώντας το βοηθητικό πρόγραμμα SQL server Management Studio. Εκτελέστε χρησιμοποιώντας το σύνολο εντολών:

Sql> Δήλωση @q Ως int EXEC Count_Books_Itogo 100, "P%", @q έξοδος επιλέξτε @q

Ελέγξτε το αποτέλεσμα.

Ένα παράδειγμα δημιουργίας μιας διαδικασίας με παραμέτρους εισαγωγής και RETURN:

ΔΗΜΙΟΥΡΓΙΑ ΔΙΑΔΙΚΑΣΙΑΣ όνομα ελέγχου @param INT AS IF (ΕΠΙΛΕΞΤΕ Όνομα_συγγραφέα ΑΠΟ συντάκτες WHERE Code_author = @param) = "Pushkin A.S." ΕΠΙΣΤΡΟΦΗ 1 ΑΛΛΟ ΕΠΙΣΤΡΟΦΗ 2

Εργασία 5.Δημιουργήστε αυτήν τη διαδικασία στην ενότητα Αποθηκευμένες διαδικασίες της βάσης δεδομένων DB_Books χρησιμοποιώντας το βοηθητικό πρόγραμμα SQL server Management Studio. Εκτελέστε το χρησιμοποιώντας τις εντολές:

ΔΗΛΩΣΤΕ @return_status INT EXEC @return_status = όνομα ελέγχου 1 ΕΠΙΛΟΓΗ "Κατάσταση επιστροφής" = @return_status

Ένα παράδειγμα δημιουργίας μιας διαδικασίας χωρίς παραμέτρους για την αύξηση της τιμής ενός πεδίου κλειδιού στον πίνακα Αγορές κατά 2 φορές:

ΔΗΜΙΟΥΡΓΙΑ PROC update_proc ΩΣ ΕΝΗΜΕΡΩΣΗ Purchases SET Code_purchase = Code_purchase* 2

Εργασία 6.Δημιουργήστε αυτήν τη διαδικασία στην ενότητα Αποθηκευμένες διαδικασίες της βάσης δεδομένων DB_Books χρησιμοποιώντας το βοηθητικό πρόγραμμα SQL server Management Studio. Εκτελέστε το χρησιμοποιώντας την εντολή

EXEC update_proc

Ένα παράδειγμα διαδικασίας με παράμετρο εισόδου για τη λήψη όλων των πληροφοριών σχετικά με έναν συγκεκριμένο συγγραφέα:

CREATE PROC select_author @k CHAR (30 ) AS SELECT * FROM Συγγραφείς WHERE name_author= @k

Εργασία 7.

EXEC select_author "Pushkin A.S." ή select_author @k= "Pushkin A.S." ή EXEC select_author @k= "Pushkin A.S."

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

ΔΗΜΙΟΥΡΓΙΑ PROC update_proc @p INT = 2 AS UPDATE Purchases SET Code_purchase = Code_purchase * @p

Η διαδικασία δεν επιστρέφει δεδομένα.

Εργασία 8.Δημιουργήστε αυτήν τη διαδικασία στην ενότητα Αποθηκευμένες διαδικασίες της βάσης δεδομένων DB_Books χρησιμοποιώντας το βοηθητικό πρόγραμμα SQL server Management Studio. Εκτελέστε το χρησιμοποιώντας τις εντολές:

EXEC update_proc 4 ή EXEC update_proc @p = 4 ή EXEC update_proc -- θα χρησιμοποιηθεί η προεπιλεγμένη τιμή.

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

CREATE PROC count_purchases @d1 SMALLDATETIME, @d2 SMALLDATETIME, @c INT OUTPUT AS SELECT @c= COUNT (Code_purchase) FROM Purchases WHERE Date_order BETWEEN @d1 AND @d2 SET @c = ISNULL(@c,

Εργασία 9.Δημιουργήστε αυτήν τη διαδικασία στην ενότητα Αποθηκευμένες διαδικασίες της βάσης δεδομένων DB_Books χρησιμοποιώντας το βοηθητικό πρόγραμμα SQL server Management Studio. Εκτελέστε το χρησιμοποιώντας τις εντολές:

DECLARE @c2 INT EXEC count_purchases '01-jun- 2006 ', '01- jul- 2006 ', @c2 OUTPUT SELECT @c2

Επιλογές για εργασίες για εργαστηριακές εργασίες Νο. 4

Γενικές προμήθειες.Στο βοηθητικό πρόγραμμα SQL Server Management Studio, δημιουργήστε μια νέα σελίδα για τον κώδικα (το κουμπί "Δημιουργία ερωτήματος"). Ενεργοποιήστε μέσω προγραμματισμού τη δημιουργημένη βάση δεδομένων DB_Books χρησιμοποιώντας τη δήλωση Χρήση. Δημιουργήστε αποθηκευμένες διαδικασίες χρησιμοποιώντας δηλώσεις διαδικασίας Δημιουργία και ορίστε μόνοι σας τα ονόματα των διαδικασιών. Κάθε διαδικασία θα εκτελεί ένα ερώτημα SQL που εκτελέστηκε στο δεύτερο εργαστήριο. Επιπλέον, ο κώδικας SQL των ερωτημάτων πρέπει να αλλάξει, ώστε να μπορούν να μεταδίδουν τις τιμές των πεδίων που χρησιμοποιούνται για την αναζήτηση.

Για παράδειγμα, η αρχική εργασία και αίτημα στην εργαστηριακή εργασία Νο. 2:

/*Επιλέξτε από τον κατάλογο προμηθευτών (πίνακας παράδοσης) τα ονόματα των εταιρειών, τους αριθμούς τηλεφώνου και το INN (πεδία Όνομα_εταιρία, Τηλέφωνο και INN), των οποίων το όνομα εταιρείας (πεδίο Όνομα_εταιρία) είναι "OJSC MIR".

SELECT Name_company, Phone, INN FROM Deliveries WHERE Name_company = "OJSC MIR"

*/ –Σε αυτήν την εργασία θα δημιουργηθεί η ακόλουθη διαδικασία:

CREATE PROC select_name_company @comp CHAR (30 ) AS SELECT Name_company, Phone, INN FROM Deliveries WHERE Name_company = @comp

– Για να ξεκινήσετε τη διαδικασία, χρησιμοποιήστε την εντολή:

EXEC select_name_company "JSC MIR"

Λίστα εργασιών

Δημιουργήστε ένα νέο πρόγραμμα στο SQL Server Management Studio. Ενεργοποιήστε μέσω προγραμματισμού τη μεμονωμένη βάση δεδομένων που δημιουργήθηκε στην εργαστηριακή εργασία Νο. 1 χρησιμοποιώντας τη δήλωση Χρήση. Δημιουργήστε αποθηκευμένες διαδικασίες χρησιμοποιώντας δηλώσεις διαδικασίας Δημιουργία και ορίστε μόνοι σας τα ονόματα των διαδικασιών. Κάθε διαδικασία θα εκτελεί ένα ερώτημα SQL, το οποίο παρουσιάζεται με τη μορφή ξεχωριστών εργασιών σύμφωνα με τις επιλογές.

Επιλογή 1

1. Εμφανίστε μια λίστα υπαλλήλων που έχουν τουλάχιστον ένα παιδί.

2. Εμφανίστε μια λίστα με τα παιδιά που έλαβαν δώρα κατά την καθορισμένη περίοδο.

3. Εμφάνιση λίστας γονέων που έχουν ανήλικα παιδιά.

4. Εμφάνιση πληροφοριών για δώρα με τιμή μεγαλύτερη από τον καθορισμένο αριθμό, ταξινομημένα κατά ημερομηνία.

Επιλογή 2

1. Εμφανίστε μια λίστα συσκευών με τον καθορισμένο τύπο.

2. Εμφανίστε τον αριθμό των συσκευών που επισκευάστηκαν και το συνολικό κόστος των επισκευών από τον καθορισμένο τεχνικό.

3. Εμφανίστε μια λίστα με τους κατόχους συσκευών και τον αριθμό των αιτημάτων τους, ταξινομημένα κατά τον αριθμό των αιτημάτων με φθίνουσα σειρά.

4. Εμφάνιση πληροφοριών για τεχνίτες με βαθμό μεγαλύτερο από τον καθορισμένο αριθμό ή με ημερομηνία πρόσληψης μικρότερη από την καθορισμένη ημερομηνία.

Επιλογή 3

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

3. Εμφανίστε την ημερομηνία πώλησης, το ποσό, τον πωλητή και το λουλούδι σύμφωνα με τον καθορισμένο κωδικό πώλησης.

4. Εμφανίστε μια λίστα λουλουδιών και την ποικιλία για λουλούδια με ύψος μεγαλύτερο από τον καθορισμένο αριθμό ή ανθισμένα.

Επιλογή 4

1. Εμφανίστε μια λίστα φαρμάκων με την καθορισμένη ένδειξη χρήσης.

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

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

Επιλογή 5

2. Εμφανίστε μια λίστα παροπλισμένου εξοπλισμού για τον καθορισμένο λόγο.

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

4. Εμφανίστε μια λίστα εξοπλισμού με καθορισμένο τύπο ή με ημερομηνία παραλαβής μεγαλύτερη από μια συγκεκριμένη τιμή

Επιλογή 6

1. Εμφανίστε μια λίστα με πιάτα με βάρος μεγαλύτερο από τον καθορισμένο αριθμό.

2. Εμφανίστε μια λίστα προϊόντων των οποίων τα ονόματα περιέχουν το καθορισμένο τμήμα λέξης.

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

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

Επιλογή 7

1. Εμφάνιση λίστας υπαλλήλων με την καθορισμένη θέση.

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

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

Επιλογή 8

1. Εμφάνιση λίστας υπαλλήλων με τον καθορισμένο λόγο απόλυσης.

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

Επιλογή 9

1. Εμφανίστε μια λίστα υπαλλήλων που πήραν άδεια του καθορισμένου τύπου.

2. Εμφανίστε μια λίστα εγγράφων με ημερομηνία εγγραφής στην καθορισμένη περίοδο.

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

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

Επιλογή 10

1. Εμφάνιση λίστας υπαλλήλων με την καθορισμένη θέση.

2. Εμφανίστε μια λίστα εγγράφων των οποίων το περιεχόμενο περιέχει το καθορισμένο τμήμα λέξης.

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

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

Επιλογή 11

1. Εμφανίστε μια λίστα υπαλλήλων που έχουν ανατεθεί στην καθορισμένη θέση.

2. Εμφανίστε μια λίστα εγγράφων με ημερομηνία εγγραφής στην καθορισμένη περίοδο.

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

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

Επιλογή 12

3. Εμφανίστε μια λίστα με άτομα που ενοικίασαν εξοπλισμό και τον αριθμό των αιτημάτων τους, ταξινομημένα κατά τον αριθμό των αιτημάτων με φθίνουσα σειρά.

Επιλογή 13

1. Εμφανίστε μια λίστα εξοπλισμού με τον καθορισμένο τύπο. 2. Εμφανίστε μια λίστα εξοπλισμού που έχει διαγραφεί από συγκεκριμένο υπάλληλο.

3. Εμφανίστε την ποσότητα του παροπλισμένου εξοπλισμού, ομαδοποιημένη ανά τύπο εξοπλισμού.

4. Εμφάνιση πληροφοριών σχετικά με υπαλλήλους με ημερομηνία πρόσληψης μεγαλύτερη από μια συγκεκριμένη ημερομηνία.

Επιλογή 14

1. Εκτυπώστε μια λίστα λουλουδιών με τον καθορισμένο τύπο φύλλου.

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

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

4. Εμφανίστε μια λίστα λουλουδιών και την ποικιλία για λουλούδια με ύψος μεγαλύτερο από έναν ορισμένο αριθμό ή ανθισμένα.

Επιλογή 15

1. Εμφανίστε μια λίστα πελατών που έκαναν check in στα δωμάτια κατά τη διάρκεια της καθορισμένης περιόδου.

2. Εμφανίστε το συνολικό ποσό πληρωμών για δωμάτια για κάθε πελάτη.

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

4. Εμφάνιση λίστας εγγεγραμμένων πελατών σε δωμάτια συγκεκριμένου τύπου.

Επιλογή 16

1. Εμφανίστε μια λίστα εξοπλισμού με τον καθορισμένο τύπο.

2. Εμφανίστε μια λίστα εξοπλισμού που νοικιάστηκε από συγκεκριμένο πελάτη.

3. Εμφανίστε μια λίστα με άτομα που ενοικίασαν εξοπλισμό και τον αριθμό των αιτημάτων τους, ταξινομημένα κατά τον αριθμό των αιτημάτων με φθίνουσα σειρά.

4. Εμφάνιση πληροφοριών σχετικά με πελάτες ταξινομημένες κατά διεύθυνση.

Επιλογή 17

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

2. Εμφανίστε μια λίστα με τοποθεσίες υλικών περιουσιακών στοιχείων των οποίων τα ονόματα περιέχουν την καθορισμένη λέξη.

3. Εμφανίστε το άθροισμα της τιμής των τιμών με έναν κωδικό στο καθορισμένο εύρος.

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

Επιλογή 18

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

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

3. Εμφανίστε το άθροισμα του κόστους των σταδίων εργασιών επισκευής για εργασία με έναν κωδικό στο καθορισμένο εύρος.

4. Εμφανίστε μια λίστα εργοδηγών με την ημερομηνία πρόσληψης στο καθορισμένο εύρος.

Επιλογή 19

1. Εμφάνιση λίστας φαρμάκων με συγκεκριμένη ένδειξη.

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

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

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

Επιλογή 20

1. Εμφάνιση λίστας υπαλλήλων με την καθορισμένη θέση.

2. Εμφανίστε μια λίστα εγγράφων των οποίων το περιεχόμενο περιέχει το καθορισμένο τμήμα λέξης.

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

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

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

Εισαγωγή

Πολλοί άνθρωποι πιστεύουν ότι μοιάζουν με διάφορες διαδικασίες (αντίστοιχα, εκτός από το MS SQL). Ίσως αυτό είναι αλήθεια. Έχουν παρόμοιες παραμέτρους και μπορούν να παράγουν παρόμοιες τιμές. Επιπλέον, σε ορισμένες περιπτώσεις αγγίζουν. Για παράδειγμα, συνδυάζονται με βάσεις δεδομένων DDL και DML, καθώς και με λειτουργίες χρήστη (με την κωδική ονομασία UDF).

Στην πραγματικότητα, οι αποθηκευμένες διαδικασίες SQL έχουν ένα ευρύ φάσμα πλεονεκτημάτων που τις ξεχωρίζουν από παρόμοιες διαδικασίες. Ασφάλεια, ευελιξία προγραμματισμού, παραγωγικότητα - όλα αυτά προσελκύουν όλο και περισσότερους χρήστες που εργάζονται με βάσεις δεδομένων. Η κορύφωση της δημοτικότητας των διαδικασιών σημειώθηκε το 2005-2010, όταν κυκλοφόρησε ένα πρόγραμμα από τη Microsoft με το όνομα «SQL Server Management Studio». Με τη βοήθειά του, η εργασία με βάσεις δεδομένων έχει γίνει πολύ πιο εύκολη, πιο πρακτική και βολική. Από χρόνο σε χρόνο, αυτό κέρδισε δημοτικότητα μεταξύ των προγραμματιστών. Σήμερα είναι ένα απολύτως οικείο πρόγραμμα, το οποίο για τους χρήστες που «επικοινωνούν» με βάσεις δεδομένων είναι εφάμιλλο του Excel.

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

Για την εφαρμογή αυτής της τεχνολογίας για εργασία με πληροφορίες, υπάρχουν πολλές γλώσσες προγραμματισμού. Αυτά περιλαμβάνουν, για παράδειγμα, PL/SQL από την Oracle, PSQL στα συστήματα InterBase και Firebird, καθώς και το κλασικό Microsoft Transact-SQL. Όλα έχουν σχεδιαστεί για τη δημιουργία και την εκτέλεση αποθηκευμένων διαδικασιών, γεγονός που επιτρέπει στους επεξεργαστές μεγάλων βάσεων δεδομένων να χρησιμοποιούν τους δικούς τους αλγόριθμους. Αυτό είναι επίσης απαραίτητο ώστε όσοι διαχειρίζονται τέτοιες πληροφορίες να μπορούν να προστατεύουν όλα τα αντικείμενα από μη εξουσιοδοτημένη πρόσβαση τρίτων και, κατά συνέπεια, τη δημιουργία, τροποποίηση ή διαγραφή ορισμένων δεδομένων.

Παραγωγικότητα

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

Ασφάλεια

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

Μεταφορά δεδομένων

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

Μεταφορά δεδομένων με χρήση παραμέτρου τύπου Output.

Διαβίβαση δεδομένων με χρήση του τελεστή επιστροφής.

Διαβίβαση δεδομένων χρησιμοποιώντας τον επιλεγμένο τελεστή.

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

1. Δημιουργήστε μια αποθηκευμένη διαδικασία EXEC σε SQL

Μπορείτε να δημιουργήσετε μια διαδικασία στο MS SQL (Managment Studio). Αφού δημιουργηθεί η διαδικασία, θα καταχωρηθεί στον προγραμματιζόμενο κόμβο της βάσης δεδομένων, στον οποίο η διαδικασία δημιουργίας εκτελείται από τον χειριστή. Για την εκτέλεση, οι αποθηκευμένες διαδικασίες SQL χρησιμοποιούν μια διαδικασία EXEC που περιέχει το όνομα του ίδιου του αντικειμένου.

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

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

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

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

Το σώμα δεν πρέπει να δημιουργήσει καμία άλλη αποθηκευμένη διαδικασία.

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

Το σώμα δεν πρέπει να δημιουργεί κανένα ερέθισμα.

2. Ορισμός μεταβλητής στο σώμα της διαδικασίας

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

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

Οι χρήστες συχνά θέτουν την ερώτηση: "Πώς να εκχωρήσετε πολλαπλές τιμές σε μια δήλωση στο σώμα μιας διαδικασίας;" Καλά. Είναι μια ενδιαφέρουσα ερώτηση, αλλά είναι πολύ πιο εύκολο να γίνει από όσο νομίζετε. Απάντηση: Χρησιμοποιώντας ζεύγη όπως "Επιλέξτε Var = τιμή". Μπορείτε να χρησιμοποιήσετε αυτά τα ζεύγη χωρίζοντάς τα με κόμμα.

Μια ποικιλία παραδειγμάτων δείχνει ανθρώπους να δημιουργούν μια απλή αποθηκευμένη διαδικασία και να την εκτελούν. Ωστόσο, μια διαδικασία μπορεί να δέχεται παραμέτρους έτσι ώστε η διαδικασία που την καλεί να έχει τιμές κοντά της (αλλά όχι πάντα). Αν συμπίπτουν, τότε αρχίζουν αντίστοιχες διεργασίες μέσα στο σώμα. Για παράδειγμα, εάν δημιουργήσετε μια διαδικασία που θα δέχεται μια πόλη και μια περιοχή από τον καλούντα και επιστρέφει δεδομένα σχετικά με το πόσοι συντάκτες ανήκουν στην αντίστοιχη πόλη και περιοχή. Η διαδικασία θα υποβάλει ερώτημα στους πίνακες συντακτών της βάσης δεδομένων, όπως οι Pubs, για να εκτελέσει αυτήν την καταμέτρηση συντακτών. Για να αποκτήσει αυτές τις βάσεις δεδομένων, για παράδειγμα, η Google πραγματοποιεί λήψη του σεναρίου SQL από τη σελίδα SQL2005.

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

Πώς να εκτελέσετε μια αποθηκευμένη διαδικασία σε SQL

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

Η διαδικασία μπορεί να αποκλίνει ελαφρώς από την τυπική. Όλα είναι ίδια όπως στο προηγούμενο παράδειγμα, αλλά μόνο εδώ οι παράμετροι μετατοπίζονται. Δηλαδή, η παράμετρος @City αποθηκεύεται πρώτα και η @State δίπλα στην προεπιλεγμένη τιμή. Η προεπιλεγμένη παράμετρος συνήθως επισημαίνεται ξεχωριστά. Οι αποθηκευμένες διαδικασίες SQL μεταβιβάζονται ως απλώς παράμετροι. Στην περίπτωση αυτή, υπό την προϋπόθεση, η παράμετρος "UT" αντικαθιστά την προεπιλεγμένη τιμή "CA". Στη δεύτερη εκτέλεση, μεταβιβάζεται μόνο μία τιμή ορίσματος για την παράμετρο @City και η παράμετρος @State παίρνει την προεπιλεγμένη τιμή του "CA". Οι έμπειροι προγραμματιστές συμβουλεύουν ότι όλες οι μεταβλητές πρέπει να βρίσκονται στο τέλος της λίστας παραμέτρων από προεπιλογή. Διαφορετικά η εκτέλεση δεν είναι δυνατή και, στη συνέχεια, θα πρέπει να εργαστείτε με τη διαβίβαση ορισμάτων με όνομα, τα οποία είναι μεγαλύτερα και πιο περίπλοκα.

4. Αποθηκευμένες διαδικασίες SQL Server: Μέθοδοι επιστροφής

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

Επιστρέψτε την τιμή μιας αποθηκευμένης διαδικασίας.

Έξοδος παραμέτρων αποθηκευμένης διαδικασίας.

Επιλέγοντας μία από τις αποθηκευμένες διαδικασίες.

4.1 Επιστροφή τιμών από αποθηκευμένες διαδικασίες SQL

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

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

4.2 Έξοδος παραμέτρων αποθηκευμένης διαδικασίας SQL

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

Στο παράδειγμά μας θα υπάρχουν δύο ονόματα εξόδου: @TotalAuthors και @TotalNoContract. Υποδεικνύονται στη λίστα παραμέτρων. Αυτές οι μεταβλητές εκχωρούν τιμές μέσα στο σώμα της διαδικασίας. Όταν χρησιμοποιούμε παραμέτρους εξόδου, ο καλών μπορεί να δει την τιμή που έχει οριστεί μέσα στο σώμα της διαδικασίας.

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

4.3 Επιλογή μιας από τις αποθηκευμένες διαδικασίες SQL

Αυτή η τεχνική χρησιμοποιείται για την επιστροφή ενός συνόλου τιμών ως πίνακα δεδομένων (RecordSet) στην αποθηκευμένη διαδικασία κλήσης. Σε αυτό το παράδειγμα, η αποθηκευμένη διαδικασία SQL με παραμέτρους @AuthID υποβάλλει ερώτημα στον πίνακα Συγγραφείς φιλτράροντας τις εγγραφές που επιστρέφονται χρησιμοποιώντας αυτήν την παράμετρο @AuthId. Η δήλωση Select αποφασίζει τι πρέπει να επιστραφεί στον καλούντα της αποθηκευμένης διαδικασίας. Όταν εκτελείται η αποθηκευμένη διαδικασία, το AuthId επιστρέφεται. Αυτή η διαδικασία εδώ επιστρέφει πάντα μόνο μία εγγραφή ή καμία. Αλλά μια αποθηκευμένη διαδικασία δεν έχει κανέναν περιορισμό στην επιστροφή περισσότερων από μία εγγραφών. Δεν είναι ασυνήθιστο να βλέπουμε παραδείγματα όπου τα δεδομένα επιστρέφονται χρησιμοποιώντας επιλεγμένες παραμέτρους που περιλαμβάνουν υπολογισμένες μεταβλητές παρέχοντας πολλαπλά σύνολα.

Τελικά

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

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

Η έννοια της αποθηκευμένης διαδικασίας

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

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

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

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

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

Αποθηκευμένες διαδικασίες σε περιβάλλον MS SQL Server

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

Τύποι αποθηκευμένων διαδικασιών

Ο SQL Server έχει διάφορους τύπους αποθηκευμένες διαδικασίες.

  • Σύστημα αποθηκευμένες διαδικασίεςσχεδιασμένο για την εκτέλεση διαφόρων διοικητικών ενεργειών. Σχεδόν όλες οι δραστηριότητες διαχείρισης διακομιστή εκτελούνται με τη βοήθειά τους. Μπορούμε να πούμε ότι συστημικό αποθηκευμένες διαδικασίεςείναι μια διεπαφή που παρέχει εργασία με πίνακες συστήματος, η οποία τελικά καταλήγει στην αλλαγή, προσθήκη, διαγραφή και ανάκτηση δεδομένων από πίνακες συστήματος τόσο των βάσεων δεδομένων χρήστη όσο και του συστήματος. Σύστημα αποθηκευμένες διαδικασίεςέχουν το πρόθεμα sp_, αποθηκεύονται στη βάση δεδομένων του συστήματος και μπορούν να κληθούν στο πλαίσιο οποιασδήποτε άλλης βάσης δεδομένων.
  • Εθιμο αποθηκευμένες διαδικασίεςυλοποιήσει ορισμένες ενέργειες. Αποθηκευμένες διαδικασίες– ένα πλήρες αντικείμενο βάσης δεδομένων. Ως αποτέλεσμα, το καθένα αποθηκευμένη διαδικασίαβρίσκεται σε μια συγκεκριμένη βάση δεδομένων όπου εκτελείται.
  • Προσωρινός αποθηκευμένες διαδικασίεςυπάρχουν μόνο για λίγο, μετά την οποία καταστρέφονται αυτόματα από τον διακομιστή. Χωρίζονται σε τοπικές και παγκόσμιες. Τοπική προσωρινή αποθηκευμένες διαδικασίεςμπορούν να κληθούν μόνο από τη σύνδεση στην οποία δημιουργήθηκαν. Όταν δημιουργείτε μια τέτοια διαδικασία, πρέπει να της δώσετε ένα όνομα που να ξεκινά με έναν χαρακτήρα #. Όπως όλα τα προσωρινά αντικείμενα, αποθηκευμένες διαδικασίεςαυτού του τύπου διαγράφονται αυτόματα όταν ο χρήστης αποσυνδεθεί ή ο διακομιστής επανεκκινηθεί ή σταματήσει. Παγκόσμια προσωρινή αποθηκευμένες διαδικασίεςείναι διαθέσιμα για οποιεσδήποτε συνδέσεις από διακομιστή που έχει την ίδια διαδικασία. Για να το ορίσετε, απλώς δώστε του ένα όνομα που ξεκινά με τους χαρακτήρες ## . Αυτές οι διαδικασίες διαγράφονται κατά την επανεκκίνηση ή τη διακοπή του διακομιστή ή όταν η σύνδεση στο περιβάλλον στο οποίο δημιουργήθηκαν έχει κλείσει.

Δημιουργία, τροποποίηση και διαγραφή αποθηκευμένων διαδικασιών

Δημιουργία αποθηκευμένη διαδικασίαπεριλαμβάνει την επίλυση των παρακάτω προβλημάτων:

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

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

<определение_процедуры>::= (ΔΗΜΙΟΥΡΓΙΑ | ΑΛΛΑΓΗ ) PROC procedure_name [;number] [(@parameter_name data_type ) [=default] ][,...n] AS sql_operator [...n]

Ας δούμε τις παραμέτρους αυτής της εντολής.

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

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

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

Για να προσδιορίσετε τον τύπο δεδομένων που το αντίστοιχο αποθηκευμένη παράμετρος διαδικασίας, οποιοιδήποτε τύποι δεδομένων SQL είναι κατάλληλοι, συμπεριλαμβανομένων εκείνων που ορίζονται από το χρήστη. Ωστόσο, ο τύπος δεδομένων CURSOR μπορεί να χρησιμοποιηθεί μόνο ως παράμετρος εξόδου αποθηκευμένη διαδικασία, δηλ. καθορίζοντας τη λέξη-κλειδί OUTPUT.

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

Η λέξη-κλειδί VARYING χρησιμοποιείται σε συνδυασμό με την παράμετρο OUTPUT, η οποία είναι τύπου CURSOR. Αυτό καθορίζει παράμετρος εξόδουθα υπάρξει ένα σύνολο αποτελεσμάτων.

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

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

Η παράμετρος FOR REPLICATION απαιτείται κατά την αναπαραγωγή δεδομένων και την ενεργοποίηση των δημιουργημένων αποθηκευμένη διαδικασίαως άρθρο προς δημοσίευση.

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

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

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

ΔΙΑΔΙΚΑΣΙΑ ΑΠΟΡΡΙΨΗΣ (όνομα_διαδικασίας) [,...n]

Εκτέλεση Αποθηκευμένης Διαδικασίας

Για εκτελέστε μια αποθηκευμένη διαδικασίαΗ εντολή που χρησιμοποιείται είναι:

[[ EXEC [ UTE] όνομα_διαδικασίας [;αριθμός] [[@parameter_name=](τιμή | @variable_name) |][,...n]

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

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

Όταν η λέξη-κλειδί DEFAULT καθορίζεται για μια παράμετρο κατά την κλήση μιας διαδικασίας, θα χρησιμοποιηθεί Προεπιλεγμένη τιμή. Φυσικά, η καθορισμένη λέξη DEFAULT επιτρέπεται μόνο για τις παραμέτρους για τις οποίες έχει οριστεί Προεπιλεγμένη τιμή.

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

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

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

CREATE PROC my_proc1 AS SELECT Προϊόν.Όνομα, Προϊόν.Τιμή*Συναλλαγή.Ποσότητα ΩΣ Κόστος, Πελάτης.Επώνυμο ΑΠΟ Πελάτη ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ (Προϊόν Εσωτερική ΣΥΜΜΕΤΟΧΗ Συναλλαγή ON Product.ProductCode=Transaction.ProductCode) ONREtomerCodeusCustomer. Πελάτης .Επώνυμο='Ivanov' Παράδειγμα 12.1. Διαδικασία για την απόκτηση των ονομάτων και των αξιών των αγαθών που αγόρασε ο Ivanov.

Για πρόσβαση στη διαδικασίαμπορείτε να χρησιμοποιήσετε τις εντολές:

EXEC my_proc1 ή my_proc1

Η διαδικασία επιστρέφει ένα σύνολο δεδομένων.

Παράδειγμα 12.2. Διαδικασία χωρίς παραμέτρους. Δημιουργία διαδικασίας μείωσης της τιμής των αγαθών πρώτης κατηγορίας κατά 10%.

Για πρόσβαση στη διαδικασίαμπορείτε να χρησιμοποιήσετε τις εντολές:

EXEC my_proc2 ή my_proc2

Η διαδικασία δεν επιστρέφει δεδομένα.

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

ΔΗΜΙΟΥΡΓΙΑ PROC my_proc3 @k VARCHAR(20) AS SELECT Προϊόν.Όνομα, Προϊόν.Τιμή*Συναλλαγή.Ποσότητα ΩΣ Κόστος, Πελάτης.Επώνυμο ΑΠΟ Πελάτη ΕΣΩΤΕΡΙΚΗ ΣΥΜΜΕΤΟΧΗ (Προϊόν Εσωτερική Συμφωνία ΣΥΜΜΕΤΟΧΗΣ ΣΤΟ Product.ProductCode=Transaction.Product). CustomerCode =Transaction.ClientCode WHERE Client.LastName=@k Παράδειγμα 12.3. Μια διαδικασία για τη λήψη των ονομάτων και των τιμών των ειδών που αγοράζονται από έναν συγκεκριμένο πελάτη.

Για πρόσβαση στη διαδικασίαμπορείτε να χρησιμοποιήσετε τις εντολές:

EXEC my_proc3 "Ivanov" ή my_proc3 @k="Ivanov"

Παράδειγμα 12.4.. Δημιουργήστε μια διαδικασία για τη μείωση της τιμής ενός προϊόντος ενός δεδομένου τύπου σύμφωνα με το καθορισμένο %.

Για πρόσβαση στη διαδικασίαμπορείτε να χρησιμοποιήσετε τις εντολές:

EXEC my_proc4 "Βάφλες",0.05 ή EXEC my_proc4 @t="Βάφλες", @p=0.05

Παράδειγμα 12.5. Διαδικασία με παραμέτρους εισαγωγήςκαι προεπιλεγμένες τιμές. Δημιουργήστε μια διαδικασία για τη μείωση της τιμής ενός προϊόντος ενός δεδομένου τύπου σύμφωνα με το καθορισμένο %.

CREATE PROC my_proc5 @t VARCHAR(20)='Candy', @p FLOAT=0.1 ΩΣ ΕΝΗΜΕΡΩΣΗ ΣΕΤ προϊόντος Τιμή=Τιμή*(1-@p) ΟΠΟΥ Τύπος=@t Παράδειγμα 12.5. Διαδικασία με παραμέτρους εισαγωγής και προεπιλεγμένες τιμές. Δημιουργήστε μια διαδικασία για τη μείωση της τιμής ενός προϊόντος ενός δεδομένου τύπου σύμφωνα με το καθορισμένο %.

Για πρόσβαση στη διαδικασίαμπορείτε να χρησιμοποιήσετε τις εντολές:

EXEC my_proc5 "Waffles",0.05 ή EXEC my_proc5 @t="Waffles", @p=0.05 ή EXEC my_proc5 @p=0.05

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

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

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

CREATE PROC my_proc6 @m INT, @s FLOAT OUTPUT AS SELECT @s=Sum(Product.Price*Transaction.Quantity) FROM Product INNER JOIN Συναλλαγή ON Product.ProductCode=Transaction.ProductCode GROUP BY Month(TranthingAvsaction). Συναλλαγή.Ημερομηνία)=@μ Παράδειγμα 12.6. Διαδικασία με παραμέτρους εισόδου και εξόδου. Δημιουργήστε μια διαδικασία για τον προσδιορισμό του συνολικού κόστους των αγαθών που πωλήθηκαν σε έναν συγκεκριμένο μήνα.

Για πρόσβαση στη διαδικασίαμπορείτε να χρησιμοποιήσετε τις εντολές:

ΔΗΛΩΣΤΕ @st FLOAT EXEC my_proc6 1,@st OUTPUT SELECT @st

Αυτό το μπλοκ εντολών σάς επιτρέπει να προσδιορίσετε το κόστος των αγαθών που πωλήθηκαν τον Ιανουάριο ( παράμετρος εισόδουο μήνας ορίζεται ως 1).

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

Αρχικά, θα αναπτύξουμε μια διαδικασία για τον προσδιορισμό της εταιρείας στην οποία εργάζεται ο εργαζόμενος.

Παράδειγμα 12.7.Χρήση ένθετες διαδικασίες. Δημιουργήστε μια διαδικασία για τον προσδιορισμό της συνολικής ποσότητας αγαθών που αγόρασε η εταιρεία όπου εργάζεται ένας συγκεκριμένος εργαζόμενος.

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

CREATE PROC my_proc8 @fam VARCHAR(20), @kol INT OUTPUT AS DECLARE @firm VARCHAR(20) EXEC my_proc7 @fam,@firm OUTPUT SELECT @kol=Sum(Transaction.Quantity) FROM Client INNER JOIN Client.ClientON . Transaction.ClientCode GROUP BY Client.Firm HAVING Client.Company=@firm Παράδειγμα 12.7. Δημιουργήστε μια διαδικασία για τον προσδιορισμό της συνολικής ποσότητας αγαθών που αγόρασε η εταιρεία όπου εργάζεται ένας συγκεκριμένος εργαζόμενος.

Η διαδικασία καλείται χρησιμοποιώντας την εντολή:

ΔΗΛΩΣΤΕ @k INT EXEC my_proc8 ‘Ivanov’,@k OUTPUT SELECT @k

Συνεχίζοντας το θέμα:
Windows

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

Νέα άρθρα
/
Δημοφιλής