Oracle PL / SQL pakett: tüüp, spetsifikatsioon, keha (näide)

Lang L: none (table-of-contents):

Anonim

Mis on Oracle'i pakett?

PL / SQL pakett on seotud alamprogrammi (protseduur / funktsioon) loogiline rühmitus üheks elemendiks. Pakett kompileeritakse ja salvestatakse andmebaasiobjektina, mida saab hiljem kasutada.

Selles õpetuses saate teada

  • Pakettide komponendid
  • Pakendi spetsifikatsioon
  • Pakendi kere
  • Pakendi elementide suunamine
  • Loo pakett PL / SQL-is
  • Edasised deklaratsioonid
  • Kursorite kasutamine pakendis
  • Ülekoormus
  • Sõltuvus pakettides
  • Teave pakendi kohta
  • UTL-FILIS - ülevaade

Pakettide komponendid

PL / SQL paketil on kaks komponenti.

  • Pakendi spetsifikatsioon
  • Pakendi kere

Pakendi spetsifikatsioon

Paketi spetsifikatsioon koosneb kõigi avalike muutujate, kursorite, objektide, protseduuride, funktsioonide ja erandite deklaratsioonist.

Allpool on paketi spetsifikatsiooni mõned omadused.

  • Kõikidele spetsifikatsioonis deklareeritud elementidele pääseb juurde väljastpoolt paketti. Selliseid elemente tuntakse avaliku elemendina.
  • Paketi spetsifikatsioon on eraldiseisev element, mis tähendab, et see võib eksisteerida üksi ilma paketi korpuseta.
  • Kui pakett on viidanud, luuakse selle konkreetse seansi jaoks paketi eksemplar.
  • Pärast seda, kui eksemplar on seansi jaoks loodud, kehtivad kõik selles eksemplaris algatatud paketi elemendid kuni seansi lõpuni.

Süntaks

CREATE [OR REPLACE] PACKAGE 
IS… END 

Ülaltoodud süntaks näitab paketi spetsifikatsiooni loomist.

Pakendi kere

See koosneb kõigi paketispetsifikatsioonis sisalduvate elementide määratlusest. Sellel võib olla ka elementide määratlus, mida spetsifikatsioonis pole deklareeritud, neid elemente nimetatakse privaatseteks elementideks ja neid saab kutsuda ainult paketi seest.

Allpool on pakendi kere omadused.

  • See peaks sisaldama kõigi spetsifikatsioonis deklareeritud alamprogrammide / kursorite määratlusi.
  • Sellel võib olla ka rohkem alamprogramme või muid elemente, mida spetsifikatsioonis pole deklareeritud. Neid nimetatakse privaatseteks elementideks.
  • See on usaldusväärne objekt ja see sõltub paketi spetsifikatsioonist.
  • Iga kord, kui spetsifikatsioon koostatakse, muutub pakendi keha olek kehtetuks. Seetõttu tuleb see iga kord pärast spetsifikatsiooni koostamist uuesti koostada.
  • Privaatsed elemendid tuleks enne pakendi kehas kasutamist määratleda.
  • Paketi esimene osa on üldise deklaratsiooni osa. See hõlmab muutujaid, kursoreid ja privaatelemente (edastamise deklaratsioon), mis on nähtav kogu paketile.
  • Paketi viimane osa on paketi initsialiseerimise osa, mis käivitatakse üks kord, kui paketile viidatakse esmakordselt sessioonis.

Süntaks:

CREATE [OR REPLACE] PACKAGE BODY 
IS.END 
  • Ülaltoodud süntaks näitab paketi keha loomist.

Nüüd vaatame, kuidas paketielemente programmis viidata.

Pakendi elementide suunamine

Kui elemendid on paketis deklareeritud ja määratletud, peame nende kasutamiseks viitama.

Kõigile paketi avalikele elementidele saab viidata, kutsudes paketi nime, millele järgneb punktiga eraldatud elemendi nimi, st " . ".

Paketi avalikku muutujat saab samamoodi kasutada ka nende väärtuste määramiseks ja toomiseks, st ' . '.

Loo pakett PL / SQL-is

Kui paketile viidatakse / kutsutakse seansis, luuakse PL / SQL-is selle paketi jaoks uus eksemplar.

