Oracle Πακέτο PL/SQL: Τύπος, Προδιαγραφή, Σώμα [Παράδειγμα]
⚡ Έξυπνη Σύνοψη
Τα πακέτα PL/SQL ομαδοποιούν σχετικές διαδικασίες, συναρτήσεις, μεταβλητές, δρομείς και εξαιρέσεις σε ένα αντικείμενο σχήματος με μια προδιαγραφή και ένα σώμα. Η προδιαγραφή δηλώνει τη δημόσια διεπαφή, ενώ το σώμα διατηρεί την ιδιωτική υλοποίηση, βελτιώνοντας την αρθρωτή δομή και την απόδοση.

Τι περιλαμβάνει το πακέτο Oracle?
Oracle PL / SQL Το πακέτο είναι μια λογική ομάδαping σχετικών υποπρογράμματα (διαδικασία/συνάρτηση) σε ένα μόνο στοιχείο. Ένα πακέτο μεταγλωττίζεται και αποθηκεύεται ως αντικείμενο βάσης δεδομένων που μπορεί να επαναχρησιμοποιηθεί αργότερα.
Στοιχεία πακέτων
Ένα πακέτο PL/SQL έχει δύο στοιχεία.
- Προδιαγραφή πακέτου
- Σώμα συσκευασίας
Προδιαγραφή πακέτου
Η προδιαγραφή του πακέτου αποτελείται από μια δήλωση όλων των δημόσιων μεταβλητές, δρομείς, αντικείμενα, διαδικασίες, συναρτήσεις και εξαιρέσεις.
Παρακάτω παρατίθενται ορισμένα χαρακτηριστικά των προδιαγραφών του πακέτου.
- Τα στοιχεία που δηλώνονται στην προδιαγραφή είναι προσβάσιμα εκτός του πακέτου. Τέτοια στοιχεία είναι γνωστά ως δημόσια στοιχεία.
- Η προδιαγραφή πακέτου είναι ένα αυτόνομο στοιχείο, που σημαίνει ότι μπορεί να υπάρχει μόνο του χωρίς σώμα πακέτου.
- Κάθε φορά που γίνεται αναφορά σε ένα πακέτο, δημιουργείται μια παρουσία του πακέτου για τη συγκεκριμένη συνεδρία.
- Μετά τη δημιουργία του στιγμιότυπου για μια περίοδο λειτουργίας, όλα τα στοιχεία του πακέτου που εκκινούνται σε αυτό το στιγμιότυπο ισχύουν μέχρι το τέλος της περιόδου λειτουργίας.
Σύνταξη
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
Η παραπάνω σύνταξη δείχνει τη δημιουργία της προδιαγραφής του πακέτου.
Σώμα συσκευασίας
Το σώμα του πακέτου αποτελείται από τον ορισμό όλων των στοιχείων που υπάρχουν στην προδιαγραφή του πακέτου. Μπορεί επίσης να έχει ορισμούς στοιχείων που δεν δηλώνονται στην προδιαγραφή. Αυτά τα στοιχεία ονομάζονται ιδιωτικά στοιχεία και μπορούν να κληθούν μόνο από το εσωτερικό του πακέτου.
Παρακάτω παρατίθενται τα χαρακτηριστικά ενός σώματος συσκευασίας.
- Θα πρέπει να περιέχει ορισμούς για όλα τα υποπρογράμματα/δρομείς που έχουν δηλωθεί στην προδιαγραφή.
- Μπορεί επίσης να έχει περισσότερα υποπρογράμματα ή άλλα στοιχεία που δεν δηλώνονται στην προδιαγραφή. Αυτά ονομάζονται ιδιωτικά στοιχεία.
- Είναι ένα εξαρτώμενο αντικείμενο και εξαρτάται από τις προδιαγραφές του πακέτου.
- Η κατάσταση του σώματος του πακέτου γίνεται «Μη έγκυρη» κάθε φορά που μεταγλωττίζεται η προδιαγραφή. Επομένως, πρέπει να μεταγλωττίζεται ξανά κάθε φορά μετά τη μεταγλώττιση της προδιαγραφής.
- Τα ιδιωτικά στοιχεία πρέπει να οριστούν πρώτα πριν χρησιμοποιηθούν στο σώμα της συσκευασίας.
- Το πρώτο μέρος του σώματος του πακέτου είναι το τμήμα καθολικής δήλωσης. Αυτό περιλαμβάνει μεταβλητές, δρομείς και ιδιωτικά στοιχεία (δήλωση προς τα εμπρός) που είναι ορατά σε ολόκληρο το πακέτο.
- Το τελευταίο μέρος του πακέτου είναι το μέρος αρχικοποίησης πακέτου που εκτελείται μία φορά κάθε φορά που ένα πακέτο αναφέρεται για πρώτη φορά στην συνεδρία.
Σύνταξη:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <global_declaration part> <Private element definition> <sub_program and public element definition> . <Package Initialization> END <package_name>
Η παραπάνω σύνταξη δείχνει τη δημιουργία του σώματος του πακέτου.
Τώρα θα δούμε πώς να αναφερόμαστε σε στοιχεία πακέτου στο πρόγραμμα.
Αναφορά στοιχείων πακέτου
Μόλις τα στοιχεία δηλωθούν και οριστούν στο πακέτο, πρέπει να ανατρέξουμε στα στοιχεία για να τα χρησιμοποιήσουμε.
Όλα τα δημόσια στοιχεία του πακέτου μπορούν να αναφερθούν καλώντας το όνομα του πακέτου ακολουθούμενο από το όνομα του στοιχείου χωρισμένα με τελεία, π.χ. ' . «.»
Οι δημόσιες μεταβλητές του πακέτου μπορούν επίσης να χρησιμοποιηθούν με τον ίδιο τρόπο για να αντιστοιχίσουν και να ανακτήσουν τιμές από αυτές, δηλαδή ' . «.»
Δημιουργία πακέτου σε PL/SQL
Στην PL/SQL, κάθε φορά που ένα πακέτο αναφέρεται ή καλείται σε μια συνεδρία, δημιουργείται μια νέα παρουσία για αυτό το πακέτο.
Oracle παρέχει τη δυνατότητα προετοιμασίας στοιχείων πακέτου ή εκτέλεσης οποιασδήποτε δραστηριότητας τη στιγμή της δημιουργίας αυτού του στιγμιότυπου μέσω του 'Package Initialization'.
Αυτό δεν είναι τίποτα άλλο παρά ένα μπλοκ εκτέλεσης που γράφεται στο σώμα του πακέτου μετά τον ορισμό όλων των στοιχείων του πακέτου. Αυτό το μπλοκ θα εκτελείται κάθε φορά που ένα πακέτο αναφέρεται για πρώτη φορά στην συνεδρία.
Το παρακάτω στιγμιότυπο οθόνης δείχνει πώς τοποθετείται το μπλοκ αρχικοποίησης πακέτου μέσα στο σώμα του πακέτου κατά τη δημιουργία ενός πακέτου.
Σύνταξη
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGIN <Package Initialization> END <package_name>
Η παραπάνω σύνταξη δείχνει τον ορισμό της προετοιμασίας του πακέτου στο σώμα του πακέτου.
Προωθητικές δηλώσεις
Η δήλωση ή η αναφορά προς τα εμπρός στο πακέτο δεν είναι τίποτα άλλο παρά η δήλωση των ιδιωτικών στοιχείων ξεχωριστά και ο ορισμός τους στο τελευταίο μέρος του σώματος του πακέτου.
Τα ιδιωτικά στοιχεία μπορούν να αναφερθούν μόνο εάν έχουν ήδη δηλωθεί στο σώμα του πακέτου. Για αυτόν τον λόγο, χρησιμοποιείται η δήλωση προς τα εμπρός. Αλλά είναι μάλλον ασυνήθιστο να χρησιμοποιείται, επειδή τις περισσότερες φορές τα ιδιωτικά στοιχεία δηλώνονται και ορίζονται στο πρώτο μέρος του σώματος του πακέτου.
Η εκ των προτέρων δήλωση είναι μια επιλογή που παρέχεται από OracleΔεν είναι υποχρεωτικό και η χρήση του ή όχι εξαρτάται από τις απαιτήσεις του προγραμματιστή.
Το παρακάτω στιγμιότυπο οθόνης δείχνει πώς ένα ιδιωτικό στοιχείο δηλώνεται προς τα εμπρός και αργότερα ορίζεται στο σώμα του πακέτου.
Σύνταξη:
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element declaration> . . . <Public element definition that refer the above private element> . . <Private element definition> . BEGIN <package_initialization code>; END <package_name>
Η παραπάνω σύνταξη δείχνει μπροστινή δήλωση. Τα ιδιωτικά στοιχεία δηλώνονται χωριστά στο μπροστινό μέρος του πακέτου και έχουν οριστεί στο επόμενο μέρος.
Χρήση δρομέων στο πακέτο
Σε αντίθεση με άλλα στοιχεία, πρέπει να είστε προσεκτικοί όταν χρησιμοποιείτε κέρσορες μέσα στο πακέτο.
Εάν ο δρομέας έχει οριστεί στις προδιαγραφές του πακέτου ή στο καθολικό μέρος του σώματος του πακέτου, τότε ο δρομέας, αφού ανοιχτεί, θα παραμείνει μέχρι το τέλος της συνεδρίας.
Επομένως, θα πρέπει πάντα να χρησιμοποιείτε το χαρακτηριστικό cursor '%ISOPEN' για να επαληθεύσετε την κατάσταση του δρομέα πριν ανατρέξετε σε αυτόν.
Υπερφόρτωση
Η υπερφόρτωση είναι η έννοια της ύπαρξης πολλών υποπρογραμμάτων με το ίδιο όνομα. Αυτά τα υποπρογράμματα διαφέρουν μεταξύ τους ως προς τον αριθμό των παραμέτρων, τους τύπους των παραμέτρων ή τον τύπο επιστροφής. Με άλλα λόγια, υποπρογράμματα με το ίδιο όνομα αλλά με διαφορετικό αριθμό παραμέτρων, διαφορετικούς τύπους παραμέτρων ή διαφορετικό τύπο επιστροφής θεωρούνται υπερφόρτωση.
Αυτό είναι χρήσιμο όταν πολλά υποπρογράμματα πρέπει να εκτελέσουν την ίδια εργασία, αλλά ο τρόπος κλήσης καθενός από αυτά θα πρέπει να είναι διαφορετικός. Σε αυτήν την περίπτωση, το όνομα του υποπρογράμματος διατηρείται το ίδιο για όλα και οι παράμετροι αλλάζουν σύμφωνα με την εντολή κλήσης.
Παράδειγμα 1: Σε αυτό το παράδειγμα, θα δημιουργήσουμε ένα πακέτο για να λάβουμε και να ορίσουμε τις τιμές των πληροφοριών ενός υπαλλήλου στον πίνακα 'emp'. Η συνάρτηση get_record θα επιστρέψει την έξοδο τύπου εγγραφής για τον δεδομένο αριθμό υπαλλήλου και η διαδικασία set_record θα εισαγάγει τον τύπο εγγραφής στον πίνακα emp.
Βήμα 1) Δημιουργία Προδιαγραφών Πακέτου
Το παρακάτω στιγμιότυπο οθόνης δείχνει την προδιαγραφή του πακέτου guru99_get_set που δημιουργείται στο Oracle.
CREATE OR REPLACE PACKAGE guru99_get_set IS PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE); FUNCTION get_record (p_emp_no IN NUMBER) RETURN emp%ROWTYPE; END guru99_get_set; /
Παραγωγή:
Package created
Code εξήγηση
- Code γραμμή 1-5: Δημιουργία της προδιαγραφής πακέτου για το guru99_get_set με μία διαδικασία και μία συνάρτηση. Αυτά τα δύο είναι πλέον δημόσια στοιχεία αυτού του πακέτου.
Βήμα 2) Το πακέτο περιέχει ένα σώμα πακέτου, όπου ορίζονται οι πραγματικοί ορισμοί όλων των διαδικασιών και συναρτήσεων. Σε αυτό το βήμα, δημιουργείται το σώμα του πακέτου.
Το παρακάτω στιγμιότυπο οθόνης δείχνει τον ορισμό του σώματος του πακέτου guru99_get_set στο Oracle.
CREATE OR REPLACE PACKAGE BODY guru99_get_set IS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO emp VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no, p_emp_rec.salary,p_emp_rec.manager); COMMIT; END set_record; FUNCTION get_record(p_emp_no IN NUMBER) RETURN emp%ROWTYPE IS l_emp_rec emp%ROWTYPE; BEGIN SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no; RETURN l_emp_rec; END get_record; BEGIN dbms_output.put_line('Control is now executing the package initialization part'); END guru99_get_set; /
Παραγωγή:
Package body created
Code εξήγηση
- Code γραμμή 7: Δημιουργία του σώματος του πακέτου.
- Code γραμμή 9-16: Ορισμός του στοιχείου 'set_record' που δηλώνεται στην προδιαγραφή. Αυτό είναι το ίδιο με τον ορισμό μιας αυτόνομης διαδικασίας σε PL/SQL.
- Code γραμμή 17-24: Ορισμός του στοιχείου 'get_record'. Είναι το ίδιο με τον ορισμό μιας αυτόνομης συνάρτησης.
- Code γραμμή 25-26: Καθορισμός του τμήματος προετοιμασίας πακέτου.
Βήμα 3) Δημιουργία ενός ανώνυμου μπλοκ για την εισαγωγή και εμφάνιση των εγγραφών ανατρέχοντας στο πακέτο που δημιουργήθηκε παραπάνω.
Το παρακάτω στιγμιότυπο οθόνης δείχνει το ανώνυμο μπλοκ που καλεί το πακέτο, μαζί με την έξοδό του στο Oracle.
DECLARE l_emp_rec emp%ROWTYPE; l_get_rec emp%ROWTYPE; BEGIN dbms_output.put_line('Insert new record for employee 1004'); l_emp_rec.emp_no:=1004; l_emp_rec.emp_name:='CCC'; l_emp_rec.salary:=20000; l_emp_rec.manager:='BBB'; guru99_get_set.set_record(l_emp_rec); dbms_output.put_line('Record inserted'); dbms_output.put_line('Calling get function to display the inserted record'); l_get_rec:=guru99_get_set.get_record(1004); dbms_output.put_line('Employee name: '||l_get_rec.emp_name); dbms_output.put_line('Employee number:'||l_get_rec.emp_no); dbms_output.put_line('Employee salary:'||l_get_rec.salary); dbms_output.put_line('Employee manager:'||l_get_rec.manager); END; /
Παραγωγή:
Insert new record for employee 1004 Control is now executing the package initialization part Record inserted Calling get function to display the inserted record Employee name: CCC Employee number: 1004 Employee salary: 20000 Employee manager: BBB
Code Επεξήγηση:
- Code γραμμή 34-37: Συμπλήρωση των δεδομένων για τη μεταβλητή τύπου εγγραφής σε ένα ανώνυμο μπλοκ για την κλήση του στοιχείου 'set_record' του πακέτου.
- Code γραμμή 38: Έχει γίνει μια κλήση στο 'set_record' του πακέτου guru99_get_set. Τώρα το πακέτο έχει δημιουργηθεί και θα παραμείνει μέχρι το τέλος της συνεδρίας. Το τμήμα αρχικοποίησης του πακέτου εκτελείται, καθώς αυτή είναι η πρώτη κλήση στο πακέτο και η εγγραφή εισάγεται από το στοιχείο 'set_record' στον πίνακα.
- Code γραμμή 41: Κλήση του στοιχείου 'get_record' για την εμφάνιση των λεπτομερειών του εισαγόμενου υπαλλήλου. Το πακέτο αναφέρεται για δεύτερη φορά κατά τη διάρκεια αυτής της κλήσης, αλλά το τμήμα αρχικοποίησης δεν εκτελείται ξανά, καθώς το πακέτο έχει ήδη αρχικοποιηθεί σε αυτήν την συνεδρία.
- Code γραμμή 42-45: Εκτύπωση στοιχείων υπαλλήλου.
Εξάρτηση στα πακέτα
Δεδομένου ότι το πακέτο είναι μια λογική ομάδαping από σχετικά πράγματα, έχει κάποιες εξαρτήσεις. Ακολουθούν οι εξαρτήσεις που πρέπει να αντιμετωπιστούν.
- Μια προδιαγραφή είναι ένα αυτόνομο αντικείμενο.
- Ένα σώμα συσκευασίας εξαρτάται από τις προδιαγραφές.
- Το σώμα του πακέτου μπορεί να μεταγλωττιστεί ξεχωριστά. Κάθε φορά που μεταγλωττίζεται η προδιαγραφή, το σώμα πρέπει να μεταγλωττιστεί ξανά, καθώς θα καταστεί άκυρο.
- Το υποπρόγραμμα στο σώμα του πακέτου που εξαρτάται από ένα ιδιωτικό στοιχείο θα πρέπει να ορίζεται μόνο μετά τη δήλωση του ιδιωτικού στοιχείου.
- Τα αντικείμενα της βάσης δεδομένων που αναφέρονται στην προδιαγραφή και στο σώμα πρέπει να βρίσκονται σε έγκυρη κατάσταση κατά τη στιγμή της μεταγλώττισης του πακέτου.
Πληροφορίες πακέτου
Μόλις δημιουργηθεί το πακέτο, οι πληροφορίες του πακέτου, όπως η πηγή του πακέτου, οι λεπτομέρειες του υποπρογράμματος και οι λεπτομέρειες υπερφόρτωσης, είναι διαθέσιμες στο Oracle πίνακες λεξικού δεδομένων.
Ο παρακάτω πίνακας παρέχει τον πίνακα λεξικού δεδομένων και τις πληροφορίες πακέτων που είναι διαθέσιμες σε κάθε πίνακα.
| Όνομα πίνακα | Περιγραφή | Απορία |
|---|---|---|
| ΟΛΑ_ΤΑ_ΑΝΤΙΚΕΙΜΕΝΑ | Δίνει τις λεπτομέρειες του πακέτου όπως object_id, creation_date, last_ddl_time, κ.λπ. Περιέχει τα αντικείμενα που δημιουργήθηκαν από όλους τους χρήστες. | SELECT * FROM all_objects όπου object_name =' ' |
| ΑΝΤΙΚΕΙΜΕΝΑ_ΧΡΗΣΤΗ | Δίνει τις λεπτομέρειες του πακέτου όπως object_id, creation_date, last_ddl_time, κ.λπ. Περιέχει τα αντικείμενα που δημιουργήθηκαν από τον τρέχοντα χρήστη. | SELECT * FROM user_objects όπου object_name =' ' |
| ALL_SOURCE | Δίνει την πηγή των αντικειμένων που δημιουργήθηκαν από όλους τους χρήστες. | SELECT * FROM all_source where name=' ' |
| USER_SOURCE | Δίνει την πηγή των αντικειμένων που δημιουργήθηκαν από τον τρέχοντα χρήστη. | SELECT * FROM user_source where name=' ' |
| ΟΛΕΣ_ΔΙΑΔΙΚΑΣΙΕΣ | Δίνει λεπτομέρειες για το υποπρόγραμμα, όπως object_id, λεπτομέρειες υπερφόρτωσης κ.λπ. που δημιουργήθηκαν από όλους τους χρήστες. | ΕΠΙΛΕΞΤΕ * ΑΠΟ all_procedures Όπου object_name=' « |
| USER_PROCEDURES | Δίνει στο υποπρόγραμμα λεπτομέρειες όπως object_id, λεπτομέρειες υπερφόρτωσης κ.λπ. που δημιουργήθηκαν από τον τρέχοντα χρήστη. | ΕΠΙΛΕΞΤΕ * ΑΠΟ user_procedures Όπου object_name=' « |
UTL_FILE – Μια επισκόπηση
Το UTL_FILE είναι ένα ξεχωριστό πακέτο βοηθητικού προγράμματος που παρέχεται από Oracle για την εκτέλεση ειδικών εργασιών. Χρησιμοποιείται κυρίως για την ανάγνωση και εγγραφή αρχείων λειτουργικού συστήματος από πακέτα ή υποπρογράμματα PL/SQL. Έχει ξεχωριστές λειτουργίες για την εισαγωγή πληροφοριών σε αρχεία και την λήψη πληροφοριών από αυτά. Επιτρέπει επίσης την ανάγνωση και την εγγραφή στο εγγενές σύνολο χαρακτήρων.
Ο προγραμματιστής μπορεί να το χρησιμοποιήσει αυτό για να γράψει αρχεία λειτουργικού συστήματος οποιουδήποτε τύπου και το αρχείο θα γραφτεί απευθείας στον διακομιστή βάσης δεδομένων. Το όνομα και η διαδρομή καταλόγου αναφέρονται κατά τη στιγμή της εγγραφής.





