Τι είναι η συλλογή;
Η συλλογή είναι μια ταξινομημένη ομάδα στοιχείων συγκεκριμένων τύπων δεδομένων. Μπορεί να είναι μια συλλογή από απλούς τύπους δεδομένων ή σύνθετους τύπους δεδομένων (όπως καθορισμένοι από τον χρήστη ή τύπους εγγραφών).
Στη συλλογή, κάθε στοιχείο προσδιορίζεται από έναν όρο που ονομάζεται "subscript". Κάθε στοιχείο της συλλογής έχει ένα μοναδικό δείκτη. Τα δεδομένα σε αυτήν τη συλλογή μπορούν να χειριστούν ή να ανακτηθούν με αναφορά σε αυτό το μοναδικό δείκτη.
Οι συλλογές είναι τα πιο χρήσιμα πράγματα όταν πρέπει να υποβληθούν σε επεξεργασία ή να χειριστούν μεγάλα δεδομένα του ίδιου τύπου. Οι συλλογές μπορούν να συμπληρωθούν και να χρησιμοποιηθούν στο σύνολό τους χρησιμοποιώντας την επιλογή «BULK» στο Oracle.
Σε αυτό το σεμινάριο, θα μάθετε-
- Τι είναι η συλλογή;
- Varrays
- Ένθετοι πίνακες
- Ευρετήριο ανά πίνακα
- Έννοια κατασκευαστή και αρχικοποίησης στις συλλογές
- Μέθοδοι συλλογής
Οι συλλογές ταξινομούνται με βάση τη δομή, τη συνδρομή και την αποθήκευση, όπως φαίνεται παρακάτω.
- Ευρετήριο ανά πίνακα (επίσης γνωστό ως Associative Array)
- Ένθετα τραπέζια
- Varrays
Σε κάθε σημείο, τα δεδομένα στη συλλογή μπορούν να αναφέρονται με τρεις όρους Όνομα συλλογής, Εγγραφή, Όνομα πεδίου / στήλης ως "
Varrays
Το Varray είναι μια μέθοδος συλλογής στην οποία το μέγεθος του πίνακα είναι σταθερό. Το μέγεθος του πίνακα δεν μπορεί να ξεπεραστεί από την σταθερή του τιμή. Η συνδρομή του Varray έχει αριθμητική τιμή. Ακολουθούν τα χαρακτηριστικά του Varrays.
- Το ανώτερο όριο είναι σταθερό
- Συμπληρώθηκε διαδοχικά ξεκινώντας με το δείκτη «1»
- Αυτός ο τύπος συλλογής είναι πάντα πυκνός, δηλαδή δεν μπορούμε να διαγράψουμε στοιχεία πίνακα. Το Varray μπορεί να διαγραφεί στο σύνολό του ή να περικοπεί από το τέλος.
- Δεδομένου ότι έχει πάντα πυκνή φύση, έχει πολύ λιγότερη ευελιξία.
- Είναι πιο κατάλληλο να χρησιμοποιείται όταν είναι γνωστό το μέγεθος του πίνακα και να εκτελούνται παρόμοιες δραστηριότητες σε όλα τα στοιχεία του πίνακα.
- Η συνδρομή και η ακολουθία παραμένουν πάντα σταθερά, δηλαδή ο συνδρομητής και ο αριθμός της συλλογής είναι πάντα ίδιοι.
- Πρέπει να προετοιμαστούν πριν από τη χρήση τους σε προγράμματα. Οποιαδήποτε λειτουργία (εκτός λειτουργίας EXISTS) σε μια μη αρχικοποιημένη συλλογή θα προκαλέσει σφάλμα.
- Μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων, το οποίο είναι ορατό σε όλη τη βάση δεδομένων ή εντός του υποπρογράμματος, το οποίο μπορεί να χρησιμοποιηθεί μόνο σε αυτό το υποπρόγραμμα.
Το παρακάτω σχήμα εξηγεί διαγραμματικά την κατανομή μνήμης του Varray (πυκνού).
Υπογεγραμμένος | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
αξία | Xyz | Dfv | Sde | Cxs | Vbc | Όχι | Qwe |
Σύνταξη για VARRAY:
TYPEIS VARRAY ( ) OF ;
- Στην παραπάνω σύνταξη, type_name δηλώνεται ως VARRAY του τύπου "DATA_TYPE" για το δεδομένο όριο μεγέθους. Ο τύπος δεδομένων μπορεί να είναι απλός ή πολύπλοκος.
Ένθετοι πίνακες
Ο πίνακας Nested είναι μια συλλογή στην οποία το μέγεθος του πίνακα δεν είναι σταθερό. Έχει τον αριθμητικό τύπο συνδρομής. Ακολουθούν περισσότερες περιγραφές σχετικά με τον τύπο του ένθετου πίνακα.
- Ο πίνακας Nested δεν έχει ανώτερο όριο μεγέθους.
- Δεδομένου ότι το ανώτερο όριο μεγέθους δεν είναι σταθερό, η συλλογή, η μνήμη πρέπει να επεκτείνεται κάθε φορά πριν τη χρησιμοποιήσουμε. Μπορούμε να επεκτείνουμε τη συλλογή χρησιμοποιώντας τη λέξη-κλειδί «ΕΠΕΚΤΑΣΗ».
- Συμπληρώθηκε διαδοχικά ξεκινώντας από το δείκτη «1».
- Αυτός ο τύπος συλλογής μπορεί να είναι τόσο πυκνός όσο και αραιός , δηλαδή μπορούμε να δημιουργήσουμε τη συλλογή ως πυκνή, και μπορούμε επίσης να διαγράψουμε το μεμονωμένο στοιχείο πίνακα τυχαία, γεγονός που το καθιστά αραιό.
- Δίνει περισσότερη ευελιξία όσον αφορά τη διαγραφή του στοιχείου πίνακα.
- Αποθηκεύεται στον πίνακα βάσης δεδομένων που δημιουργείται από το σύστημα και μπορεί να χρησιμοποιηθεί στο επιλεγμένο ερώτημα για τη λήψη των τιμών.
- Η συνδρομή και η ακολουθία δεν είναι σταθερά, δηλαδή ο δείκτης και ο αριθμός του στοιχείου πίνακα μπορεί να ποικίλλουν.
- Πρέπει να προετοιμαστούν πριν από τη χρήση τους σε προγράμματα. Οποιαδήποτε λειτουργία (εκτός λειτουργίας EXISTS) στη μη αρχικοποιημένη συλλογή θα προκαλέσει σφάλμα.
- Μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων, το οποίο είναι ορατό σε όλη τη βάση δεδομένων ή εντός του υποπρογράμματος, το οποίο μπορεί να χρησιμοποιηθεί μόνο σε αυτό το υποπρόγραμμα.
Η παρακάτω εικόνα θα εξηγήσει διαγραμματικά την κατανομή μνήμης του Nested Table (πυκνή και αραιή). Ο χώρος με μαύρο χρώμα στο στοιχείο δηλώνει το κενό στοιχείο σε μια συλλογή, δηλαδή αραιό.
Υπογεγραμμένος | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Τιμή (πυκνή) | Xyz | Dfv | Sde | Cxs | Vbc | Όχι | Qwe |
Τιμή (αραιή) | Qwe | Asd | Αφγα | Asd | Ειμαστε |
Σύνταξη για ένθετο πίνακα:
TYPEIS TABLE OF ;
- Στην παραπάνω σύνταξη, type_name δηλώνεται ως συλλογή ένθετου πίνακα του τύπου "DATA_TYPE". Ο τύπος δεδομένων μπορεί να είναι απλός ή πολύπλοκος.
Ευρετήριο ανά πίνακα
Index-by-table είναι μια συλλογή στην οποία το μέγεθος του πίνακα δεν είναι σταθερό. Σε αντίθεση με τους άλλους τύπους συλλογής, στη συλλογή ευρετηρίου ανά πίνακα η συνδρομή μπορεί να αποτελείται από τον χρήστη. Ακολουθούν τα χαρακτηριστικά του δείκτη ανά πίνακα.
- Το κουτί συνδρομής από ακέραιο ή χορδές. Κατά τη δημιουργία της συλλογής, θα πρέπει να αναφέρεται ο τύπος συνδρομητή.
- Αυτές οι συλλογές δεν αποθηκεύονται διαδοχικά.
- Είναι πάντα αραιά στη φύση.
- Το μέγεθος του πίνακα δεν είναι σταθερό.
- Δεν μπορούν να αποθηκευτούν στη στήλη της βάσης δεδομένων. Θα δημιουργηθούν και θα χρησιμοποιηθούν σε οποιοδήποτε πρόγραμμα στη συγκεκριμένη συνεδρία.
- Δίνουν μεγαλύτερη ευελιξία όσον αφορά τη διατήρηση συνδρομητή.
- Οι συνδρομητές μπορούν επίσης να είναι αρνητικής ακολουθίας συνδρομητών.
- Είναι καταλληλότερες για χρήση σε σχετικά μικρότερες συλλογικές τιμές στις οποίες η συλλογή μπορεί να αρχικοποιηθεί και να χρησιμοποιηθεί στα ίδια υποπρογράμματα.
- Δεν χρειάζεται να αρχικοποιηθούν πριν αρχίσουν να τα χρησιμοποιούν.
- Δεν μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων. Μπορεί να δημιουργηθεί μόνο εντός του υποπρογράμματος, το οποίο μπορεί να χρησιμοποιηθεί μόνο σε αυτό το υποπρόγραμμα.
- Η BULK COLLECT δεν μπορεί να χρησιμοποιηθεί σε αυτόν τον τύπο συλλογής, καθώς η συνδρομή θα πρέπει να αναφέρεται ρητά για κάθε εγγραφή στη συλλογή.
Το παρακάτω σχήμα εξηγεί διαγραμματικά την κατανομή μνήμης του Nested Table (αραιά). Ο χώρος με μαύρο χρώμα στο στοιχείο δηλώνει το κενό στοιχείο σε μια συλλογή, δηλαδή αραιό.
Συνδρομή (varchar) | ΠΡΩΤΑ | ΔΕΥΤΕΡΟΣ | ΤΡΙΤΟΣ | ΤΕΤΑΡΤΟΣ | ΠΕΜΠΤΟΣ | ΕΚΤΟΣ | ΕΒΔΟΜΟΣ |
Τιμή (αραιή) | Qwe | Asd | Αφγα | Asd | Ειμαστε |
Σύνταξη για ευρετήριο ανά πίνακα
TYPEIS TABLE OF INDEX BY VARCHAR2 (10);
- Στην παραπάνω σύνταξη, το type_name δηλώνεται ως συλλογή ευρετηρίου ανά πίνακα του τύπου "DATA_TYPE". Ο τύπος δεδομένων μπορεί να είναι απλός ή πολύπλοκος. Η μεταβλητή subsciprt / index δίνεται ως τύπος VARCHAR2 με μέγιστο μέγεθος 10.
Έννοια κατασκευαστή και αρχικοποίησης στις συλλογές
Οι κατασκευαστές είναι η ενσωματωμένη συνάρτηση που παρέχεται από το μαντείο που έχει το ίδιο όνομα με το αντικείμενο ή τις συλλογές. Εκτελούνται πρώτα κάθε φορά που ένα αντικείμενο ή συλλογές παραπέμπονται για πρώτη φορά σε μια συνεδρία. Ακολουθούν οι σημαντικές λεπτομέρειες του κατασκευαστή στο πλαίσιο συλλογής:
- Για συλλογές, αυτοί οι κατασκευαστές πρέπει να κληθούν ρητά για να το αρχικοποιήσουν.
- Και οι δύο πίνακες Varray και Nested πρέπει να αρχικοποιηθούν μέσω αυτών των κατασκευαστών προτού μπει στο πρόγραμμα.
- Ο κατασκευαστής επεκτείνει έμμεσα την κατανομή μνήμης για μια συλλογή (εκτός από το Varray), επομένως ο κατασκευαστής μπορεί επίσης να εκχωρήσει τις μεταβλητές στις συλλογές.
- Η εκχώρηση τιμών στη συλλογή μέσω κατασκευαστών δεν θα κάνει ποτέ τη συλλογή αραιή.
Μέθοδοι συλλογής
Η Oracle παρέχει πολλές λειτουργίες για χειρισμό και συνεργασία με τις συλλογές. Αυτές οι λειτουργίες είναι πολύ χρήσιμες στο πρόγραμμα για τον προσδιορισμό και την τροποποίηση του διαφορετικού χαρακτηριστικού των συλλογών. Ο παρακάτω πίνακας θα δώσει τις διαφορετικές λειτουργίες και την περιγραφή τους.
Μέθοδος | Περιγραφή | ΣΥΝΤΑΞΗ |
ΥΠΑΡΧΕΙ (n) | Αυτή η μέθοδος θα επιστρέψει Boolean αποτελέσματα. Θα επιστρέψει «TRUE» αν το ν ου υπάρχει στοιχείο σε αυτή τη συλλογή, αλλιώς θα επιστρέψει FALSE. Μόνο οι λειτουργίες EXISTS μπορούν να χρησιμοποιηθούν σε μη αρχικοποιημένη συλλογή | |
ΜΕΤΡΩ | Δίνει το συνολικό πλήθος των στοιχείων που υπάρχουν σε μια συλλογή | |
ΟΡΙΟ | Επιστρέφει το μέγιστο μέγεθος της συλλογής. Για το Varray, θα επιστρέψει το σταθερό μέγεθος που έχει καθοριστεί. Για πίνακα Nested και Index-by-table, δίνει NULL | |
ΠΡΩΤΑ | Επιστρέφει την τιμή της πρώτης μεταβλητής ευρετηρίου (συνδρομητής) των συλλογών | |
ΤΕΛΕΥΤΑΙΟΣ | Επιστρέφει την τιμή της τελευταίας μεταβλητής ευρετηρίου (συνδρομητής) των συλλογών | |
ΠΡΟΗΓΟΥΜΕΝΟ (n) | Επιστρέφει πριν από τη μεταβλητή ευρετηρίου σε μια συλλογή του n ου στοιχείου. Εάν δεν υπάρχει προηγούμενη τιμή ευρετηρίου, επιστρέφεται η τιμή NULL | |
ΕΠΟΜΕΝΟ (n) | Επιστρέφει μεταβλητή ευρετηρίου επιτυχίας σε μια συλλογή του n ου στοιχείου. Εάν δεν υπάρχει επιτυχία, εμφανίζεται η τιμή ευρετηρίου NULL | |
ΕΠΕΚΤΕΙΝΩ | Επεκτείνει ένα στοιχείο σε μια συλλογή στο τέλος | |
ΕΠΕΚΤΑΣΗ (n) | Επεκτείνει τα στοιχεία στο τέλος μιας συλλογής | |
ΕΠΕΚΤΑΣΗ (n, i) | Επεκτείνει n αντίγραφα του πρώτου στοιχείου στο τέλος της συλλογής | |
ΤΑΚΤΟΠΟΙΗΣΗ | Αφαιρεί ένα στοιχείο από το τέλος της συλλογής | |
ΤΡΙΜ (ν) | Αφαιρεί n στοιχεία από το τέλος της συλλογής | |
ΔΙΑΓΡΑΦΩ | Διαγράφει όλα τα στοιχεία από τη συλλογή. Κάνει τη συλλογή κενή | |
ΔΙΑΓΡΑΦΗ (n) | Διαγράφει το ένατο στοιχείο από τη συλλογή. Εάν το ένατο στοιχείο είναι NULL, τότε αυτό δεν θα κάνει τίποτα | |
ΔΙΑΓΡΑΦΗ (m, n) | Διαγράφει το στοιχείο στο εύρος m th έως n th στη συλλογή |
Παράδειγμα 1: Τύπος εγγραφής σε επίπεδο υποπρογράμματος
Σε αυτό το παράδειγμα, θα δούμε πώς να συμπληρώσουμε τη συλλογή χρησιμοποιώντας το "BULK COLLECT" και πώς να παραπέμψουμε τα δεδομένα συλλογής.
DECLARETYPE 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();BEGININSERT 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_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_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, μισθό και διαχειριστή τύπου δεδομένων ΑΡΙΘΜΟΣ, ΒΑΡΚΑΡ2, ΑΡΙΘΜΟΣ, ΑΡΙΘΜΟΣ.
- Γραμμή κώδικα 9: Δημιουργία της συλλογής «emp_det_tbl» του στοιχείου τύπου εγγραφής «emp_det»
- Γραμμή κώδικα 10: Δήλωση της μεταβλητής «guru99_emp_rec» ως τύπου «emp_det_tbl» και αρχικοποίηση με μηδενικό κατασκευαστή.
- Γραμμή κώδικα 12-15: Εισαγωγή δείγματος δεδομένων στον πίνακα «emp».
- Γραμμή κώδικα 16: Πραγματοποίηση της συναλλαγής εισαγωγής.
- Γραμμή κώδικα 17: Ανάκτηση των εγγραφών από τον πίνακα 'emp' και συμπλήρωση της μεταβλητής συλλογής ως μαζική χρήση της εντολής "BULK COLLECT". Τώρα η μεταβλητή «guru99_emp_rec» περιέχει όλες τις εγγραφές που υπάρχουν στον πίνακα «emp».
- Γραμμή κώδικα 19-26: Ρύθμιση του βρόχου «FOR» χρησιμοποιώντας για την εκτύπωση όλων των εγγραφών της συλλογής ένα προς ένα. Η μέθοδος συλλογής FIRST και LAST χρησιμοποιείται ως κατώτερο και υψηλότερο όριο του βρόχου.
Έξοδος : Όπως μπορείτε να δείτε στο παραπάνω στιγμιότυπο οθόνης όταν εκτελείται ο παραπάνω κώδικας, θα λάβετε την ακόλουθη έξοδο
Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------