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

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

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

  • 📦 Ορισμός πακέτου: Ένα πακέτο είναι μια λογική ομάδαping σχετικών υποπρογραμμάτων και αντικειμένων, που μεταγλωττίζονται και αποθηκεύονται ως ένα ενιαίο αντικείμενο βάσης δεδομένων.
  • 📋 Προδιαγραφές συσκευασίας: Δηλώνει τις δημόσιες μεταβλητές, τους δρομείς, τους τύπους, τις εξαιρέσεις, τις διαδικασίες και τις συναρτήσεις που είναι προσβάσιμες εκτός του πακέτου.
  • 🧱 Σώμα συσκευασίας: Ορίζει κάθε στοιχείο που δηλώνεται στην προδιαγραφή, συν τα ιδιωτικά στοιχεία που μπορούν να κληθούν μόνο από το εσωτερικό του πακέτου.
  • 🔁 Υπερφόρτωση: Πολλά υποπρογράμματα μπορεί να μοιράζονται ένα όνομα όταν ο αριθμός παραμέτρου, οι τύποι παραμέτρων ή ο τύπος επιστροφής τους διαφέρουν.
  • 🔗 Παραπομπή και Εξάρτηση: Τα δημόσια στοιχεία ονομάζονται package_name.element_name και το σώμα τους εξαρτάται από την προδιαγραφή.
  • 🤖 Βοήθεια AI: Βοηθοί τεχνητής νοημοσύνης, όπως το GitHub Copilot, σχεδιάζουν προδιαγραφές πακέτων, σώματα και υπερφορτωμένα υποπρογράμματα από ένα σχόλιο.

Oracle Προδιαγραφές πακέτου 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'.

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

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

Δημιουργία ενός πακέτου PL/SQL με ένα μπλοκ αρχικοποίησης πακέτου στο σώμα του πακέτου

Σύνταξη

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGIN
<Package Initialization> 
END <package_name>

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

Προωθητικές δηλώσεις

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

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

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

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

Προώθηση δήλωσης ενός ιδιωτικού στοιχείου σε ένα Oracle Σώμα πακέτου PL/SQL

Σύνταξη:

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.

Δημιουργία της προδιαγραφής πακέτου guru99_get_set με set_record και get_record στο 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.

Ορισμός του σώματος του πακέτου guru99_get_set με set_record, get_record και το μπλοκ αρχικοποίησης

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.

Ανώνυμο μπλοκάρισμα που καλεί τον guru99_get_set για εισαγωγή και εμφάνιση μιας εγγραφής υπαλλήλου με έξοδο

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. Έχει ξεχωριστές λειτουργίες για την εισαγωγή πληροφοριών σε αρχεία και την λήψη πληροφοριών από αυτά. Επιτρέπει επίσης την ανάγνωση και την εγγραφή στο εγγενές σύνολο χαρακτήρων.

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

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

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

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

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

Χρησιμοποιήστε την εντολή DROP PACKAGE για να καταργήσετε τόσο την προδιαγραφή όσο και το σώμα ή την εντολή DROP PACKAGE BODY για να καταργήσετε μόνο το σώμα. Επαναμεταγλωττίστε ένα μη έγκυρο πακέτο με την εντολή ALTER PACKAGE package_name COMPILE ή την εντολή COMPILE BODY για να αναδημιουργήσετε μόνο το σώμα μετά τις αλλαγές.

Το χαρακτηριστικό %ROWTYPE δηλώνει ένα ρεκόρ των οποίων τα πεδία ταιριάζουν με τις στήλες του πίνακα emp. Η χρήση του emp%ROWTYPE διατηρεί τις παραμέτρους get_record και set_record ευθυγραμμισμένες με τη δομή του πίνακα, επομένως οι αλλαγές στηλών απαιτούν λιγότερες επεξεργασίες κώδικα.

Ναι. Κάθε συνεδρία που αναφέρεται σε ένα πακέτο λαμβάνει τη δική της δημιουργία και κατάσταση πακέτου, η οποία παραμένει για όλη τη διάρκεια ζωής αυτής της συνεδρίας. Η επαναμεταγλώττιση του σώματος απορρίπτει την κατάσταση και εμφανίζει το σφάλμα ORA-04068 στην επόμενη κλήση.

Ναί. GitHub Copilot συντάσσει προδιαγραφές πακέτων, αντίστοιχα σώματα και υπερφορτωμένα υποπρογράμματα από ένα σχόλιο και προτείνει παραμέτρους %ROWTYPE. RevΔείτε τα δημιουργημένα όρια, το μπλοκ αρχικοποίησης και τον χειρισμό εξαιρέσεων πριν από την ανάπτυξη.

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

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