Oracle Συλλογές PL/SQL: Varrays, Nested & Index by Tables

⚡ Έξυπνη Σύνοψη

Οι συλλογές PL/SQL είναι ταξινομημένες ομάδες στοιχείων του ίδιου τύπου δεδομένων, κάθε μία από τις οποίες προσεγγίζεται μέσω ενός δείκτη. Τρεις τύποι, ο Varray, ο nested table και ο index-by table, διαφέρουν ως προς το αν το μέγεθος είναι σταθερό, τον τρόπο λειτουργίας του δείκτη και αν μπορούν να αποθηκευτούν στη βάση δεδομένων.

  • 🧺 Ορισμός: Μια συλλογή περιέχει πολλά στοιχεία ενός τύπου, καθένα από τα οποία προσδιορίζεται από ένα μοναδικό δείκτη.
  • 📐 Βαρρέι: Σταθερό άνω μέγεθος, πάντα πυκνό, αριθμητικός δείκτης, πρέπει να αρχικοποιηθεί πριν από τη χρήση.
  • 📚 Ένθετος πίνακας: Χωρίς όριο μεγέθους, μπορεί να είναι πυκνό ή αραιό, αποθηκευμένο σε πίνακα συστήματος, επεκταμένο με EXTEND.
  • 🔑 Πίνακας ευρετηρίου ανά: Δεν υπάρχει όριο μεγέθους, ο δείκτης μπορεί να είναι συμβολοσειρά ή αρνητικός ακέραιος αριθμός, δεν αποθηκεύεται στη βάση δεδομένων.
  • Οικοδόμος: Οι πίνακες Varray και οι ένθετοι πίνακες χρειάζονται έναν σαφή κατασκευαστή για αρχικοποίηση πριν από την αναφορά.
  • Μέθοδοι: Οι εντολές COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM και DELETE διαχειρίζονται μια συλλογή.
  • Ογκος: Η λειτουργία BULK COLLECT συμπληρώνει μια συλλογή σε ένα βήμα για γρήγορη επεξεργασία.

Oracle Συλλογές PL/SQL

Τι είναι μια Συλλογή;

Μια συλλογή είναι μια ταξινομημένη ομάδα στοιχείων ενός συγκεκριμένου τύπου δεδομένων. Μπορεί να είναι μια συλλογή ενός απλού τύπου δεδομένων ή ενός σύνθετου τύπου δεδομένων, όπως τύποι που ορίζονται από τον χρήστη ή τύποι εγγραφών.

Σε μια συλλογή, κάθε στοιχείο προσδιορίζεται από έναν όρο που ονομάζεται "υπογεγραμμένη." Σε κάθε στοιχείο αντιστοιχίζεται ένας μοναδικός δείκτης και τα δεδομένα μπορούν να χειριστούν ή να ανακτηθούν αναφερόμενα σε αυτόν τον μοναδικό δείκτη.

Οι συλλογές είναι πιο χρήσιμες όταν χρειάζεται επεξεργασία ή χειρισμός μεγάλης ποσότητας δεδομένων του ίδιου τύπου. Οι συλλογές μπορούν να συμπληρωθούν και να χειριστούν ως σύνολο χρησιμοποιώντας την επιλογή «BULK» στο Oracle.

Οι συλλογές ταξινομούνται με βάση τη δομή, το δείκτη και τον χώρο αποθήκευσης, όπως φαίνεται παρακάτω:

  • Πίνακες με ευρετήριο (γνωστοί και ως συσχετιστικοί πίνακες)
  • Ένθετα τραπέζια
  • Varrays

Σε οποιοδήποτε σημείο, τα δεδομένα σε μια συλλογή μπορούν να αναφερθούν με τρεις όρους: όνομα συλλογής, δείκτης και όνομα πεδίου ή στήλης, ως " ( ). Θα μάθετε για αυτές τις κατηγορίες συλλογών στις παρακάτω ενότητες.

Τύποι Συλλογών με μια Ματιά

