Συλλογές Oracle PL / SQL: Varrays, Nested & Ευρετήριο κατά Πίνακες

Πίνακας περιεχομένων:

Anonim

Τι είναι η συλλογή;

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

Στη συλλογή, κάθε στοιχείο προσδιορίζεται από έναν όρο που ονομάζεται "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:

TYPE  IS 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 Ειμαστε

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

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

Ευρετήριο ανά πίνακα

Index-by-table είναι μια συλλογή στην οποία το μέγεθος του πίνακα δεν είναι σταθερό. Σε αντίθεση με τους άλλους τύπους συλλογής, στη συλλογή ευρετηρίου ανά πίνακα η συνδρομή μπορεί να αποτελείται από τον χρήστη. Ακολουθούν τα χαρακτηριστικά του δείκτη ανά πίνακα.

  • Το κουτί συνδρομής από ακέραιο ή χορδές. Κατά τη δημιουργία της συλλογής, θα πρέπει να αναφέρεται ο τύπος συνδρομητή.
  • Αυτές οι συλλογές δεν αποθηκεύονται διαδοχικά.
  • Είναι πάντα αραιά στη φύση.
  • Το μέγεθος του πίνακα δεν είναι σταθερό.
  • Δεν μπορούν να αποθηκευτούν στη στήλη της βάσης δεδομένων. Θα δημιουργηθούν και θα χρησιμοποιηθούν σε οποιοδήποτε πρόγραμμα στη συγκεκριμένη συνεδρία.
  • Δίνουν μεγαλύτερη ευελιξία όσον αφορά τη διατήρηση συνδρομητή.
  • Οι συνδρομητές μπορούν επίσης να είναι αρνητικής ακολουθίας συνδρομητών.
  • Είναι καταλληλότερες για χρήση σε σχετικά μικρότερες συλλογικές τιμές στις οποίες η συλλογή μπορεί να αρχικοποιηθεί και να χρησιμοποιηθεί στα ίδια υποπρογράμματα.
  • Δεν χρειάζεται να αρχικοποιηθούν πριν αρχίσουν να τα χρησιμοποιούν.
  • Δεν μπορεί να δημιουργηθεί ως αντικείμενο βάσης δεδομένων. Μπορεί να δημιουργηθεί μόνο εντός του υποπρογράμματος, το οποίο μπορεί να χρησιμοποιηθεί μόνο σε αυτό το υποπρόγραμμα.
  • Η BULK COLLECT δεν μπορεί να χρησιμοποιηθεί σε αυτόν τον τύπο συλλογής, καθώς η συνδρομή θα πρέπει να αναφέρεται ρητά για κάθε εγγραφή στη συλλογή.

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

Συνδρομή (varchar) ΠΡΩΤΑ ΔΕΥΤΕΡΟΣ ΤΡΙΤΟΣ ΤΕΤΑΡΤΟΣ ΠΕΜΠΤΟΣ ΕΚΤΟΣ ΕΒΔΟΜΟΣ
Τιμή (αραιή) Qwe Asd Αφγα Asd Ειμαστε

Σύνταξη για ευρετήριο ανά πίνακα

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

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

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

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

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

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

Μέθοδος Περιγραφή ΣΥΝΤΑΞΗ
ΥΠΑΡΧΕΙ (n) Αυτή η μέθοδος θα επιστρέψει Boolean αποτελέσματα. Θα επιστρέψει «TRUE» αν το ν ου υπάρχει στοιχείο σε αυτή τη συλλογή, αλλιώς θα επιστρέψει FALSE. Μόνο οι λειτουργίες EXISTS μπορούν να χρησιμοποιηθούν σε μη αρχικοποιημένη συλλογή .EXISTS (element_position)
ΜΕΤΡΩ Δίνει το συνολικό πλήθος των στοιχείων που υπάρχουν σε μια συλλογή .COUNT
ΟΡΙΟ Επιστρέφει το μέγιστο μέγεθος της συλλογής. Για το Varray, θα επιστρέψει το σταθερό μέγεθος που έχει καθοριστεί. Για πίνακα Nested και Index-by-table, δίνει NULL . ΟΡΙΟ
ΠΡΩΤΑ Επιστρέφει την τιμή της πρώτης μεταβλητής ευρετηρίου (συνδρομητής) των συλλογών . ΠΡΩΤΟ
ΤΕΛΕΥΤΑΙΟΣ Επιστρέφει την τιμή της τελευταίας μεταβλητής ευρετηρίου (συνδρομητής) των συλλογών . ΤΕΛΕΥΤΑΙΑ
ΠΡΟΗΓΟΥΜΕΝΟ (n) Επιστρέφει πριν από τη μεταβλητή ευρετηρίου σε μια συλλογή του n ου στοιχείου. Εάν δεν υπάρχει προηγούμενη τιμή ευρετηρίου, επιστρέφεται η τιμή NULL .PRIOR (n)
ΕΠΟΜΕΝΟ (n) Επιστρέφει μεταβλητή ευρετηρίου επιτυχίας σε μια συλλογή του n ου στοιχείου. Εάν δεν υπάρχει επιτυχία, εμφανίζεται η τιμή ευρετηρίου NULL . ΕΠΟΜΕΝΟ (n)
ΕΠΕΚΤΕΙΝΩ Επεκτείνει ένα στοιχείο σε μια συλλογή στο τέλος .EXTEND
ΕΠΕΚΤΑΣΗ (n) Επεκτείνει τα στοιχεία στο τέλος μιας συλλογής .EXTEND (n)
ΕΠΕΚΤΑΣΗ (n, i) Επεκτείνει n αντίγραφα του πρώτου στοιχείου στο τέλος της συλλογής .EXTEND (n, i)
ΤΑΚΤΟΠΟΙΗΣΗ Αφαιρεί ένα στοιχείο από το τέλος της συλλογής .TRIM
ΤΡΙΜ (ν) Αφαιρεί n στοιχεία από το τέλος της συλλογής .TRIM (n)
ΔΙΑΓΡΑΦΩ Διαγράφει όλα τα στοιχεία από τη συλλογή. Κάνει τη συλλογή κενή . ΔΙΑΓΡΑΦΗ
ΔΙΑΓΡΑΦΗ (n) Διαγράφει το ένατο στοιχείο από τη συλλογή. Εάν το ένατο στοιχείο είναι NULL, τότε αυτό δεν θα κάνει τίποτα .DELETE (n)
ΔΙΑΓΡΑΦΗ (m, n) Διαγράφει το στοιχείο στο εύρος m th έως n th στη συλλογή .DELETE (m, n)

Παράδειγμα 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----------------------------------------------