Oracle Pachetul PL/SQL: tip, specificație, corp [Exemplu]
În ce este pachetul Oracle?
Pachetul PL/SQL este o grupare logică a unui subprogram asociat (procedură/funcție) într-un singur element. Un pachet este compilat și stocat ca obiect de bază de date care poate fi folosit ulterior.
Componentele pachetelor
Pachetul PL/SQL are două componente.
- Specificația pachetului
- Corpul pachetului
Specificația pachetului
Specificația pachetului constă într-o declarație a întregului public variabile, cursoare, obiecte, proceduri, funcții și excepție.
Mai jos sunt câteva caracteristici ale specificației pachetului.
- Elementele care sunt toate declarate în caietul de sarcini pot fi accesate din exteriorul pachetului. Astfel de elemente sunt cunoscute ca element public.
- Specificația pachetului este un element de sine stătător, ceea ce înseamnă că poate exista singur fără corpul pachetului.
- Ori de câte ori un pachet a trimis o instanță a pachetului este creată pentru acea sesiune anume.
- După ce instanța este creată pentru o sesiune, toate elementele pachetului care sunt inițiate în acea instanță sunt valabile până la sfârșitul sesiunii.
Sintaxă
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
Sintaxa de mai sus arată crearea specificației pachetului.
Corpul pachetului
Constă în definirea tuturor elementelor care sunt prezente în specificația pachetului. Poate avea si o definitie a elementelor care nu sunt declarate in caiet de sarcini, aceste elemente se numesc elemente private si pot fi apelate doar din interiorul pachetului.
Mai jos sunt caracteristicile corpului unui pachet.
- Ar trebui să conțină definiții pentru toate subprogramele/cursoare care au fost declarate în caietul de sarcini.
- De asemenea, poate avea mai multe subprograme sau alte elemente care nu sunt declarate în caiet de sarcini. Acestea se numesc elemente private.
- Este un obiect de încredere și depinde de specificația pachetului.
- Starea corpului pachetului devine „Invalid” ori de câte ori specificația este compilată. Prin urmare, trebuie să fie recompilat de fiecare dată după compilarea specificațiilor.
- Elementele private trebuie definite mai întâi înainte de a fi utilizate în corpul pachetului.
- Prima parte a pachetului este partea de declarație globală. Aceasta include variabile, cursoare și elemente private (declarație forward) care sunt vizibile pentru întregul pachet.
- Ultima parte a pachetului este partea de inițializare a pachetului care se execută o singură dată de fiecare dată când un pachet este referit pentru prima dată în sesiune.
Sintaxă:
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>
- Sintaxa de mai sus arată crearea corpului pachetului.
Acum vom vedea cum să trimitem elementele pachetului în program.
Elemente de pachet de referință
Odată ce elementele sunt declarate și definite în pachet, trebuie să facem referire la elemente pentru a le folosi.
Toate elementele publice ale pachetului pot fi referite prin apelarea numelui pachetului urmat de numele elementului separat de punct, adică „ . '.
Variabila publică a pachetului poate fi, de asemenea, utilizată în același mod pentru a atribui și a prelua valori de la ele, de exemplu ' . '.
Creați pachet în PL/SQL
În PL/SQL ori de câte ori un pachet este referit/apelat într-o sesiune, va fi creată o nouă instanță pentru acel pachet.
Oracle oferă o facilitate pentru a inițializa elementele pachetului sau pentru a efectua orice activitate la momentul creării acestei instanțe prin „Inițializarea pachetului”.
Acesta nu este altceva decât un bloc de execuție care este scris în corpul pachetului după definirea tuturor elementelor pachetului. Acest bloc va fi executat ori de câte ori un pachet este referit pentru prima dată în sesiune.
Sintaxă
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- Sintaxa de mai sus arată definiția inițializării pachetului în corpul pachetului.
Declarații înainte
Declarația/referința în pachet nu este altceva decât declararea elementelor private separat și definirea acesteia în partea ulterioară a corpului pachetului.
Elementele private pot fi trimise numai dacă sunt deja declarate în corpul pachetului. Din acest motiv, se utilizează declarația anticipată. Dar este destul de neobișnuit de utilizat, deoarece de cele mai multe ori elementele private sunt declarate și definite în prima parte a corpului pachetului.
Declarația anticipată este o opțiune oferită de Oracle, nu este obligatoriu și folosirea și neutilizarea este la cerințele programatorului.
Sintaxă:
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>
Sintaxa de mai sus arată declarația înainte. Elementele private sunt declarate separat în partea anterioară a pachetului și au fost definite în partea ulterioară.
Utilizarea cursorelor în pachet
Spre deosebire de alte elemente, trebuie să fiți atenți în utilizarea cursorelor în interiorul pachetului.
Dacă cursorul este definit în specificația pachetului sau în partea globală a corpului pachetului, atunci cursorul odată deschis va persista până la sfârșitul sesiunii.
Deci, ar trebui să folosiți întotdeauna atributele cursorului „%ISOPEN” pentru a verifica starea cursorului înainte de a-l trimite.
Suprasolicitare
Supraîncărcarea este conceptul de a avea mai multe subprograme cu același nume. Aceste subprograme vor fi diferite între ele printr-un număr de parametri sau tipuri de parametri sau de tip returnat, adică subprogramul cu același nume, dar cu un număr diferit de parametri, diferite tipuri de parametri sau retipuri diferite sunt considerate supraîncărcări.
Acest lucru este util atunci când multe subprograme trebuie să facă aceeași sarcină, dar modul de apelare a fiecăruia dintre ele ar trebui să fie diferit. În acest caz, numele subprogramului va fi păstrat același pentru toți, iar parametrii vor fi modificați conform instrucțiunii de apelare.
Exemplu 1: În acest exemplu, vom crea un pachet pentru a obține și a seta valorile informațiilor angajatului în tabelul „emp”. Funcția get_record va returna tipul de înregistrare pentru numărul de angajat dat, iar procedura set_record va insera înregistrarea tipului de înregistrare în tabelul emp.
Pas 1) Crearea specificațiilor pachetului
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: /
ieșire:
Package created
Explicarea codului
- Linia de cod 1-5: Crearea specificației pachetului pentru guru99_get_set cu o singură procedură și o singură funcție. Aceste două sunt acum elemente publice ale acestui pachet.
Pas 2) Pachetul conține corpul pachetului, unde toate procedurile și funcțiile vor fi definite. În acest pas, este creat corpul pachetului.
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: /
ieșire:
Package body created
Explicarea codului
- Linia de cod 7: Crearea corpului pachetului.
- Linia de cod 9-16: Definirea elementului „set_record” care este declarat în specificație. Acest lucru este același cu definirea procedurii autonome în PL/SQL.
- Linia de cod 17-24: Definirea elementului „get_record”. Este la fel ca și definirea funcției de sine stătătoare.
- Linia de cod 25-26: Definirea părții de inițializare a pachetului.
Pas 3) Crearea unui bloc anonim pentru a insera și afișa înregistrările prin referire la pachetul creat mai sus.
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: /
ieșire:
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
Explicația codului:
- Linia de cod 34-37: Popularea datelor pentru variabila tip înregistrare într-un bloc anonim pentru a apela elementul „set_record” al pachetului.
- Linia de cod 38: A fost efectuat un apel către „set_record” al pachetului guru99_get_set. Acum pachetul este instanțiat și va persista până la sfârșitul sesiunii.
- Partea de inițializare a pachetului este executată deoarece acesta este primul apel către pachet.
- Înregistrarea este inserată de elementul „set_record” în tabel.
- Linia de cod 41: Apelarea elementului „get_record” pentru a afișa detaliile angajatului inserat.
- Pachetul este referit pentru a doua oară în timpul apelului „get_record” către pachet. Dar partea de inițializare nu este executată de data aceasta deoarece pachetul este deja inițializat în această sesiune.
- Linia de cod 42-45: Imprimarea detaliilor angajatului.
Dependența în pachete
Deoarece pachetul este gruparea logică a lucrurilor înrudite, are unele dependențe. Mai jos sunt dependența care trebuie îngrijită.
- O specificație este un obiect de sine stătător.
- Corpul unui pachet depinde de specificație.
- Corpul pachetului poate fi compilat separat. Ori de câte ori specificația este compilată, corpul trebuie să fie recompilat, deoarece va deveni invalid.
- Subprogramul din corpul pachetului care este dependent de un element privat ar trebui definit numai după declararea elementului privat.
- Obiectele bazei de date la care se face referire în specificație și în corp trebuie să fie în stare validă în momentul compilării pachetului.
Informații despre pachet
Odată ce informațiile despre pachet sunt create, informațiile despre pachet, cum ar fi sursa pachetului, detaliile subprogramului și detaliile de supraîncărcare, sunt disponibile în Oracle tabele de definire a datelor.
Tabelul de mai jos oferă tabelul de definire a datelor și informațiile despre pachet care sunt disponibile în tabel.
| Nume tabel | Descriere | Întrebare |
|---|---|---|
| ALL_OBJECT | Oferă detaliile pachetului cum ar fi object_id, creation_date, last_ddl_time etc. Va conține obiectele create de toți utilizatorii. | SELECT * FROM all_objects unde object_name =' ' |
| USER_OBJECT | Oferă detaliile pachetului, cum ar fi object_id, creation_date, last_ddl_time etc. Acesta va conține obiectele create de utilizatorul curent. | SELECT * FROM user_objects unde object_name =' ' |
| ALL_SOURCE | Oferă sursa obiectelor create de toți utilizatorii. | SELECT * FROM all_source where name=' ' |
| USER_SOURCE | Oferă sursa obiectelor create de utilizatorul curent. | SELECT * FROM user_source unde nume=' ' |
| TOATE_PROCEDURILE | Oferă detalii subprogramului, cum ar fi object_id, detalii de supraîncărcare etc., create de toți utilizatorii. | SELECT * FROM toate_procedurile Unde nume_obiect=' ' |
| USER_PROCEDURES | Oferă detalii subprogramului, cum ar fi object_id, detalii de supraîncărcare etc. create de utilizatorul curent. | SELECT * FROM user_procedures Unde nume_obiect=' ' |
FIȘIER UTL – O prezentare generală
Fișierul UTL este pachetul de utilitate separat furnizat de Oracle pentru a îndeplini sarcini speciale. Acesta este utilizat în principal pentru citirea și scrierea fișierelor sistemului de operare din pachetele sau subprogramele PL/SQL. Are funcții separate pentru a pune informațiile și pentru a obține informațiile din fișiere. De asemenea, permite citirea/scrierea în setul de caractere nativ.
Programatorul poate folosi acest lucru pentru a scrie fișiere de sistem de operare de orice tip, iar fișierul va fi scris direct pe serverul bazei de date. Numele și calea directorului vor fi menționate în momentul scrierii.
Rezumat
Acum am învățat pachetele în PL / SQL, iar acum ar trebui să puteți lucra în următoarele.
- Pachetele PL/SQL și componentele acestuia
- Caracteristicile pachetelor
- Referirea și supraîncărcarea elementelor pachetului
- Gestionarea dependențelor din pachete
- Vizualizarea informațiilor despre pachet
- Ce este fișierul UTL