Οι τρεις τύποι συλλογών έχουν διαφορετικούς συμβιβασμούς. Ο παρακάτω πίνακας τους παρουσιάζει δίπλα-δίπλα, προτού εξεταστεί λεπτομερώς ο καθένας.

Άποψη Βαρρέ Ένθετος πίνακας Πίνακας ευρετηρίου ανά
Μέγεθος Σταθερό ανώτατο όριο Δεν υπάρχει όριο Δεν υπάρχει όριο
δείκτης Αριθμητικός Αριθμητικός Ακέραιος αριθμός ή συμβολοσειρά
Πυκνότητα Πάντα πυκνό Πυκνό ή αραιό Πάντα αραιό
Αποθηκεύτηκε στη βάση δεδομένων Ναι Ναι Οχι
Απαιτείται αρχικοποίηση Ναι Ναι Οχι

Varrays

Ένα Varray είναι μια συλλογή στην οποία το μέγεθος του πίνακα είναι σταθερό και δεν μπορεί να ξεπεραστεί. Ο δείκτης ενός Varray είναι μια αριθμητική τιμή. Τα χαρακτηριστικά των Varray είναι:

  • Το ανώτατο όριο μεγέθους είναι σταθερό.
  • Συμπληρώνεται διαδοχικά ξεκινώντας από τον δείκτη '1'.
  • Αυτός ο τύπος συλλογής είναι πάντα πυκνός. Δεν μπορούμε να διαγράψουμε μεμονωμένα στοιχεία πίνακα. Ένα Varray μπορεί να διαγραφεί ολόκληρο ή να περικοπεί από το τέλος.
  • Επειδή είναι πάντα πυκνό, έχει πολύ μικρή ευελιξία.
  • Είναι πιο κατάλληλο όταν το μέγεθος του πίνακα είναι γνωστό και παρόμοιες δραστηριότητες εκτελούνται σε όλα τα στοιχεία.
  • Ο δείκτης και ο αριθμός των αριθμών της συλλογής παραμένουν πάντα σταθεροί.
  • Πρέπει να αρχικοποιηθεί πριν από τη χρήση. Οποιαδήποτε λειτουργία εκτός από την EXISTS σε μια μη αρχικοποιημένη συλλογή εμφανίζει σφάλμα.
  • Μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων ορατό σε όλη τη βάση δεδομένων ή μέσα σε ένα υποπρόγραμμα για χρήση μόνο εκεί.

Το παρακάτω σχήμα εξηγεί την κατανομή μνήμης ενός 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'.
  • Αυτός ο τύπος συλλογής μπορεί να είναι και οι δύο πυκνό και αραιόμπορούμε να το δημιουργήσουμε ως πυκνό και επίσης να διαγράψουμε τυχαία μεμονωμένα στοιχεία, γεγονός που το καθιστά αραιό.
  • Παρέχει μεγαλύτερη ευελιξία για τη διαγραφή στοιχείων πίνακα.
  • Αποθηκεύεται σε έναν πίνακα βάσης δεδομένων που δημιουργείται από το σύστημα και μπορεί να χρησιμοποιηθεί σε ένα ερώτημα επιλογής για την ανάκτηση τιμών.
  • Ο δείκτης και ο αριθμός μπορεί να διαφέρουν.
  • Πρέπει να αρχικοποιηθεί πριν από τη χρήση. Οποιαδήποτε λειτουργία εκτός από την EXISTS σε μια μη αρχικοποιημένη συλλογή εμφανίζει σφάλμα.
  • Μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων ορατό σε όλη τη βάση δεδομένων ή μέσα σε ένα υποπρόγραμμα για χρήση μόνο εκεί.

Το παρακάτω σχήμα εξηγεί την κατανομή μνήμης ενός ένθετου πίνακα (πυκνού και αραιού). Ένας κενός χώρος στοιχείων υποδηλώνει ένα αραιό στοιχείο.

δείκτης 1 2 3 4 5 6 7
Τιμή (πυκνή) X Y Z Dfv Sde Cxs Vbc Μαλακός Qwe
Αξία (αραιή) Qwe asd Afg asd Wer

Σύνταξη για ένθετο πίνακα:

