Pachetul Oracle PL / SQL: tip, specificații, corp (exemplu)

Cuprins:

Anonim

Ce este pachetul în 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 utilizat ulterior.

În acest tutorial, veți învăța-

  • Componentele pachetelor
  • Specificația pachetului
  • Corpul pachetului
  • Elemente referitoare la pachet
  • Creați pachet în PL / SQL
  • Declarații înainte
  • Utilizarea cursorilor în pachet
  • Suprasolicitare
  • Dependența în pachete
  • Informații despre pachet
  • UTL FILE - Prezentare generală

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 tuturor variabilelor publice, cursorelor, obiectelor, procedurilor, funcțiilor și excepției.

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 independent care î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ă crearea instanței 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 
IS… END 

Sintaxa de mai sus arată crearea specificațiilor pachetului.

Corpul pachetului

Acesta constă în definirea tuturor elementelor care sunt prezente în specificația pachetului. Poate avea, de asemenea, o definiție a elementelor care nu sunt declarate în caietul de sarcini, aceste elemente sunt numite elemente private și pot fi apelate numai din interiorul pachetului.

Mai jos sunt caracteristicile corpului ambalajului.

  • Ar trebui să conțină definiții pentru toate subprogramele / cursorii care au fost declarați în specificație.
  • De asemenea, poate avea mai multe subprograme sau alte elemente care nu sunt declarate în specificații. Acestea se numesc elemente private.
  • Este un obiect de încredere și depinde de specificațiile pachetului.
  • Starea corpului pachetului devine „Invalid” ori de câte ori este compilată specificația. Prin urmare, trebuie recompilat de fiecare dată după compilarea specificațiilor.
  • Elementele private ar trebui 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 directă) care sunt vizibile pentru întregul pachet.
  • Ultima parte a pachetului este partea de inițializare a pachetului care se execută o dată de fiecare dată când un pachet este trimis prima dată în sesiune.

Sintaxă:

CREATE [OR REPLACE] PACKAGE BODY 
IS.END 
  • Sintaxa de mai sus arată crearea corpului pachetului.

Acum vom vedea cum să trimitem elementele pachetului în program.

Elemente referitoare la pachet

Odată ce elementele sunt declarate și definite în pachet, trebuie să trimitem elementele pentru a le utiliza.

Toate elementele publice ale pachetului pot fi referite apelând numele 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 prelua valori de la acestea, adică „ . ”.

Creați pachet în PL / SQL

În PL / SQL ori de câte ori un pachet este trimis / 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 în momentul creării acestei instanțe prin „Initializarea 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 trimis pentru prima dată în sesiune.

Sintaxă

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGINEEND 
  • Sintaxa de mai sus arată definiția inițializării pachetului în corpul pachetului.

Declarații înainte

Declarația înainte / referința din pachet nu este altceva decât declararea separată a elementelor private ș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 folosește declarația forward. 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 de redirecționare este o opțiune oferită de Oracle, nu este obligatorie, iar utilizarea și neutilizarea depind de cerința programatorului.

Sintaxă:

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGIN
;END 

Sintaxa de mai sus arată declarația directă. Elementele private sunt declarate separat în partea anterioară a pachetului și au fost definite în partea ulterioară.

Utilizarea cursorilor în pachet

Spre deosebire de alte elemente, trebuie să aveți grijă să folosiți cursorele în interiorul pachetului.

Dacă cursorul este definit în specificațiile 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 referi.

Suprasolicitare

Supraîncărcarea este conceptul de a avea 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 return, adică subprogram cu același nume, dar cu un număr diferit de parametri, un tip diferit de parametri sau un tip diferit sunt considerați ca supraîncărcare.

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 și parametrii vor fi modificați conform instrucțiunii de apelare.

Exemplul 1 : În acest exemplu, vom crea un pachet pentru a obține și seta valorile informațiilor angajatului în tabelul „emp”. Funcția get_record va returna ieșirea tipului de înregistrare pentru numărul de angajat dat, iar procedura set_record va introduce înregistrarea tipului de înregistrare în tabelul emp.

Pasul 1) Crearea specificațiilor pachetului

CREATE OR REPLACE PACKAGE guru99_get_setISPROCEDURE 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țiilor pachetului pentru guru99_get_set cu o singură procedură și o funcție. Aceste două sunt acum elemente publice ale acestui pachet.

