Oracle Πακέτο PL/SQL: Τύπος, Προδιαγραφή, Σώμα [Παράδειγμα]

Τι περιλαμβάνει το πακέτο Oracle?

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

Στοιχεία πακέτων

Το πακέτο PL/SQL έχει δύο στοιχεία.

  • Προδιαγραφή πακέτου
  • Σώμα συσκευασίας

Προδιαγραφή πακέτου

Η προδιαγραφή του πακέτου αποτελείται από μια δήλωση όλου του κοινού μεταβλητές, δρομείς, αντικείμενα, διαδικασίες, συναρτήσεις και εξαίρεση.

Παρακάτω είναι μερικά χαρακτηριστικά της προδιαγραφής πακέτου.

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

Σύνταξη

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

Η παραπάνω σύνταξη δείχνει τη δημιουργία προδιαγραφών πακέτου.

Σώμα συσκευασίας

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

Παρακάτω είναι τα χαρακτηριστικά ενός σώματος συσκευασίας.

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

Σύνταξη:

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'.

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

Σύνταξη

Δημιουργία πακέτου σε PL/SQL

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<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>

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

Χρήση δρομέων στο πακέτο

Σε αντίθεση με άλλα Στοιχεία, πρέπει να είστε προσεκτικοί στη χρήση δρομέων μέσα στη συσκευασία.

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

Επομένως, θα πρέπει πάντα να χρησιμοποιεί κανείς τα χαρακτηριστικά του δρομέα '%ISOPEN' για να επαληθεύει την κατάσταση του δρομέα πριν τον παραπέμψει.

Υπερφόρτωση

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

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

Παράδειγμα 1: Σε αυτό το παράδειγμα, θα δημιουργήσουμε ένα πακέτο για να λάβουμε και να ορίσουμε τις τιμές των πληροφοριών του υπαλλήλου στον πίνακα 'emp'. Η συνάρτηση get_record θα επιστρέψει την έξοδο τύπου εγγραφής για τον δεδομένο αριθμό υπαλλήλου και η διαδικασία set_record θα εισαγάγει την εγγραφή τύπου εγγραφής στον πίνακα emp.

Βήμα 1) Δημιουργία προδιαγραφών πακέτου

Υπερφόρτωση

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

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

  • Κωδικός γραμμή 1-5: Δημιουργία της προδιαγραφής πακέτου για το guru99_get_set με μία διαδικασία και μία συνάρτηση. Αυτά τα δύο είναι πλέον δημόσια στοιχεία αυτού του πακέτου.

Βήμα 2) Το πακέτο περιέχει το σώμα του πακέτου, όπου θα οριστεί ο πραγματικός ορισμός όλων των διαδικασιών και λειτουργιών. Σε αυτό το βήμα, δημιουργείται Package Body.

Υπερφόρτωση

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;
BEGUN	
dbms_output.put_line(‘Control is now executing the package initialization part');
END guru99_get_set:
/

Παραγωγή:

Package body created

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

  • Κωδικός γραμμή 7: Δημιουργία σώματος συσκευασίας.
  • Κωδικός γραμμή 9-16: Καθορισμός του στοιχείου 'set_record' που δηλώνεται στην προδιαγραφή. Αυτό είναι το ίδιο με τον ορισμό της αυτόνομης διαδικασίας στο PL/SQL.
  • Γραμμή κώδικα 17-24: Ορισμός του στοιχείου 'get_record'. Είναι το ίδιο με τον ορισμό της αυτόνομης λειτουργίας.
  • Γραμμή κώδικα 25-26: Καθορισμός του τμήματος προετοιμασίας πακέτου.

Βήμα 3) Δημιουργία ανώνυμου μπλοκ για την εισαγωγή και εμφάνιση των εγγραφών με αναφορά στο παραπάνω δημιουργημένο πακέτο.