TYPE <type_name> IS TABLE OF <DATA_TYPE>;
  • Στην παραπάνω σύνταξη, το type_name δηλώνεται ως μια ένθετη συλλογή πινάκων του τύπου 'DATA_TYPE'. Ο τύπος δεδομένων μπορεί να είναι απλός ή σύνθετος.

Πίνακας ευρετηρίου ανά

Ένας πίνακας με βάση το ευρετήριο είναι μια συλλογή στην οποία το μέγεθος του πίνακα δεν είναι σταθερό. Σε αντίθεση με άλλους τύπους συλλογών, ο δείκτης ενός πίνακα με βάση το ευρετήριο μπορεί να οριστεί από τον χρήστη. Τα χαρακτηριστικά ενός πίνακα με βάση το ευρετήριο είναι:

  • Ο δείκτης μπορεί να είναι ακέραιος αριθμός ή συμβολοσειρά. Ο τύπος του δείκτη θα πρέπει να αναφέρεται κατά τη δημιουργία της συλλογής.
  • Αυτές οι συλλογές δεν αποθηκεύονται διαδοχικά.
  • Είναι πάντα αραιοί στη φύση τους.
  • Το μέγεθος του πίνακα δεν είναι σταθερό.
  • Δεν μπορούν να αποθηκευτούν σε μια στήλη βάσης δεδομένων. Δημιουργούνται και χρησιμοποιούνται εντός μιας συγκεκριμένης συνεδρίας.
  • Δίνουν μεγαλύτερη ευελιξία στη διατήρηση του δείκτη.
  • Οι δείκτες μπορούν να είναι αρνητική ακολουθία.
  • Είναι πιο κατάλληλα για σχετικά μικρότερες τιμές συλλογής που χρησιμοποιούνται στο ίδιο υποπρόγραμμα.
  • Δεν χρειάζεται να αρχικοποιηθούν πριν από τη χρήση.
  • Δεν μπορούν να δημιουργηθούν ως αντικείμενο βάσης δεδομένων· δημιουργούνται μόνο μέσα σε ένα υποπρόγραμμα.
  • Η ΜΑΖΙΚΗ ΣΥΛΛΟΓΗ δεν μπορεί να χρησιμοποιηθεί με αυτόν τον τύπο συλλογής, επειδή ο δείκτης πρέπει να δοθεί ρητά για κάθε εγγραφή.

Το παρακάτω σχήμα εξηγεί την κατανομή μνήμης ενός πίνακα με ευρετήριο (sparse). Ένας κενός χώρος στοιχείων υποδηλώνει ένα αραιό στοιχείο.

Συνδρομή (varchar) ΠΡΏΤΑ ΔΕΥΤΕΡΗ ΤΡΙΤΟΣ ΤΕΤΑΡΤΟΣ ΠΕΜΠΤΟΣ ΕΚΤΟΣ ΕΒΔΟΜΟΣ
Αξία (αραιή) Qwe asd Afg asd Wer

Σύνταξη για τον Πίνακα Ευρετηρίου ανά:

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • Στην παραπάνω σύνταξη, το type_name δηλώνεται ως συλλογή πινάκων με βάση τον δείκτη (index-by) του τύπου 'DATA_TYPE'. Η μεταβλητή δείκτη δίνεται ως τύπος VARCHAR2 με μέγιστο μέγεθος 10.

Κατασκευαστής και ιδέα αρχικοποίησης σε συλλογές

Οι κατασκευαστές είναι ενσωματωμένες συναρτήσεις που παρέχονται από Oracle που έχουν το ίδιο όνομα με το αντικείμενο ή τη συλλογή. Εκτελούνται πρώτα κάθε φορά που ένα αντικείμενο ή μια συλλογή αναφέρεται για πρώτη φορά σε μια συνεδρία. Σημαντικές λεπτομέρειες ενός κατασκευαστή στο περιβάλλον της συλλογής:

  • Για συλλογές, αυτοί οι κατασκευαστές πρέπει να κληθούν ρητά για την αρχικοποίηση της συλλογής.
  • Τόσο οι πίνακες Varray όσο και οι ένθετοι πίνακες πρέπει να αρχικοποιηθούν μέσω αυτών των κατασκευαστών πριν αναφερθούν στο πρόγραμμα.
  • Ένας κατασκευαστής επεκτείνει έμμεσα την κατανομή μνήμης για μια συλλογή (εκτός από τη Varray), επομένως μπορεί επίσης να αντιστοιχίσει μεταβλητές στη συλλογή.
  • Η ανάθεση τιμών μέσω κατασκευαστών δεν καθιστά ποτέ τη συλλογή αραιή.

