Oracle Συλλογές PL/SQL: Varrays, Nested & Index by Tables
Τι είναι η Συλλογή;
Μια συλλογή είναι μια διατεταγμένη ομάδα στοιχείων συγκεκριμένων τύπων δεδομένων. Μπορεί να είναι μια συλλογή απλών τύπων δεδομένων ή πολύπλοκων τύπων δεδομένων (όπως ορίζονται από τον χρήστη ή τύπους εγγραφών).
Στη συλλογή, κάθε στοιχείο προσδιορίζεται από έναν όρο που ονομάζεται "υπογεγραμμένη." Σε κάθε στοιχείο της συλλογής εκχωρείται ένας μοναδικός δείκτης. Τα δεδομένα σε αυτήν τη συλλογή μπορούν να υποστούν επεξεργασία ή να ληφθούν με αναφορά σε αυτόν τον μοναδικό δείκτη.
Οι συλλογές είναι τα πιο χρήσιμα πράγματα όταν χρειάζεται επεξεργασία ή χειραγώγηση μεγάλων δεδομένων του ίδιου τύπου. Οι συλλογές μπορούν να συμπληρωθούν και να μεταχειριστούν στο σύνολό τους χρησιμοποιώντας την επιλογή «ΜΥΖΟΣ» στο Oracle.
Οι συλλογές ταξινομούνται με βάση τη δομή, τον δείκτη και την αποθήκευση όπως φαίνεται παρακάτω.
- Ευρετήριο ανά πίνακες (γνωστοί και ως Associative Array)
- Ένθετα τραπέζια
- Varrays
Σε οποιοδήποτε σημείο, τα δεδομένα στη συλλογή μπορούν να αναφέρονται με τρεις όρους Όνομα συλλογής, Δείκτης, Όνομα πεδίου/στήλης ως « ( ). ". Θα μάθετε για αυτές τις προαναφερθείσες κατηγορίες συλλογής περαιτέρω στην παρακάτω ενότητα.
Varrays
Το Varray είναι μια μέθοδος συλλογής στην οποία το μέγεθος του πίνακα είναι σταθερό. Το μέγεθος του πίνακα δεν μπορεί να ξεπεραστεί από την καθορισμένη τιμή του. Ο δείκτης του Varray έχει αριθμητική τιμή. Ακολουθούν τα χαρακτηριστικά του Varrays.
- Το μέγεθος του ανώτατου ορίου είναι σταθερό
- Συμπληρωμένα διαδοχικά ξεκινώντας με τον δείκτη '1'
- Αυτός ο τύπος συλλογής είναι πάντα πυκνός, δηλαδή δεν μπορούμε να διαγράψουμε κανένα στοιχείο πίνακα. Το Varray μπορεί να διαγραφεί στο σύνολό του ή μπορεί να περικοπεί από το τέλος.
- Δεδομένου ότι είναι πάντα πυκνό στη φύση του, έχει πολύ λιγότερη ευελιξία.
- Είναι πιο κατάλληλο να χρησιμοποιείται όταν το μέγεθος του πίνακα είναι γνωστό και να εκτελούνται παρόμοιες δραστηριότητες σε όλα τα στοιχεία του πίνακα.
- Ο δείκτης και η ακολουθία παραμένουν πάντα σταθεροί, δηλαδή ο δείκτης και ο αριθμός της συλλογής είναι πάντα ο ίδιος.
- Πρέπει να αρχικοποιηθούν πριν χρησιμοποιηθούν σε προγράμματα. Οποιαδήποτε λειτουργία (εκτός από τη λειτουργία ΥΠΑΡΧΕΙ) σε μια μη αρχικοποιημένη συλλογή θα προκαλέσει σφάλμα.
- Μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων, το οποίο είναι ορατό σε όλη τη βάση δεδομένων ή μέσα στο υποπρόγραμμα, το οποίο μπορεί να χρησιμοποιηθεί μόνο σε αυτό το υποπρόγραμμα.
Το παρακάτω σχήμα θα εξηγήσει την κατανομή μνήμης του Varray (πυκνό) διαγραμματικά.
δείκτης | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
αξία | X Y Z | Dfv | Sde | Cxs | Vbc | Μαλακός | Qwe |
Σύνταξη για VARRAY:
TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
- Στην παραπάνω σύνταξη, το type_name δηλώνεται ως VARRAY του τύπου 'DATA_TYPE' για το δεδομένο όριο μεγέθους. Ο τύπος δεδομένων μπορεί να είναι είτε απλός είτε σύνθετος.
Ένθετοι πίνακες
Ένας ένθετος πίνακας είναι μια συλλογή στην οποία το μέγεθος του πίνακα δεν είναι σταθερό. Έχει τον αριθμητικό τύπο δείκτη. Ακολουθούν περισσότερες περιγραφές σχετικά με τον τύπο ένθετου πίνακα.
- Ο Ένθετος πίνακας δεν έχει ανώτερο όριο μεγέθους.
- Δεδομένου ότι το ανώτερο όριο μεγέθους δεν έχει καθοριστεί, η συλλογή, η μνήμη πρέπει να επεκτείνεται κάθε φορά πριν τη χρησιμοποιήσουμε. Μπορούμε να επεκτείνουμε τη συλλογή χρησιμοποιώντας τη λέξη-κλειδί «EXTEND».
- Συμπληρώνεται διαδοχικά ξεκινώντας με τον δείκτη '1'.
- Αυτός ο τύπος συλλογής μπορεί να είναι και των δύο πυκνό και αραιό, δηλαδή μπορούμε να δημιουργήσουμε τη συλλογή ως πυκνή, και μπορούμε επίσης να διαγράψουμε το μεμονωμένο στοιχείο πίνακα τυχαία, γεγονός που το καθιστά αραιό.
- Παρέχει μεγαλύτερη ευελιξία όσον αφορά τη διαγραφή του στοιχείου πίνακα.
- Αποθηκεύεται στον πίνακα βάσης δεδομένων που δημιουργείται από το σύστημα και μπορεί να χρησιμοποιηθεί στο ερώτημα επιλογής για την ανάκτηση των τιμών.
- Ο δείκτης και η ακολουθία δεν είναι σταθερά, δηλαδή ο δείκτης και η μέτρηση του στοιχείου πίνακα μπορεί να διαφέρουν.
- Πρέπει να αρχικοποιηθούν πριν χρησιμοποιηθούν σε προγράμματα. Οποιαδήποτε λειτουργία (εκτός από τη λειτουργία ΥΠΑΡΧΕΙ) στη μη αρχικοποιημένη συλλογή θα προκαλέσει σφάλμα.
- Μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων, το οποίο είναι ορατό σε όλη τη βάση δεδομένων ή μέσα στο υποπρόγραμμα, το οποίο μπορεί να χρησιμοποιηθεί μόνο σε αυτό το υποπρόγραμμα.
Το παρακάτω σχήμα θα εξηγήσει την κατανομή μνήμης του Nested Table (πυκνό και αραιό) διαγραμματικά. Ο μαύρος χώρος στοιχείου υποδηλώνει το κενό στοιχείο σε μια συλλογή, δηλαδή αραιό.
δείκτης | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Τιμή (πυκνή) | X Y Z | Dfv | Sde | Cxs | Vbc | Μαλακός | Qwe |
Τιμή (αραιό) | Qwe | asd | Afg | asd | Wer |
Σύνταξη για ένθετο πίνακα:
TYPE <tvpe name> IS TABLE OF <DATA TYPE>;
- Στην παραπάνω σύνταξη, το type_name δηλώνεται ως Ένθετη συλλογή πινάκων του τύπου 'DATA_TYPE'. Ο τύπος δεδομένων μπορεί να είναι είτε απλός είτε σύνθετος.
Ευρετήριο ανά πίνακα
Index-by-table είναι μια συλλογή στην οποία το μέγεθος του πίνακα δεν είναι σταθερό. Σε αντίθεση με τους άλλους τύπους συλλογής, στη συλλογή ευρετηρίου προς πίνακα ο δείκτης μπορεί να αποτελείται από τον χρήστη. Ακολουθούν τα χαρακτηριστικά του ευρετηρίου ανά πίνακα.
- Ο δείκτης μπορεί να είναι ακέραιος ή συμβολοσειρές. Κατά τη δημιουργία της συλλογής, θα πρέπει να αναφέρεται ο τύπος δείκτη.
- Αυτές οι συλλογές δεν αποθηκεύονται διαδοχικά.
- Είναι πάντα αραιοί στη φύση τους.
- Το μέγεθος του πίνακα δεν είναι σταθερό.
- Δεν μπορούν να αποθηκευτούν στη στήλη της βάσης δεδομένων. Θα δημιουργηθούν και θα χρησιμοποιηθούν σε οποιοδήποτε πρόγραμμα στη συγκεκριμένη συνεδρία.
- Δίνουν μεγαλύτερη ευελιξία όσον αφορά τη διατήρηση του δείκτη.
- Οι δείκτες μπορεί επίσης να είναι αρνητικής ακολουθίας δεικτών.
- Είναι πιο κατάλληλο να χρησιμοποιηθούν για σχετικά μικρότερες συλλογικές τιμές στις οποίες η συλλογή μπορεί να αρχικοποιηθεί και να χρησιμοποιηθεί στα ίδια υποπρογράμματα.
- Δεν χρειάζεται να αρχικοποιηθούν πριν αρχίσετε να τα χρησιμοποιείτε.
- Δεν μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων. Μπορεί να δημιουργηθεί μόνο μέσα στο υποπρόγραμμα, το οποίο μπορεί να χρησιμοποιηθεί μόνο σε αυτό το υποπρόγραμμα.
- Το BULK COLLECT δεν μπορεί να χρησιμοποιηθεί σε αυτόν τον τύπο συλλογής, καθώς ο δείκτης θα πρέπει να δίνεται ρητά για κάθε εγγραφή στη συλλογή.
Το παρακάτω σχήμα θα εξηγήσει την κατανομή μνήμης του Nested Table (αραιό) διαγραμματικά. Ο μαύρος χώρος στοιχείου υποδηλώνει το κενό στοιχείο σε μια συλλογή, δηλαδή αραιό.
Συνδρομή (varchar) | ΠΡΏΤΑ | ΔΕΥΤΕΡΗ | ΤΡΙΤΟΣ | ΤΕΤΑΡΤΟΣ | ΠΕΜΠΤΟΣ | ΕΚΤΟΣ | ΕΒΔΟΜΟΣ |
Τιμή (αραιό) | Qwe | asd | Afg | asd | Wer |
Σύνταξη για Ευρετήριο προς Πίνακα
TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
- Στην παραπάνω σύνταξη, το type_name δηλώνεται ως συλλογή ευρετηρίου προς πίνακα του τύπου 'DATA_TYPE'. Ο τύπος δεδομένων μπορεί να είναι είτε απλός είτε σύνθετος. Η μεταβλητή subsciprt/index δίνεται ως τύπος VARCHAR2 με μέγιστο μέγεθος 10.
Κατασκευαστής και ιδέα αρχικοποίησης σε συλλογές
Οι κατασκευαστές είναι η ενσωματωμένη λειτουργία που παρέχεται από το μαντείο που έχει το ίδιο όνομα με το αντικείμενο ή τις συλλογές. Εκτελούνται πρώτα κάθε φορά που το αντικείμενο ή οι συλλογές παραπέμπονται για πρώτη φορά σε μια περίοδο λειτουργίας. Παρακάτω είναι οι σημαντικές λεπτομέρειες του κατασκευαστή στο πλαίσιο της συλλογής:
- Για συλλογές, αυτοί οι κατασκευαστές θα πρέπει να κληθούν ρητά για να αρχικοποιηθούν.
- Και οι δύο πίνακες Varray και Nested πρέπει να αρχικοποιηθούν μέσω αυτών των κατασκευαστών προτού παραπεμφθούν στο πρόγραμμα.
- Ο κατασκευαστής επεκτείνει σιωπηρά την κατανομή μνήμης για μια συλλογή (εκτός του Varray), επομένως ο κατασκευαστής μπορεί επίσης να εκχωρήσει τις μεταβλητές στις συλλογές.
- Η εκχώρηση τιμών στη συλλογή μέσω κατασκευαστών δεν θα κάνει ποτέ τη συλλογή αραιή.
Μέθοδοι συλλογής
Oracle παρέχει πολλές λειτουργίες για χειρισμό και εργασία με τις συλλογές. Αυτές οι συναρτήσεις είναι πολύ χρήσιμες στο πρόγραμμα για τον προσδιορισμό και την τροποποίηση των διαφορετικών χαρακτηριστικών των συλλογών. Ο παρακάτω πίνακας θα δώσει τις διάφορες λειτουργίες και την περιγραφή τους.
Μέθοδος | Τεχνικές Περιγραφές | ΣΥΝΤΑΞΗ |
---|---|---|
ΥΠΑΡΧΕΙ (n) | Αυτή η μέθοδος θα επιστρέψει αποτελέσματα Boolean. Θα επιστρέψει "TRUE" εάν το nth στοιχείο υπάρχει σε αυτή τη συλλογή, διαφορετικά θα επιστρέψει FALSE. Μόνο οι συναρτήσεις EXISTS μπορούν να χρησιμοποιηθούν σε μη αρχικοποιημένη συλλογή | .EXISTS(στοιχείο_θέση) |
COUNT | Δίνει τον συνολικό αριθμό των στοιχείων που υπάρχουν σε μια συλλογή | .ΜΕΤΡΩ |
LIMIT | Επιστρέφει το μέγιστο μέγεθος της συλλογής. Για το Varray, θα επιστρέψει το σταθερό μέγεθος που έχει οριστεί. Για Ένθετους πίνακα και Ευρετήριο ανά πίνακα, δίνει NULL | .ΟΡΙΟ |
ΠΡΏΤΑ | Επιστρέφει την τιμή της πρώτης μεταβλητής ευρετηρίου (υπόγραφο) των συλλογών | .ΠΡΩΤΑ |
ΤΕΛΕΥΤΑΙΑ | Επιστρέφει την τιμή της τελευταίας μεταβλητής ευρετηρίου (υπόγραφο) των συλλογών | .ΤΕΛΕΥΤΑΙΟΣ |
ΠΡΟΗΓΟΥΜΕΝΟ (n) | Επιστρέφει προηγείται της μεταβλητής ευρετηρίου σε μια συλλογή του nth στοιχείο. Εάν δεν υπάρχει προηγούμενη τιμή ευρετηρίου NULL επιστρέφεται | .PRIOR(n) |
ΕΠΟΜΕΝΟ (n) | Επιστρέφει τη μεταβλητή ευρετηρίου με επιτυχία σε μια συλλογή του nth στοιχείο. Εάν δεν υπάρχει επιτυχία, η τιμή ευρετηρίου NULL επιστρέφεται | .NEXT(n) |
ΕΠΕΚΤΕΙΝΩ | Επεκτείνει ένα στοιχείο σε μια συλλογή στο τέλος | .ΕΠΕΚΤΕΙΝΩ |
ΕΠΕΚΤΑΣΗ (n) | Επεκτείνει n στοιχεία στο τέλος μιας συλλογής | .EXTEND(n) |
EXTEND (n,i) | Επεκτείνει n αντίγραφα του ith στοιχείο στο τέλος της συλλογής | .EXTEND(n,i) |
TRIM | Αφαιρεί ένα στοιχείο από το τέλος της συλλογής | .ΤΑΚΤΟΠΟΙΗΣΗ |
TRIM (n) | Αφαιρεί n στοιχεία από το τέλος της συλλογής | .TRIM (n) |
ΔΙΑΓΡΑΦΗ | Διαγράφει όλα τα στοιχεία από τη συλλογή. Κάνει τη συλλογή άδεια | .ΔΙΑΓΡΑΦΩ |
ΔΙΑΓΡΑΦΗ (n) | Διαγράφει το nο στοιχείο από τη συλλογή. Αν τότεth Το στοιχείο είναι NULL, τότε αυτό δεν θα κάνει τίποτα | .DELETE(n) |
ΔΙΑΓΡΑΦΗ (m,n) | Διαγράφει το στοιχείο στην περιοχή mth αυτό nth στη συλλογή | .DELETE(m,n) |
Παράδειγμα 1: Τύπος εγγραφής σε επίπεδο υποπρογράμματος
Σε αυτό το παράδειγμα, θα δούμε πώς να συμπληρώσουμε τη συλλογή χρησιμοποιώντας το 'ΧΥΜΑ ΣΥΛΛΟΓΗκαι πώς να παραπέμψετε τα δεδομένα συλλογής.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl(); BEGIN INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000); INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000); INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000); COMMIT: SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec FROM emp; dbms_output.put_line (‘Employee Detail'); FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST LOOP dbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no); dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name); dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary); dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager); dbms_output.put_line('--------------------------------'); END LOOP; END; /
Επεξήγηση κώδικα:
- Κωδικός γραμμή 2-8: Τύπος εγγραφής Το 'emp_det' δηλώνεται με τις στήλες emp_no, emp_name, μισθός και διαχειριστής τύπου δεδομένων NUMBER, VARCHAR2, NUMBER, NUMBER.
- Κωδικός γραμμή 9: Δημιουργία της συλλογής 'emp_det_tbl' του στοιχείου τύπου εγγραφής 'emp_det'
- Κωδικός γραμμή 10: Δήλωση της μεταβλητής 'guru99_emp_rec' ως τύπου 'emp_det_tbl' και αρχικοποίηση με τον κατασκευαστή null.
- Γραμμή κώδικα 12-15: Εισαγωγή των δεδομένων δείγματος στον πίνακα 'emp'.
- Κωδικός γραμμή 16: Πραγματοποίηση της συναλλαγής εισαγωγής.
- Κωδικός γραμμή 17: Ανάκτηση των εγγραφών από τον πίνακα 'emp' και συμπλήρωση της μεταβλητής συλλογής ως μαζικά χρησιμοποιώντας την εντολή "BULK COLLECT". Τώρα η μεταβλητή 'guru99_emp_rec' περιέχει όλες τις εγγραφές που υπάρχουν στον πίνακα 'emp'.
- Γραμμή κώδικα 19-26: Ρύθμιση του βρόχου 'FOR' χρησιμοποιώντας την εκτύπωση όλων των εγγραφών της συλλογής μία προς μία. Η μέθοδος συλλογής FIRST and LAST χρησιμοποιείται ως κατώτερο και υψηλότερο όριο του βρόχος.
Παραγωγή: Όπως μπορείτε να δείτε στο παραπάνω στιγμιότυπο οθόνης όταν εκτελεστεί ο παραπάνω κώδικας θα λάβετε την ακόλουθη έξοδο
Employee Detail Employee Number: 1000 Employee Name: AAA Employee Salary: 25000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1002 Employee Name: YYY Employee Salary: 15000 Employee Manager Number: 1000 ---------------------------------------------- Employee Number: 1003 Employee Name: ZZZ Employee Salary: 7500 Employee Manager Number: 1000 ----------------------------------------------