Oracle pakub paketi elementide initsialiseerimiseks või selle toimingu loomiseks paketi initsialiseerimise kaudu mis tahes toiminguid.

See pole midagi muud kui täitmisplokk, mis kirjutatakse paketi kehasse pärast kõigi paketi elementide määratlemist. See plokk käivitatakse alati, kui seansil paketti esimest korda suunatakse.

Süntaks

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGINEEND 
  • Ülaltoodud süntaks näitab paketi initsialiseerimise määratlust paketi kehas.

Edasised deklaratsioonid

Edastamise deklaratsioon / viide paketis pole midagi muud kui privaatsete elementide eraldi deklareerimine ja selle määratlemine paketi hilisemas osas.

Privaatelementidele saab viidata ainult siis, kui see on juba paketis deklareeritud. Sel põhjusel kasutatakse edasideklaratsiooni. Kuid selle kasutamine on üsna ebatavaline, sest enamasti deklareeritakse ja määratletakse privaatsed elemendid pakendi sisu esimeses osas.

Edastamise deklaratsioon on Oracle'i pakutav võimalus, see ei ole kohustuslik ning kasutamine ja mittekasutamine on programmeerija nõuete kohaselt.

Süntaks:

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

Ülaltoodud süntaks näitab edasideklaratsiooni. Privaatsed elemendid deklareeritakse paketi esiosas eraldi ja need on määratletud hilisemas osas.

Kursorite kasutamine pakendis

Erinevalt teistest elementidest peab pakendi sees olevate kursorite kasutamisel olema ettevaatlik.

Kui kursor on määratletud paketi spetsifikatsioonis või paketi korpuse globaalses osas, püsib kursor pärast avamist seansi lõpuni.

Nii et kursori oleku kontrollimiseks enne kursori suunamist peaks alati kasutama kursori atribuute '% ISOPEN'.

Ülekoormus

Ülekoormus on paljude sama nimega alamprogrammide kontseptsioon. Need alamprogrammid erinevad üksteisest mitme parameetri või parameetri tüübi või tagastustüübi poolest, st sama nimega, kuid erineva parameetrite arvuga, erinevat tüüpi parameetreid või erinevat tüüpi uut tüüpi alamprogramme peetakse ülekoormuseks.

See on kasulik, kui paljud alamprogrammid peavad tegema sama ülesande, kuid nende kõigi helistamise viis peaks olema erinev. Sel juhul hoitakse alamprogrammi nimi kõigi jaoks sama ja parameetreid muudetakse vastavalt helistamislausele.

Näide 1 : Selles näites loome paketi töötaja teabe väärtuste saamiseks ja seadistamiseks tabelis 'emp'. Funktsioon get_record tagastab antud töötaja numbri kirjetüübi väljundi ja protseduur set_record sisestab kirjetüübi kirje tabelisse emp.

1. samm) paketi spetsifikatsiooni loomine

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

Väljund:

Package created

Koodi selgitus

  • Koodirida 1-5 : paketi spetsifikatsiooni loomine saidile guru99_get_set ühe protseduuri ja ühe funktsiooniga. Need kaks on nüüd selle paketi avalikud elemendid.

Samm 2) Pakett sisaldab paketi keha, kus määratletakse kõik protseduurid ja funktsioonid. Selles etapis luuakse Package Body.

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

Väljund:

Package body created

Koodi selgitus

  • Koodirida 7 : paketi keha loomine.
  • Koodirida 9-16 : spetsifikatsioonis deklareeritud elemendi 'set_record' määratlemine. See on sama mis eraldiseisva protseduuri määratlemine PL / SQL-is.
  • Koodirida 17-24: elemendi 'get_record' määratlemine. See on sama mis eraldiseisva funktsiooni määratlemine.
  • Koodirida 25-26: paketi lähtestamise osa määratlemine.

Samm 3) Anonüümse ploki loomine kirjete sisestamiseks ja kuvamiseks, viidates ülaltoodud paketile.

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

Väljund:

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