Μέθοδοι συλλογής

Oracle παρέχει πολλές συναρτήσεις για τον χειρισμό και την εργασία με συλλογές. Αυτές οι συναρτήσεις καθορίζουν και τροποποιούν τα διαφορετικά χαρακτηριστικά μιας συλλογής. Ο παρακάτω πίνακας δίνει τις διαφορετικές συναρτήσεις και τις περιγραφές τους.

Μέθοδος Περιγραφή Σύνταξη
ΥΠΑΡΧΕΙ (n) Επιστρέφει ένα λογικό αποτέλεσμα. Επιστρέφει TRUE εάν το n-οστό στοιχείο υπάρχει, διαφορετικά FALSE. Μόνο το EXISTS μπορεί να χρησιμοποιηθεί σε μια μη αρχικοποιημένη συλλογή. .EXISTS(στοιχείο_θέση)
COUNT Δίνει τον συνολικό αριθμό των στοιχείων που υπάρχουν σε μια συλλογή. .ΜΕΤΡΩ
LIMIT Επιστρέφει το μέγιστο μέγεθος της συλλογής. Για Varray, επιστρέφει το σταθερό μέγεθος. Για ένθετους πίνακες και πίνακες με ευρετήριο, επιστρέφει NULL. .ΟΡΙΟ
ΠΡΏΤΑ Επιστρέφει την τιμή του πρώτου δείκτη της συλλογής. .ΠΡΩΤΑ
ΤΕΛΕΥΤΑΙΑ Επιστρέφει την τιμή του τελευταίου δείκτη της συλλογής. .ΤΕΛΕΥΤΑΙΟΣ
ΠΡΟΗΓΟΥΜΕΝΟ (n) Επιστρέφει τον προηγούμενο δείκτη του n-οστού στοιχείου. Εάν δεν υπάρχει, επιστρέφεται η τιμή NULL. .PRIOR(n)
ΕΠΟΜΕΝΟ (n) Επιστρέφει τον επόμενο δείκτη του n-οστού στοιχείου. Εάν δεν υπάρχει, επιστρέφεται η τιμή NULL. .NEXT(n)
ΕΠΕΚΤΕΙΝΩ Επεκτείνει ένα στοιχείο στο τέλος μιας συλλογής. .ΕΠΕΚΤΕΙΝΩ
ΕΠΕΚΤΑΣΗ (n) Επεκτείνει n στοιχεία στο τέλος μιας συλλογής. .EXTEND(n)
EXTEND (n,i) Επεκτείνει n αντίγραφα του i-οστού στοιχείου στο τέλος της συλλογής. .EXTEND(n,i)
TRIM Αφαιρεί ένα στοιχείο από το τέλος της συλλογής. .ΤΑΚΤΟΠΟΙΗΣΗ
TRIM (n) Αφαιρεί n στοιχεία από το τέλος της συλλογής. .TRIM (n)
ΔΙΑΓΡΑΦΗ Διαγράφει όλα τα στοιχεία από τη συλλογή, καθιστώντας την κενή. .ΔΙΑΓΡΑΦΩ
ΔΙΑΓΡΑΦΗ (n) Διαγράφει το n-οστό στοιχείο. Εάν το n-οστό στοιχείο είναι NULL, δεν κάνει τίποτα. .DELETE(n)
ΔΙΑΓΡΑΦΗ (m,n) Διαγράφει τα στοιχεία στην περιοχή από mth έως nth στη συλλογή. .DELETE(m,n)

Παράδειγμα 1: Τύπος εγγραφής σε επίπεδο υποπρογράμματος

