Αποθηκευμένες Διαδικασίες και Εναύσματα Δρ. Παναγιώτης Συμεωνίδης
Αποθηκευμένες Διαδικασίες Είναι τμήματα προγράμματος Βάσης Δεδομένων (διαδικασίες\procedures ή συναρτήσεις\functions) που αποθηκεύονται μόνιμα και εκτελούνται στον διακομιστή της Βάσης Δεδομένων.
Αποθηκευμένες Διαδικασίες Οι αποθηκευμένες διαδικασίες είναι προγράμματα τα οποία έχουν τα παρακάτω χαρακτηριστικά: Αποθηκεύονται και τρέχουν στον διακομιστή της Βάσης. Καλούνται με το όνομα τους από οποιαδήποτε εφαρμογή συνδεθεί με τη Βάση. Η εφαρμογή μπορεί να χωριστεί σε δύο μέρη: – Η εφαρμογή τρέχει στον πελάτη – Η αποθηκευμένη διαδικασία στον διακομιστή. Περιέχει προγραμματιστικές εντολές (if, loops) αλλά ταυτόχρονα μπορεί να χειριστεί SQL κώδικα.
Χρήσεις Οι αποθηκευμένες διαδικασίες μπορούν τα έχουν την παρακάτω χρήση: – Για έλεγχο πολύπλοκων περιορισμών. – Για απόκρυψη του κώδικα της διαδικασίας. – Για δημιουργία βιβλιοθήκης έτοιμων συναρτήσεων στον διακομιστή.
Πλεονεκτήματα Βελτιώνουν την ασφάλεια του DBMS. Υποστηρίζουν το «κρύψιμο» (encapsulation) του κώδικα τους, και με σωστό σχεδιασμό και συστηματική χρήση τους είναι δυνατόν να εξαφανιστεί η δομή της βάσης από τους χρήστες. Βελτιώνει την ταχύτητα απόκρισης του εξυπηρετητή της Βάσης. Αυτό οφείλεται στο ότι είναι προμεταγλωττισμένες (precompiled) και έτσι εκτελούνται γρηγορότερα. Επίσης, αντικαθιστώντας ένα σύνολο SQL εντολών με την κλήση μιας συνάρτησης που περιέχει όλες αυτές τις SQL εντολές, «ελαφρύνει» την κίνηση στο δίκτυο μεταξύ πελάτη και διακομιστή.
Δομή των Αποθηκευμένων Διαδικασιών Η δήλωση της περιέχει κώδικα SQL και αποτελείται από τα παρακάτω: Το όνομα της αποθηκευμένης διαδικασίας Τις παραμέτρους που θα πάρει Τον τύπο της παραμέτρου Το είδος της παραμέτρου (IN, OUT, INOUT) Τη γλώσσα στην οποία είναι γραμμένη, π.χ. SQL
Παράδειγμα Δήλωσης CREATE PROCEDURE ΟΝΟΜΑ (IN ΠΑΡΑΜΕΤΡΟΣ ΤΥΠΟΣ, OUT ΠΑΡΑΜΕΤΡΟΣ ΤΥΠΟΣ, INOUT ΠΑΡΑΜΕΤΡΟΣ ΤΥΠΟΣ ) LANGUAGE SQL BEGIN -- END (ΣΥΜΒΟΛΟ ΤΕΛΟΥΣ)
Σώμα Αποθηκευμένης Διαδικασίας Μέσα στο σώμα μίας διαδικασίας μπορούν να περιέχονται τα παρακάτω: Δηλώσεις – DECLARE – DECLARE CURSOR Υποθετικές φράσεις – CASE – IF Βρόγχοι – FOR – REPEAT – WHILE Εντολές Μεταφορές – CALL – GOTO – RETURN
Declare Με αυτήν την εντολή δηλώνουμε μεταβλητές. Σύνταξη: DECLARE [DEFAULT ]; Η δήλωση των μεταβλητών είναι τοπική. Οι μεταβλητές δεν είναι case sensitive γιατί μετατρέπονται σε κεφαλαία τα γράμματα τους Για να μεταβληθεί η τιμή μια μεταβλητής μετά τη δήλωση πρέπει να χρησιμοποιηθεί η εντολή SET.
Case Η εντολή CASE χρησιμοποιείται ως μία υποθετική φράση όπου όταν ικανοποιηθεί εκτελείται η αντίστοιχη εντολή. Υπάρχουν δύο τύποι CASE: _ O απλός, ο οποίος στηρίζεται σε μία απλή τιμή (literal) _O σύνθετος, οποίος στηρίζεται σε μία έκφραση (expression) _Μετά το WHEN που ικανοποιεί την CASE ακολουθεί η εκτελέσιμη φράση
Example Case CREATE PROCEDURE UPDATE_DEPT (IN p_workdept) 2. LANGUAGE SQL 3. BEGIN 4. DECLARE v_workdept CHAR(3); 5. SET v_workdept = p_workdept; 6. CASE v_workdept 7. WHEN 'A00' THEN 8. UPDATE department SET deptname = 'D1'; 9. WHEN 'B01' THEN 10. UPDATE department SET deptname = 'D2'; 11. ELSE 12. UPDATE department SET deptname = 'D3'; 13. END CASE 14. END
Example if 1. CREATE PROCEDURE UPDATE_SAL (IN empNum CHAR(6), IN rating SMALLINT) 2. LANGUAGE SQL 3. BEGIN 4. IF rating = 1 THEN 5. UPDATE employee SET salary = salary * 1.10, bonus = 1000 WHERE empno = empNum; 6. ELSEIF rating = 2 THEN 7. UPDATE employee SET salary = salary * 1.05, bonus = 500 WHERE empno = empNum; 8. ELSE 9. UPDATE employee SET salary = salary * 1.03, bonus = 0 WHERE empno = empNum; 10. END IF; 11. END
For Loop for as [ ] cursor for do end for;
For Loop Example create procedure myproc begin FOR each_record AS cursor1 CURSOR FOR SELECT cusnbr, cuscrd FROM customer DO UPDATE ordapplib.customer SET cuscrd = cuscrd * 1.1 WHERE CURRENT OF cursor1; END FOR; end
Triggers –Εναύσματα Μία διαδικασία την οποία δηλώνει ο Διαχειριστής της Βάσης Δεδομένων και η οποία ενεργοποιείται αυτόματα από το ΣΔΒΔ κάθε φορά που συμβαίνουν μεταβολές ορισμένου τύπου στα δεδομένα ονομάζεται έναυσμα.
Δομή ενός Εναύσματος Στην περιγραφή ενός εναύσματος ενυπάρχουν τρία διακριτά μέρη: Γεγονός: μία μεταβολή στη βάση δεδομένων η οποία ενεργοποιεί το έναυσμα. Συνθήκη: ένα αίτημα ή ένας έλεγχος που εκτελείται με την ενεργοποίηση του εναύσματος. Ενέργεια: μία διαδικασία η οποία εκτελείται όταν ισχύει η συνθήκη και ενεργοποιείται το έναυσμα.
Είδη Εναυσμάτων DML φράσεις (DELETE, INSERT, UPDATE) DDL φράσεις (CREATE, ALTER, DROP) Λειτουργίες Βάσης Δεδομένων (LOGON, LOGOFF)
Πότε εκτελείται Before Εκτελείται πριν συμβούν μεταβολές στη βάση. Παράδειγμα: Για ένα έναυσμα το οποίο αρχικοποιεί μία μεταβλητή η οποία αριθμεί το πλήθος των κατάλληλων προς εισαγωγή εγγραφών, η εκτέλεση του πρέπει να προηγείται. After Εκτελείται αφού συμβούν μεταβολές στη βάση. Παράδειγμα: Για ένα έναυσμα το οποίο αυξάνει τον αντίστοιχο μετρητή κάθε φορά που καταχωρείται μία εγγραφή, η εκτέλεση του είναι πιο λογικό να έπεται.
Πότε εκτελείται- Παράδειγμα CREATE TRIGGER όνομα-trigger { INSERT | DELETE | UPDATE } [ OF όνομα_στήλης [, όνομα_στήλης]* ] ON όνομα_πίνακα REFERENCING FOR EACH ROW / FOR EACH STATEMENT MODE DB2ROW / DB2SQL WHEN (συνθήκη) BEGIN Σώμα του trigger END
Κανόνες για Εναύσματα Δεν πρέπει να περιλαμβάνει δυναμικές παραμέτρους. Δεν πρέπει να εκτελεί εντολές create, alter, ή drop για τον πίνακα που είναι ορισμένο το έναυσμα. Δεν πρέπει να δημιουργεί ή να αφαιρεί ένα index για τον πίνακα που είναι ορισμένο το έναυσμα. Δεν πρέπει να δημιουργεί ή να αφαιρεί ένα έναυσμα για τον πίνακα που είναι ορισμένο το έναυσμα.
Παράδειγμα Εναύσματος CREATE TRIGGER SAILORS1 AFTER INSERT ON SAILORS REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL UPDATE SAILORS SET AGE_UPDATED = CURRENT TIMESTAMP WHERE SID = N.SID
Παράδειγμα σε SQL Server Create Trigger loan_insert on loan for insert as Update copy Set on_loan = ‘Y’ From copy c inner join inserted I on c.isbn =i.isbn and c.copy_no = i.copy_no