Oracle PL / SQL BULK COLLECT: FORALL Παράδειγμα

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

Anonim

Τι είναι το BULK COLLECT;

Το BULK COLLECT μειώνει τους διακόπτες περιβάλλοντος μεταξύ SQL και PL / SQL και επιτρέπει στον SQL engine να ανακτήσει τις εγγραφές ταυτόχρονα.

Το Oracle PL / SQL παρέχει τη λειτουργικότητα της μαζικής ανάκτησης των εγγραφών αντί της ανάκτησης ένα προς ένα. Αυτό το BULK COLLECT μπορεί να χρησιμοποιηθεί στη δήλωση 'SELECT' για τη μαζική συμπλήρωση των εγγραφών ή τη μαζική λήψη του δρομέα. Δεδομένου ότι το BULK COLLECT ανακτά την εγγραφή σε BULK, η ρήτρα INTO πρέπει πάντα να περιέχει μια μεταβλητή τύπου συλλογής. Το κύριο πλεονέκτημα της χρήσης BULK COLLECT είναι ότι αυξάνει την απόδοση μειώνοντας την αλληλεπίδραση μεταξύ βάσης δεδομένων και PL / SQL κινητήρα.

Σύνταξη:

SELECT  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

Στην παραπάνω σύνταξη, το BULK COLLECT χρησιμοποιείται για τη συλλογή δεδομένων από τη δήλωση «SELECT» και «FETCH».

Σε αυτό το σεμινάριο θα μάθετε-

  • ΜΟΡΦΗ Ρήτρα
  • ΠΕΡΙΟΡΙΣΜΟΣ ρήτρα
  • BULK COLLECT Χαρακτηριστικά

ΜΟΡΦΗ Ρήτρα

Το FORALL επιτρέπει την εκτέλεση των λειτουργιών DML σε δεδομένα μαζικά. Είναι παρόμοιο με αυτό της δήλωσης βρόχου FOR εκτός από το FOR loop, τα πράγματα συμβαίνουν σε επίπεδο ρεκόρ, ενώ στο FORALL δεν υπάρχει έννοια LOOP. Αντίθετα, όλα τα δεδομένα που υπάρχουν στο δεδομένο εύρος επεξεργάζονται ταυτόχρονα.

Σύνταξη:

FORALL in;

Στην παραπάνω σύνταξη, η δεδομένη λειτουργία DML θα εκτελεστεί για ολόκληρα τα δεδομένα που υπάρχουν μεταξύ χαμηλότερου και υψηλότερου εύρους.

ΠΕΡΙΟΡΙΣΜΟΣ ρήτρα

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

Ωστόσο, αυτό το όριο μεγέθους μπορεί να επιτευχθεί εύκολα εισάγοντας τη συνθήκη ROWNUM στη δήλωση «SELECT», ενώ στην περίπτωση του δρομέα αυτό δεν είναι δυνατό.

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

Σύνταξη:

FETCH  BULK COLLECT INTO  LIMIT ;

Στην παραπάνω σύνταξη, η δήλωση ανάκτησης δρομέα χρησιμοποιεί τη δήλωση BULK COLLECT μαζί με τον όρο LIMIT.

BULK COLLECT Χαρακτηριστικά

Παρόμοια με τα χαρακτηριστικά του δρομέα, το BULK COLLECT έχει% BULK_ROWCOUNT (n) που επιστρέφει τον αριθμό των σειρών που επηρεάζονται στη n η δήλωση DML της δήλωσης FORALL, δηλαδή θα δώσει τον αριθμό των εγγραφών που επηρεάζονται στη δήλωση FORALL για κάθε μεμονωμένη τιμή από τη συλλογή μεταβλητός. Ο όρος «n» υποδεικνύει την ακολουθία της τιμής στη συλλογή, για την οποία απαιτείται ο αριθμός σειράς.

Παράδειγμα 1 : Σε αυτό το παράδειγμα, θα προβάλλουμε όλο το όνομα του υπαλλήλου από τον πίνακα emp χρησιμοποιώντας BULK COLLECT και θα αυξήσουμε επίσης τον μισθό όλων των υπαλλήλων κατά 5000 χρησιμοποιώντας το FORALL.

DECLARECURSOR guru99_det IS SELECT emp_name FROM emp;TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);lv_emp_name lv_emp_name_tbl;BEGINOPEN guru99_det;FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;FOR c_emp_name IN lv_emp_name.FIRST… lv_emp_name.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/

Παραγωγή

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Επεξήγηση κώδικα:

  • Γραμμή κώδικα 2 : Δήλωση του δρομέα guru99_det για δήλωση «SELECT emp_name FROM emp».
  • Γραμμή κώδικα 3 : Δήλωση του lv_emp_name_tbl ως τύπου πίνακα του VARCHAR2 (50)
  • Γραμμή κώδικα 4 : Δήλωση του ονόματος lv_emp_name ως τύπου lv_emp_name_tbl.
  • Γραμμή κωδικού 6: Άνοιγμα του δρομέα.
  • Γραμμή κώδικα 7: Ανάκτηση του δρομέα χρησιμοποιώντας BULK COLLECT με το όριο LIMIT ως 5000 intl lv_emp_name μεταβλητή.
  • Γραμμή κωδικού 8-11: Ρύθμιση βρόχου FOR για εκτύπωση όλης της εγγραφής στη συλλογή lv_emp_name.
  • Γραμμή κώδικα 12: Χρησιμοποιώντας το FORALL ενημέρωση του μισθού όλων των υπαλλήλων κατά 5000.
  • Γραμμή κώδικα 14: Πραγματοποίηση της συναλλαγής.