Pasul 2) Pachetul conține corpul pachetului, unde vor fi definite toate procedurile și funcțiile definirii reale. În acest pas, este creat Corpul pachetului.

CREATE OR REPLACE PACKAGE BODY guru99_get_setIS PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)ISPRAGMA AUTONOMOUS_TRANSACTION;BEGININSERT INTO empVALUES(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%ROWTYPEISl_emp_rec emp%ROWTYPE;BEGINSELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_noRETURN 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. Aceasta este la fel ca definirea procedurii independente în PL / SQL.
  • Linia de cod 17-24: Definirea elementului „get_record”. Este la fel ca definirea funcției independente.
  • Linia de cod 25-26: Definirea părții de inițializare a pachetului.

Pasul 3) Crearea unui bloc anonim pentru a insera și afișa înregistrările făcând referire la pachetul creat mai sus.

DECLAREl_emp_rec emp%ROWTYPE;l_get_rec emp%ROWTYPE;BEGINdbms 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 1004Control is now executing the package initialization partRecord insertedCalling get function to display the inserted recordEmployee name: CCCEmployee number: 1004Employee salary: 20000Employee manager: BBB

Explicatie cod:

  • Linia de cod 34-37: Popularea datelor pentru variabila de tip înregistrare într-un bloc anonim pentru a apela elementul „set_record” al pachetului.
  • Linia de cod 38: S- a făcut apel la „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ă în tabel de elementul „set_record”.
  • Linia de cod 41: Apelarea elementului „get_record” pentru a afișa detaliile angajatului inserat.
  • Pachetul este trimis pentru a doua oară în timpul apelului „get_record” către pachet. Dar partea de inițializare nu este executată de această dată, deoarece pachetul este deja inițializat în această sesiune.
  • Linia de cod 42-45: Tipărirea detaliilor angajaților.

Dependența în pachete

Deoarece pachetul este gruparea logică a lucrurilor conexe, acesta are unele dependențe. Următoarele sunt dependența care trebuie îngrijită.

  • O specificație este un obiect independent.
  • Un corp de pachet depinde de specificații.
  • Corpul pachetului poate fi compilat separat. Ori de câte ori specificațiile sunt compilate, corpul trebuie recompilat, deoarece va deveni invalid.
  • Subprogramul din corpul pachetului care depinde de un element privat trebuie definit numai după declarația elementului privat.
  • Obiectele bazei de date menționate în specificație și 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 suprasarcină, sunt disponibile în tabelele de definire a datelor Oracle.

Tabelul de mai jos oferă tabelul de definire a datelor și informațiile despre pachet care sunt disponibile în tabel.

Nume tabel Descriere Interogare
ALL_OBJECT Oferă detalii despre pachet, cum ar fi object_id, creation_date, last_ddl_time, etc. Acesta va conține obiectele create de toți utilizatorii. SELECT * FROM all_objects where object_name = ' '
USER_OBJECT Oferă detalii despre pachet, cum ar fi object_id, creation_date, last_ddl_time, etc. Acesta va conține obiectele create de utilizatorul curent. SELECT * FROM user_objects where 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 where name = ' '
ALL_PROCEDURES Oferă detaliile subprogramului precum obiect_id, detalii de suprasarcină etc. create de toți utilizatorii. SELECT * FROM all_procedures Where object_name = ' '
USER_PROCEDURES Oferă detaliile subprogramului precum obiect_id, detalii de suprasarcină etc. create de utilizatorul curent. SELECT * FROM user_procedures Where object_name = ' '

UTL FILE - Prezentare generală

Fișierul UTL este pachetul de utilități separat furnizat de Oracle pentru a efectua sarcini speciale. Acesta este utilizat în principal pentru citirea și scrierea fișierelor sistemului de operare din pachete PL / SQL sau subprograme. A primit 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 native.

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

Am învățat acum pachetele în PL / SQL și ar trebui să puteți lucra în cele ce urmează.

  • Pachetele PL / SQL și componentele sale
  • Caracteristicile pachetelor
  • Referirea și supraîncărcarea elementelor pachetului
  • Gestionarea dependențelor în pachete
  • Vizualizarea informațiilor despre pachet
  • Ce este fișierul UTL