Koodi selgitus:

  • Koodirida 34-37: kirjetüübi muutuja andmete täitmine anonüümses plokis, et kutsuda paketi element set_record.
  • Koodirida 38: paketi guru99_get_set seadele_rekord on helistatud. Nüüd on pakett instantsitud ja see püsib seansi lõpuni.
  • Paketi lähtestamise osa täidetakse, kuna see on paketi esimene kõne.
  • Elementi 'set_record' tabelisse sisestatud kirje.
  • Koodirida 41: helistatakse elemendile get_record, et kuvada sisestatud töötaja üksikasjad.
  • Paketile viidatakse teist korda paketi „get_record” kõne ajal. Kuid initsialiseerimise osa seekord ei käivitata, kuna pakett on selles seansis juba initsialiseeritud.
  • Koodirida 42-45: töötaja andmete printimine.

Sõltuvus pakettides

Kuna pakett on seotud asjade loogiline grupeerimine, on sellel mõned sõltuvused. Järgneb sõltuvus, mille eest tuleb hoolitseda.

  • Spetsifikatsioon on eraldiseisev objekt.
  • Paketi keha sõltub spetsifikatsioonist.
  • Pakendi korpuse saab koostada eraldi. Alati, kui spetsifikatsioon koostatakse, tuleb keha uuesti koostada, kuna see muutub kehtetuks.
  • Alamprogramm paketi kehas, mis sõltub privaatsest elemendist, tuleks määratleda alles pärast privaatsete elementide deklaratsiooni.
  • Andmebaasi objektid, millele viidatakse spetsifikatsioonis ja kehas, peavad paketi kompileerimise ajal olema kehtivas olekus.

Teave pakendi kohta

Kui paketiinfo on loodud, on paketi teave, näiteks paketi allikas, alamprogrammi üksikasjad ja ülekoormuse üksikasjad saadaval Oracle'i andmete määratlemise tabelites.

Allpool olev tabel annab andmete määratlustabeli ja tabelis pakutava teabe.

Tabeli nimi Kirjeldus Päring
KÕIK_OBJEKT Annab paketi üksikasjad, näiteks object_id, creation_date, last_ddl_time jne. See sisaldab kõigi kasutajate loodud objekte. SELECT * FROM kõigist objektidest, kus objekti_nimi = ' '
USER_OBJECT Annab paketi üksikasjad, näiteks object_id, creation_date, last_ddl_time jne. See sisaldab praeguse kasutaja loodud objekte. SELECT * FROM kasutaja_objektid, kus objekti_nimi = ' '
ALL_SOURCE Annab kõigi kasutajate loodud objektide allika. SELECT * FROM all_source, kus nimi = ' '
USER_SOURCE Annab praeguse kasutaja loodud objektide allika. VALI * FROM kasutaja_allikas, kus nimi = ' '
KÕIK_MENETLUSED Annab kõigi kasutajate loodud alamprogrammi üksikasjad, näiteks objekti_ ID, ülekoormuse üksikasjad jne. SELECT * FROM kõigist_protseduuridest Kus objekti_nimi = ' '
USER_PROCEDURES Annab praeguse kasutaja loodud alamprogrammi üksikasjad nagu object_id, ülekoormuse üksikasjad jne. SELECT * FROM user_procedures kus object_name = ' '

UTL-FILIS - ülevaade

UTL-fail on Oracle'i pakutav eraldi utiliidipakett eriülesannete täitmiseks. Seda kasutatakse peamiselt operatsioonisüsteemi failide lugemiseks ja kirjutamiseks PL / SQL-i pakettidest või alamprogrammidest. See sai eraldi funktsioonid teabe sisestamiseks ja failidest teabe hankimiseks. Samuti võimaldab see lugeda / kirjutada emakeelsetes tähemärkides.

Programmeerija saab seda kasutada mis tahes tüüpi operatsioonisüsteemi failide kirjutamiseks ja fail kirjutatakse otse andmebaasiserverisse. Nime ja kataloogiteed mainitakse kirjutamise ajal.

Kokkuvõte

Oleme nüüd õppinud paketid PL / SQL-is ja nüüd peaksite saama töötada järgmiselt.

  • PL / SQL paketid ja selle komponendid
  • Pakendite omadused
  • Paketi elementide suunamine ja ülekoormamine
  • Pakettides olevate sõltuvuste haldamine
  • Pakettide teabe vaatamine
  • Mis on UTL-fail