Εργαστήριο Βάσεων Δεδομένων 2012-2013 Άσκηση 4 Ημερομηνία Παράδοσης: 14 Ιανουαρίου 2013 Σκοπός της άσκησης είναι, σε μια έτοιμη βάση δεδομένων: 1. Υλοποίηση stored procedures. 2. Υλοποίηση triggers. Σημείωση #1: Τα scripts που αποτελούν τα παραδοτέα της άσκησης θα πρέπει να τρέχουν χωρίς λάθη στη βάση που δίνεται ως προτεινόμενη λύση στην δεύτερη άσκηση και όχι στη βάση που παραδώσατε εσείς. Για τη βάση που δίνεται στη σελίδα του μαθήματος ισχύει το κείμενο προδιαγραφών, το και το σχεσιακό που περιλαμβάνονται στη δεύτερη άσκηση. Προσοχή! Για τις ανάγκες της άσκησης 4 ανανεώθηκε στις 28 Δεκεμβρίου η λύση της άσκησης 2. Ξανακατεβάστε τα create και insert scripts πριν απαντήσετε στα ερωτήματα! Σημείωση #2: Στα scripts πρέπει να συμπεριλάβετε τις κατάλληλες delimiter εντολές έτσι ώστε να τρέχουν απευθείας χωρίς να προκαλείται λάθος και να επιτρέπει την εκτέλεση άλλων queries μετά, με τον αρχικό delimiter. Stored Procedures 1. Stored procedure η οποία δέχεται ως είσοδο τον κωδικό μιας επιχείρησης και εκτυπώνει την επωνυμία της και τον τίτλο, την επωνυμία και τον τίτλο της γονικής επιχείρησης κοκ μέχρι τη ρίζα του δέντρου των επιχειρήσεων. Ένα παράδειγμα κλήσης για αυτή την stored procedure είναι το ακόλουθο: 2. Stored procedure η οποία δέχεται ως είσοδο τον κωδικό μιας ΔΟΥ, εκτυπώνει τον κωδικό, την επωνυμία και το διακριτικό τίτλο κάθε επιχείρησης από αυτή τη ΔΟΥ χωριστά και για κάθε επωνυμία εκτυπώνει τη λίστα των ελεγκτών που την έχουν ελέγξει (ονοματεπώνυμο, ΑΦΜ, Σ.Ο.Ε.Λ., τύπος). Ένα παράδειγμα κλήσης για αυτή την stored procedure είναι το ακόλουθο:
Προαιρετικά #1: Μπορείτε να μορφοποιήσετε την έξοδο της stored procedure για να είναι όπως παρακάτω? Προαιρετικά #2: Πως μπορούμε να εκτυπώσουμε τα αποτελέσματα όπως παρακάτω?
3. Stored procedure η οποία να δέχεται ως είσοδο τον κωδικό μιας επιχείρησης για να την διαγράψει. Πριν πραγματοποιήσει την διαγραφή, μεταφέρει τα υποκαταστήματα αυτής της επιχείρησης στη γονική της επιχείρηση. Ένα παράδειγμα λειτουργίας αυτής της stored procedure είναι το ακόλουθο: 4. Stored Procedure η οποία καλείται με παράμετρο τον κωδικό μιας επιχείρησης, ελέγχει όλα τα ποσοστά μετοχών που έχουν εισαχθεί για αυτή την επιχείρηση και εξετάζει αν έχουν άθροισμα λιγότερο ή ίσο με 100%. Αν όχι, τότε επιχειρεί να διορθώσει τα ποσοστά διαγράφοντας την καταλληλότερη εγγραφή μετοχών. Ως καταλληλότερη εγγραφή θεωρείται αυτή της οποίας η διαγραφή θα φέρει το ποσοστό όσο πιο κοντά στο 100% γίνεται, ανεξάρτητα με το αν είναι πάνω ή κάτω απ' το 100%. Αν το συνολικό ποσοστό δεν πέσει κάτω από το 100% με τη διαγραφή, τότε κάνει και δεύτερη, τρίτη κοκ έως ότου το ποσοστό να είναι μικρότερο ή ίσο του 100%. Σημείωση: Το ποσοστό κατά σύμβαση αποθηκεύεται στο percentage στη μορφή μέχρι την εκατοντάδα. Δηλαδή 45.00 για το 45% και όχι 0.45. Παρακάτω είναι παραδείγματα κλήσης της stored procedure με βάση τα νέα δεδομένα για τη λύση της άσκησης 2!
Triggers 1. Trigger ο οποίος κατά την εισαγωγή ενός φυσικού προσώπου ελέγχει αν το email είναι σε σωστή μορφή (το απλό <κάτι>@<κάτιάλλο>.<ext>). Αν όχι, αποτρέπει την εισαγωγή. 2. Trigger ο οποίος κατά την εισαγωγή μιας επιχείρησης σε ένα επιμελητήριο ελέγχει εαν ο τίτλος είναι μοναδικός για τις επιχειρήσεις του επιμελητηρίου στο οποίο ανήκει. Αν δεν είναι μοναδικός, αποτρέπει την εισαγωγή. 3. Trigger ο οποίος κατά την εισαγωγή των πληροφοριών ενός ελέγχου από έναν ελεγκτή, ελέγχει εάν η ημερομηνία έναρξης και η ημερομηνία λήξης απέχουν τουλάχιστον μια εβδομάδα. Αν όχι, μεταβάλλει την ημερομηνία λήξης έτσι ώστε να απέχει ακριβώς μια εβδομάδα από την ημερομηνία έναρξης. Σημείωση: Δείτε τις συναρτήσεις Date και Time της MySQL (για την έκδοση 5.5: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html) Παρατηρήσεις: Επειδή διατυπώθηκαν πολλές απορίες σε σχέση με τη σχέση «υποκατάστημα» διευκρινίζουμε ότι σημαίνει ότι σε κάθε επιχείρηση αποθηκεύεται το κλειδί της γονικής της επιχείρησης, δηλαδή ποιάς είναι υποκατάστημα η συγκεκριμένη επιχείρηση. Το πεδίο branch της βάσης περιέχει το κλειδί της επιχείρησης στην οποία είναι branch η τρέχουσα εγγραφή, ενώ αν δεν είναι branch και είναι γονική, τότε περιέχει NULL ή τον ίδιο της τον κωδικό. Με αυτή την παραδοχή να λύσετε την παραπάνω άσκηση. Για παράδειγμα αν έχουμε μια εγγραφή με κλειδί 1 για την επιχείρηση Α και μια εγγραφή με κλειδί 2 για την επιχείρηση Β και στην εγγραφή της Β περιέχεται η τιμή 1 στο πεδίο branch, τότε αυτό σημαίνει ότι η Α είναι γονική της Β, δηλαδή ότι η Β είναι υποκατάστημα της Α. Παράδοση: Η παράδοση της εργασίας θα γίνει ηλεκτρονικά μέσω της υπηρεσίας υποβολής εργασιών στην οποία έχετε πρόσβαση μέσω της διεύθυνσης http://dblab.ceid.upatras.gr (απαιτείται εγγραφή). Το παραδοτέο θα είναι ένα συμπιεσμένο αρχείο με όνομα dbxxxx2012.zip όπου xxxx o AM σας, το οποίο θα περιλαμβάνει: 1. Το txt που απαντούν στα παραπάνω ερωτήματα 2. Ένα αρχείο txt με το όνομα και ΑΜ σας και, αν είναι απαραίτητο, οδηγίες και διευκρινίσεις για την υλοποίησή σας. Ως ημερομηνία παράδοσης της εργασίας ορίζεται η 14 η Ιανουαρίου 2013. Καλή επιτυχία!!!