Oracle PL/SQL paket: vrsta, specifikacija, tijelo [primjer]

U ฤemu je paket Oracle?

PL/SQL paket je logiฤka grupaping povezanog potprograma (procedure/funkcije) u jedan element. Paket se kompilira i pohranjuje kao objekt baze podataka koji se kasnije moลพe koristiti.

Komponente paketa

PL/SQL paket ima dvije komponente.

  • Specifikacija paketa
  • Tijelo paketa

Specifikacija paketa

Specifikacija paketa sastoji se od izjave svih javnosti varijable, kursori, objekti, procedure, funkcije i iznimke.

Ispod je nekoliko karakteristika specifikacije paketa.

  • Elementima koji su svi deklarirani u specifikaciji moลพe se pristupiti izvan paketa. Takvi elementi poznati su kao javni element.
  • Specifikacija paketa je samostalan element ลกto znaฤi da moลพe postojati sam bez tijela paketa.
  • Kad god je paket uputio, instanca paketa se kreira za tu odreฤ‘enu sesiju.
  • Nakon ลกto je instanca kreirana za sesiju, svi elementi paketa koji su pokrenuti u toj instanci vrijede do kraja sesije.

Sintaksa

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

Gornja sintaksa prikazuje stvaranje specifikacije paketa.

Tijelo paketa

Sastoji se od definicije svih elemenata koji su prisutni u specifikaciji paketa. Takoฤ‘er moลพe imati definiciju elemenata koji nisu deklarirani u specifikaciji, ti se elementi nazivaju privatnim elementima i mogu se pozvati samo iz paketa.

Ispod su karakteristike tijela paketa.

  • Treba sadrลพavati definicije za sve potprograme/pokazivaฤi koji su deklarirani u specifikaciji.
  • Takoฤ‘er moลพe imati viลกe potprograma ili drugih elemenata koji nisu deklarirani u specifikaciji. Oni se nazivaju privatnim elementima.
  • To je pouzdan objekt i ovisi o specifikaciji paketa.
  • Stanje tijela paketa postaje 'Nevaลพeฤ‡e' kad god se specifikacija kompajlira. Stoga ga je potrebno ponovno kompajlirati svaki put nakon kompilacije specifikacije.
  • Privatne elemente treba prvo definirati prije nego ลกto se koriste u tijelu paketa.
  • Prvi dio paketa je dio globalne deklaracije. To ukljuฤuje varijable, pokazivaฤe i privatne elemente (forward deklaracija) koji su vidljivi cijelom paketu.
  • Posljednji dio paketa je dio za inicijalizaciju paketa koji se izvrลกava jednom kad god se paket uputi prvi put u sesiji.

Sintaksa:

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>
  • Gornja sintaksa prikazuje stvaranje tijela paketa.

Sada ฤ‡emo vidjeti kako referencirati elemente paketa u programu.

Elementi referentnog paketa

Nakon ลกto su elementi deklarirani i definirani u paketu, moramo uputiti elemente da bismo ih koristili.

Svi javni elementi paketa mogu se uputiti pozivanjem naziva paketa nakon kojeg slijedi naziv elementa odvojen toฤkom, tj. ' . '.

Javna varijabla paketa takoฤ‘er se moลพe koristiti na isti naฤin za dodjelu i dohvaฤ‡anje vrijednosti iz njih, tj. ' . '.

Stvorite paket u PL/SQL

U PL/SQL-u kad god se paket uputi/pozove u sesiji, za taj paket ฤ‡e se stvoriti nova instanca.

Oracle pruลพa moguฤ‡nost inicijalizacije elemenata paketa ili izvoฤ‘enja bilo koje aktivnosti u vrijeme stvaranja ove instance putem 'Inicijalizacije paketa'.

Ovo nije niลกta drugo nego izvrลกni blok koji se upisuje u tijelo paketa nakon definiranja svih elemenata paketa. Ovaj blok ฤ‡e se izvrลกiti kad god se paket uputi prvi put u sesiji.

Sintaksa

Stvorite paket u 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>
  • Gornja sintaksa prikazuje definiciju inicijalizacije paketa u tijelu paketa.

Naprijed deklaracije

Napredna deklaracija/referenca u paketu nije niลกta drugo nego zasebno deklariranje privatnih elemenata i njihovo definiranje u kasnijem dijelu tijela paketa.

Privatni elementi mogu se referirati samo ako su veฤ‡ deklarirani u tijelu paketa. Iz tog razloga koristi se prosljeฤ‘ivanje deklaracije. Ali priliฤno je neuobiฤajeno za koriลกtenje jer se u veฤ‡ini sluฤajeva privatni elementi deklariraju i definiraju u prvom dijelu tijela paketa.

Forward deklaracija je opcija koju nudi Oracle, nije obavezno, a koriลกtenje i ne koriลกtenje ovisi o zahtjevima programera.

Naprijed deklaracije

Sintaksa:

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>

Gornja sintaksa prikazuje deklaraciju unaprijed. Privatni elementi su zasebno deklarirani u prednjem dijelu paketa, a definirani su u kasnijem dijelu.

Koriลกtenje kursora u paketu

Za razliku od drugih elemenata, treba biti oprezan pri koriลกtenju kursora unutar paketa.

Ako je kursor definiran u specifikaciji paketa ili u globalnom dijelu tijela paketa, tada ฤ‡e kursor jednom otvoren postojati do kraja sesije.

Stoga uvijek treba koristiti atribute kursora '%ISOPEN' za provjeru stanja kursora prije nego ลกto ga uputite.

preoptereฤ‡enje

Preoptereฤ‡enje je koncept postojanja mnogo potprograma s istim imenom. Ovi ฤ‡e se potprogrami meฤ‘usobno razlikovati po broju parametara ili vrstama parametara ili tipu povrata, tj. potprogrami s istim imenom, ali s razliฤitim brojem parametara, razliฤitim vrstama parametara ili razliฤitim tipovima smatraju se preoptereฤ‡enjima.

Ovo je korisno kada mnogo potprograma treba obaviti isti zadatak, ali naฤin pozivanja svakog od njih trebao bi biti drugaฤiji. U tom ฤ‡e sluฤaju naziv potprograma ostati isti za sve, a parametri ฤ‡e se promijeniti prema pozivnoj izjavi.

Primjer 1: U ovom primjeru ฤ‡emo kreirati paket za dobivanje i postavljanje vrijednosti informacija o zaposleniku u 'emp' tablici. Funkcija get_record vratit ฤ‡e izlaz tipa zapisa za zadani broj zaposlenika, a procedura set_record umetnut ฤ‡e zapis tipa zapisa u emp tablicu.

Korak 1) Izrada specifikacije paketa

preoptereฤ‡enje

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:
/

Izlaz:

Package created

Code Objaลกnjenje

  • Code redak 1-5: Stvaranje specifikacije paketa za guru99_get_set s jednom procedurom i jednom funkcijom. Ova dva su sada javni elementi ovog paketa.

Korak 2) Paket sadrลพi tijelo paketa, gdje ฤ‡e biti definirane sve procedure i stvarna definicija funkcija. U ovom koraku kreira se tijelo paketa.

preoptereฤ‡enje

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:
/

Izlaz:

Package body created

Code Objaลกnjenje

  • Code redak 7: Stvaranje tijela paketa.
  • Code redak 9-16: Definiranje elementa 'set_record' koji je deklariran u specifikaciji. Ovo je isto kao definiranje samostalne procedure u PL/SQL.
  • Code redak 17-24: Definiranje elementa 'get_record'. To je isto kao definiranje samostalne funkcije.
  • Code redak 25-26: Definiranje dijela za inicijalizaciju paketa.

Korak 3) Stvaranje anonimnog bloka za umetanje i prikaz zapisa pozivajuฤ‡i se na gore stvoreni paket.

preoptereฤ‡enje

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:
/

Izlaz:

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 Objaลกnjenje:

  • Code redak 34-37: Popunjavanje podataka za varijablu vrste zapisa u anonimnom bloku za pozivanje elementa 'set_record' paketa.
  • Code redak 38: Upuฤ‡en je poziv 'set_record' paketa guru99_get_set. Sada je paket instanciran i postojat ฤ‡e do kraja sesije.
  • Dio inicijalizacije paketa se izvrลกava jer je ovo prvi poziv paketu.
  • Zapis je umetnut elementom 'set_record' u tablicu.
  • Code redak 41: Pozivanje elementa 'get_record' za prikaz pojedinosti o umetnutom zaposleniku.
  • Paket se upuฤ‡uje po drugi put tijekom poziva 'get_record' paketu. Ali inicijalizacijski dio se ovaj put ne izvrลกava jer je paket veฤ‡ inicijaliziran u ovoj sesiji.
  • Code redak 42-45: Ispis podataka o zaposleniku.

Ovisnost u paketima

Buduฤ‡i da je paket logiฤka grupaping Od povezanih stvari, ima neke ovisnosti. Slijede ovisnosti o kojima treba voditi raฤuna.

  • Specifikacija je samostalan objekt.
  • Tijelo paketa ovisi o specifikaciji.
  • Tijelo paketa moลพe se zasebno sastaviti. Kad god se specifikacija kompajlira, tijelo se mora ponovno kompajlirati jer ฤ‡e postati nevaลพeฤ‡e.
  • Potprogram u tijelu paketa koji ovisi o privatnom elementu trebao bi se definirati tek nakon deklaracije privatnog elementa.
  • Objekti baze podataka koji su navedeni u specifikaciji i tijelu moraju biti u vaลพeฤ‡em statusu u vrijeme kompilacije paketa.

Informacije o paketu

Nakon ลกto se kreiraju informacije o paketu, informacije o paketu kao ลกto su izvor paketa, detalji potprograma i detalji o preoptereฤ‡enju dostupni su u Oracle tablice definicije podataka.

Donja tablica daje tablicu definicije podataka i podatke o paketu koji su dostupni u tablici.

Naziv tablice Description Pitanje
SVI_OBJEKTI Daje detalje paketa kao ลกto su object_id, creation_date, last_ddl_time, itd. Sadrลพavat ฤ‡e objekte koje su stvorili svi korisnici. SELECT * FROM all_objects where object_name =' '
USER_OBJECT Daje detalje paketa kao ลกto su object_id, creation_date, last_ddl_time, itd. Sadrลพavat ฤ‡e objekte koje je stvorio trenutni korisnik. SELECT * FROM user_objects gdje object_name =' '
SVI_IZVOR Daje izvor objekata koje su stvorili svi korisnici. SELECT * FROM all_source where name=' '
USER_SOURCE Daje izvor objekata koje je stvorio trenutni korisnik. SELECT * FROM user_source where name=' '
SVI_POSTUPCI Daje pojedinosti potprograma kao ลกto su object_id, pojedinosti o preoptereฤ‡enju itd. koje su izradili svi korisnici. SELECT * FROM all_procedures
Gdje object_name=' '
KORISNIฤŒKI_POSTUPCI Daje pojedinosti potprograma kao ลกto su object_id, pojedinosti o preoptereฤ‡enju itd. koje je izradio trenutni korisnik. SELECT * FROM user_procedures
Gdje object_name=' '

UTL DATOTEKA โ€“ Pregled

UTL datoteka je zasebni paket pomoฤ‡nih programa koji nudi Oracle za obavljanje posebnih zadataka. Ovo se uglavnom koristi za ฤitanje i pisanje datoteka operativnog sustava iz PL/SQL paketa ili potprograma. Dobio je odvojene funkcije za postavljanje informacija i dobivanje informacija iz datoteka. Takoฤ‘er omoguฤ‡uje ฤitanje/pisanje u izvornom skupu znakova.

Programer to moลพe koristiti za pisanje datoteka operacijskog sustava bilo koje vrste, a datoteka ฤ‡e biti zapisana izravno na posluลพitelj baze podataka. Ime i put direktorija bit ฤ‡e spomenuti u vrijeme pisanja.

Rezime

Sada smo nauฤili pakete u PL / SQL, i sada biste trebali moฤ‡i raditi na sljedeฤ‡em.

  • PL/SQL paketi i njegove komponente
  • Karakteristike paketa
  • Upuฤ‡ivanje i preoptereฤ‡enje elemenata paketa
  • Upravljanje ovisnostima u paketima
  • Pregled informacija o paketu
  • ล to je UTL datoteka

Saลพmite ovu objavu uz: