Αποθηκευμένες Διαδικασίες Stored Routines (Procedures & Functions) Αυγερινός Αραμπατζής avi@ee.duth.gr www.aviarampatzis.com Βάσεις Δεδομένων Stored Procedures 1
Stored Routines (1/2) Τμήματα κώδικα τα οποία είναι αποθηκευμένα μέσα στο ΣΔΒΔ και εκτελούνται στον server Παραδείγματα χρήσης των stored routines είναι: Διαδικασίες που εκτελούνται από πολλά προγράμματα τα οποία χρησιμοποιούν τη ΒΔ μπορούν να υλοποιηθούν μια φορά ως stored procedures ή functions μέσα στη ΒΔ Η εκτέλεση κώδικα μέσα στη βάση σε περιπτώσεις που θέλουμε να μειώσουμε την μεταφορά δεδομένων. Τα stored routines εκτελούνται μέσα στη βάση και επομένως έχουν πρόσβαση σε όσα δεδομένα θέλουμε χωρίς να φορτώνουμε το δίκτυο με τη μετακίνηση δεδομένων μεταξύ server και client Βάσεις Δεδομένων Stored Procedures 2
Stored Routines (2/2) Παραδείγματα χρήσης των stored routines είναι: Τα stored routines συμπληρώνουν την έννοια των Όψεων (views). Μπορούμε με όψεις και stored procedures να υλοποιήσουμε ένα νέο επίπεδο μεταξύ του σχήματος της βάσης και των client εφαρμογών Μπορούμε να υλοποιήσουμε σύνθετους περιορισμούς που δεν μπορούν να υποστηριχθούν με Triggers και Assertions Βάσεις Δεδομένων Stored Procedures 3
Γενική Δομή μιας Stored Routine CREATE PROCEDURE <name> (<params>) <local declarations> <procedure body>; CREATE FUNCTION <name> (<params>) RETURNS <return type> <local declarations> <function body>; Για να καλέσουμε μια ρουτίνα: CALL <name> (<params>) Βάσεις Δεδομένων Stored Procedures 4
Παράδειγμα (1/2) Έστω η σχέση: CREATE TABLE COMPANY ( company_id integer primary key, name varchar(30) ); Βάσεις Δεδομένων Stored Procedures 5
Παράδειγμα (2/2) CREATE PROCEDURE maintain_company ( IN action_in VARCHAR(6), IN id_in INTEGER, IN name_in VARCHAR(30) := NULL ) BEGIN IF action_in = 'DELETE' THEN DELETE FROM company WHERE company_id = id_in; ELSIF action_in = 'INSERT' THEN INSERT INTO company (company_id, name) VALUES (id_in, name_in); END IF; END; CALL maintain_company('insert', 34, 'Coca Cola'); CALL maintain_company('delete', 34); Βάσεις Δεδομένων Stored Procedures 6
Stored Function CREATE FUNCTION WEIGHTED_AVERAGE (n1 INT, n2 INT, n3 INT) RETURNS INT BEGIN DECLARE avg INT; SET avg = (n1+n2+2*n3)/4; RETURN avg; END; Βάσεις Δεδομένων Stored Procedures 7
Χρήσιμες Εντολές Για να δούμε μια λίστα με όλες τις αποθηκευμένες ρουτίνες και metadata (πχ ημερομηνία υλοποίησης, χρήστης, κ.α.): SHOW PROCEDURE STATUS Για να δούμε τον ορισμό μιας συγκεκριμένης ρουτίνας SHOW CREATE PROCEDURE <name> Για να μπορέσουμε να χρησιμοποιήσουμε το ; στον ορισμό ρουτίνας (δλδ χωρίς να προσπαθήσει η MySQL να εκτελέσει τις μεμονωμένες εντολές): DELIMITER <ορισμός ρουτίνας> DELIMITER ; Βάσεις Δεδομένων Stored Procedures 8
Java Stored Procedures Μπορούμε (στην Oracle) να φορτώσουμε κώδικα (κλάσεις) Java μέσα στο ΣΔΒΔ και να το καλέσουμε ως συνάρτηση. Δεν υποστηρίζεται ακόμα στην MySQL! //Oscar.java public class Oscar { // return a quotation from Oscar Wilde public static String quote() { return "I can resist everything except temptation."; } } Μεταγλωττίζουμε την Java με: javac Oscar.java Βάσεις Δεδομένων Stored Procedures 9
Φόρτωμα της Κλάσης (Oracle) -- Από Command Console loadjava -user teamxx/passwd@oradb.tios.alexandria Oscar.class -- Από κονσόλα SQL: CREATE OR REPLACE FUNCTION oscar_quote RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'Oscar.quote() return java.lang.string'; -- Από SQL+ (sqlplus) VARIABLE thequote VARCHAR2(50); CALL oscar_quote() INTO :thequote; PRINT thequote; -- Από κονσόλα SQL: select oscar_quote() from dual; Βάσεις Δεδομένων Stored Procedures 10
Μειονεκτήματα των Stored Routines Μπορούν να δημιουργήσουν υψηλό φόρτο (σε μνήμη και επεξεργαστή) στον server Η MySQL επιτρέπει stored routines γραμμένες μόνο σε SQL, στην οποία μπορεί να είναι δύσκολο να γραφτεί μια πολύπλοκη ρουτίνα (σε αντίθεση με άλλες γλώσσες όπως η Java, C#, C++, κ.α. Δύσκολο το debugging Βάσεις Δεδομένων Stored Procedures 11
Πηγές/Αναφορές Βιβλίο Μαθήματος, Κεφάλαιο 9 Online manuals MySQL ή/και Oracle Βάσεις Δεδομένων Stored Procedures 12