Υπερφόρτωση

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:=l004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary~20000;
l_emp_rec.manager:=’BBB’;
guru99_get_set.set_record(1_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:‘||1_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

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

  • Γραμμή κώδικα 34-37: Συμπλήρωση των δεδομένων για τη μεταβλητή τύπου εγγραφής σε ένα ανώνυμο μπλοκ για να καλέσετε το στοιχείο «set_record» του πακέτου.
  • Κωδικός γραμμή 38: Έγινε κλήση στο 'set_record' του πακέτου guru99_get_set. Τώρα το πακέτο έχει δημιουργηθεί και θα παραμείνει μέχρι το τέλος της συνεδρίας.
  • Το τμήμα προετοιμασίας του πακέτου εκτελείται αφού αυτή είναι η πρώτη κλήση προς το πακέτο.
  • Η εγγραφή εισάγεται από το στοιχείο 'set_record' στον πίνακα.
  • Κωδικός γραμμή 41: Κλήση του στοιχείου 'get_record' για να εμφανιστούν τα στοιχεία του υπαλλήλου που έχει εισαχθεί.
  • Το πακέτο παραπέμπεται για δεύτερη φορά κατά τη διάρκεια της κλήσης 'get_record' στο πακέτο. Αλλά το τμήμα προετοιμασίας δεν εκτελείται αυτή τη φορά, καθώς το πακέτο έχει ήδη προετοιμαστεί σε αυτήν τη συνεδρία.
  • Γραμμή κώδικα 42-45: Εκτύπωση στοιχείων υπαλλήλου.

Εξάρτηση στα πακέτα

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

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

Πληροφορίες πακέτου

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

Ο παρακάτω πίνακας δίνει τον πίνακα ορισμού δεδομένων και τις πληροφορίες του πακέτου που είναι διαθέσιμες στον πίνακα.

Όνομα πίνακα Descriptιόν Απορία
ALL_OBJECT Δίνει τις λεπτομέρειες του πακέτου όπως object_id, creation_date, last_ddl_time, κ.λπ. Θα περιέχει τα αντικείμενα που έχουν δημιουργηθεί από όλους τους χρήστες. SELECT * FROM all_objects όπου object_name =' '
USER_OBJECT Δίνει τις λεπτομέρειες του πακέτου όπως 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, λεπτομέρειες υπερφόρτωσης κ.λπ. που δημιουργούνται από όλους τους χρήστες. SELECT * FROM all_procedures
Όπου αντικείμενο_όνομα=' '
USER_PROCEDURES Δίνει στο υποπρόγραμμα λεπτομέρειες όπως object_id, λεπτομέρειες υπερφόρτωσης κ.λπ. που δημιουργήθηκαν από τον τρέχοντα χρήστη. ΕΠΙΛΟΓΗ * ΑΠΟ user_procedures
Όπου αντικείμενο_όνομα=' '

UTL FILE – Μια επισκόπηση

Το αρχείο UTL είναι το ξεχωριστό πακέτο βοηθητικών προγραμμάτων που παρέχεται από Oracle για την εκτέλεση ειδικών εργασιών. Αυτό χρησιμοποιείται κυρίως για την ανάγνωση και εγγραφή των αρχείων του λειτουργικού συστήματος από πακέτα ή υποπρογράμματα PL/SQL. Είχε τις ξεχωριστές λειτουργίες για να βάλει τις πληροφορίες και να πάρει τις πληροφορίες από αρχεία. Επιτρέπει επίσης την ανάγνωση/εγγραφή στο εγγενές σύνολο χαρακτήρων.

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

Σύνοψη

Τώρα μάθαμε τα πακέτα PL / SQL, και θα πρέπει τώρα να μπορείτε να εργαστείτε στα ακόλουθα.

  • Πακέτα PL/SQL και τα εξαρτήματά τους
  • Χαρακτηριστικά συσκευασιών
  • Παραπομπή και υπερφόρτωση στοιχείων συσκευασίας
  • Διαχείριση εξαρτήσεων σε πακέτα
  • Προβολή πληροφοριών πακέτου
  • Τι είναι το αρχείο UTL