Σε αυτό το παράδειγμα, βλέπουμε πώς να συμπληρώσουμε τη συλλογή χρησιμοποιώντας το 'ΧΥΜΑ ΣΥΛΛΟΓΗκαι πώς να ανατρέχετε στα δεδομένα της συλλογής.

Συλλογή PL/SQL που συμπληρώνεται με παράδειγμα BULK COLLECT

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;
/

Code εξήγηση

  • Code γραμμή 2-8: Τύπος εγγραφής Το 'emp_det' δηλώνεται με τις στήλες emp_no, emp_name, manager και salary τύπου δεδομένων NUMBER, VARCHAR2, NUMBER και NUMBER.
  • Code γραμμή 9: Δημιουργία της συλλογής 'emp_det_tbl' με στοιχείο τύπου εγγραφής 'emp_det'.
  • Code γραμμή 10: Δηλώνοντας τη μεταβλητή 'guru99_emp_rec' ως τύπο 'emp_det_tbl' και αρχικοποιώντας την με έναν κατασκευαστή null.
  • Code γραμμή 12-15: Εισαγωγή των δεδομένων δείγματος στον πίνακα 'emp'.
  • Code γραμμή 16: Πραγματοποίηση της συναλλαγής εισαγωγής.
  • Code γραμμή 17: Ανάκτηση των εγγραφών από τον πίνακα 'emp' και συμπλήρωση της μεταβλητής συλλογής μαζικά χρησιμοποιώντας την εντολή "BULK COLLECT". Η μεταβλητή 'guru99_emp_rec' περιέχει πλέον όλες τις εγγραφές που υπάρχουν στον πίνακα 'emp'.
  • Code γραμμή 19-26: Ρύθμιση του βρόχου 'FOR' για εκτύπωση όλων των εγγραφών στη συλλογή μία προς μία. Οι μέθοδοι συλλογής FIRST και 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
----------------------------------------------

Συχνές Ερωτήσεις

Ένα Varray έχει ένα σταθερό ανώτερο μέγεθος και είναι πάντα πυκνό. Ένας ένθετος πίνακας δεν έχει όριο μεγέθους, μπορεί να είναι αραιός και μπορεί να επεκταθεί, γεγονός που τον καθιστά πιο ευέλικτο για δεδομένα που αυξάνονται ή παρουσιάζουν κενά.

Επειδή πρόκειται για έναν συσχετιστικό πίνακα στη μνήμη, όχι για έναν αποθηκευμένο πίνακα. Ο δείκτης λειτουργεί ως κλειδί αναζήτησης, επομένως λειτουργεί μια συμβολοσειρά ή ένας αρνητικός ακέραιος αριθμός, κάτι που είναι χρήσιμο για αναζητήσεις με κλειδί εντός μιας συνεδρίας.

Ένας μη αρχικοποιημένος πίνακας Varray ή ένας ένθετος πίνακας είναι ατομικά μηδενικός, επομένως η αναφορά σε ένα στοιχείο προκαλεί σφάλμα. Η κλήση του κατασκευαστή το εκχωρεί, μετά την οποία το EXTEND και οι εκχωρήσεις μπορούν να προσθέσουν δεδομένα.

Ναι. Δεδομένου του εάν το μέγεθος είναι σταθερό, εάν τα δεδομένα αποθηκεύονται και εάν χρειάζεται κλειδί συμβολοσειράς, η Τεχνητή Νοημοσύνη μπορεί να υποδείξει έναν πίνακα Varray, έναν ένθετο πίνακα ή έναν πίνακα ευρετηρίου ανά πίνακα και να εξηγήσει τον συμβιβασμό.

Η BULK COLLECT φορτώνει όλες τις γραμμές σε μια συλλογή με μία μόνο εναλλαγή μεταξύ των μηχανών SQL και PL/SQL, αντί για μία εναλλαγή ανά γραμμή, γεγονός που μειώνει σημαντικά την επιβάρυνση σε μεγάλα σύνολα αποτελεσμάτων.

Συνοψίστε αυτήν την ανάρτηση με: