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

U čemu je paket Oracle?

PL/SQL paket je logično grupiranje 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

Objašnjenje koda

  • Redak koda 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

Objašnjenje koda

  • Kodna linija 7: Stvaranje tijela paketa.
  • Redak koda 9-16: Definiranje elementa 'set_record' koji je deklariran u specifikaciji. Ovo je isto kao definiranje samostalne procedure u PL/SQL.
  • Redak koda 17-24: Definiranje elementa 'get_record'. To je isto kao definiranje samostalne funkcije.
  • Redak koda 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

Objašnjenje koda:

  • Redak koda 34-37: Popunjavanje podataka za varijablu vrste zapisa u anonimnom bloku za pozivanje elementa 'set_record' paketa.
  • Redak koda 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.
  • Redak koda 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.
  • Redak koda 42-45: Ispis podataka o zaposleniku.

Ovisnost u paketima

Budući da je paket logično grupiranje 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