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
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.
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
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.
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.
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





