Орацле ПЛ / СКЛ пакет: тип, спецификација, тело (пример)

Преглед садржаја:

Anonim

Шта је пакет у Орацле-у?

ПЛ / СКЛ пакет је логичко групирање повезаног потпрограма (процедуре / функције) у један елемент. Пакет се компајлира и чува као објект базе података који се касније може користити.

У овом упутству ћете научити-

  • Компоненте пакета
  • Спецификација пакета
  • Тело пакета
  • Упућивање на елементе пакета
  • Направите пакет у ПЛ / СКЛ
  • Проследе декларације
  • Коришћење курсора у пакету
  • Преоптерећење
  • Зависност у пакетима
  • Информације о пакету
  • УТЛ ФИЛЕ - Преглед

Компоненте пакета

ПЛ / СКЛ пакет има две компоненте.

  • Спецификација пакета
  • Тело пакета

Спецификација пакета

Спецификација пакета састоји се од декларације свих јавних променљивих, показивача, објеката, процедура, функција и изузетака.

Испод је неколико карактеристика спецификације пакета.

  • Елементима који су сви декларисани у спецификацији може се приступити изван пакета. Такви елементи су познати као јавни елемент.
  • Спецификација пакета је самостални елемент који значи да може постојати сам без тела пакета.
  • Кад год се пакет односи на инстанцу пакета, креира се за ту одређену сесију.
  • Након што се инстанца креира за сесију, сви елементи пакета који су иницирани у тој инстанци важе до краја сесије.

Синтакса

CREATE [OR REPLACE] PACKAGE 
IS… END 

Горња синтакса приказује стварање спецификације пакета.

Тело пакета

Састоји се од дефиниције свих елемената који су присутни у спецификацији пакета. Такође може имати дефиницију елемената који нису декларисани у спецификацији, ти елементи се називају приватним елементима и могу се позивати само из пакета.

Испод су карактеристике тела пакета.

  • Требало би да садржи дефиниције за све потпрограме / показиваче који су декларисани у спецификацији.
  • Такође може имати више потпрограма или других елемената који нису декларисани у спецификацији. Они се називају приватним елементима.
  • То је поуздан објекат и зависи од спецификације пакета.
  • Стање тела пакета постаје 'Неважеће' кад год се спецификација компајлира. Због тога га треба прекомпајлирати сваки пут након састављања спецификације.
  • Приватне елементе треба прво дефинисати пре него што се користе у телу пакета.
  • Први део пакета је део глобалне декларације. То укључује променљиве, показиваче и приватне елементе (прослеђивање изјаве) која је видљива читавом пакету.
  • Последњи део пакета је део иницијализације пакета који се извршава једном кад год се пакет први пут упути у сесији.

Синтакса:

CREATE [OR REPLACE] PACKAGE BODY 
IS.END 
  • Горња синтакса приказује стварање тела пакета.

Сада ћемо видети како упутити елементе пакета у програм.

Упућивање на елементе пакета

Једном када су елементи декларисани и дефинисани у пакету, морамо упутити елементе да их користе.

Сви јавни елементи пакета могу се упутити позивом имена пакета праћеног именом елемента одвојеним тачком, тј. '<име_пакета>. <елемент_наме>'.

Јавна променљива пакета такође се може користити на исти начин за додељивање и преузимање вредности из њих, тј. '<име_пакета>. <име_варијабле>'.

Направите пакет у ПЛ / СКЛ

У ПЛ / СКЛ сваки пут када се пакет упути / позове у сесији, створиће се нова инстанца за тај пакет.

Орацле пружа могућност иницијализације елемената пакета или извођења било које активности у време креирања ове инстанце путем „Иницијализације пакета“.

Ово није ништа друго до извршни блок који се уписује у тело пакета након дефинисања свих елемената пакета. Овај блок ће се извршити кад год се пакет први пут упути у сесији.

Синтакса

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGINEEND 
  • Горња синтакса приказује дефиницију иницијализације пакета у телу пакета.

Проследе декларације

Прослеђивање декларације / референце у пакету није ништа друго него засебно декларисање приватних елемената и њихово дефинисање у каснијем делу тела пакета.

Приватни елементи могу се упутити само ако је то већ декларисано у телу пакета. Из тог разлога се користи прослеђена декларација. Али је прилично необично за употребу, јер се у већини случајева приватни елементи декларишу и дефинишу у првом делу тела пакета.

Прослеђивање декларације је опција коју пружа Орацле, није обавезна, а коришћење и не коришћење зависи од захтева програмера.

Синтакса:

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

Горња синтакса приказује прослеђивање декларације. Приватни елементи су декларисани одвојено у предњем делу пакета, а дефинисани су у каснијем делу.

Коришћење курсора у пакету

За разлику од осталих елемената, треба бити опрезан када се користе показивачи унутар пакета.

Ако је курсор дефинисан у спецификацији пакета или у глобалном делу тела пакета, курсор једном отворен остаће до краја сесије.

Дакле, увек треба користити атрибуте курсора '% ИСОПЕН' да бисте проверили стање курсора пре него што га упутите.

Преоптерећење

Преоптерећење је концепт постојања многих подпрограма са истим именом. Ови подпрограми ће се међусобно разликовати по бројним параметрима или типовима параметара или повратном типу, тј. Подпрограм са истим именом, али са различитим бројем параметара, различитим типом параметара или другачијим поновним типом сматрају се преоптерећењем.

Ово је корисно када многи потпрограми морају да раде исти задатак, али начин позивања сваког од њих треба да буде другачији. У овом случају, назив подпрограма ће остати исти за све, а параметри ће се променити према позиву.

Пример 1 : У овом примеру ћемо створити пакет за добијање и постављање вредности података запослених у табели 'емп'. Функција гет_рецорд вратит ће излаз типа записа за задати број запосленог, а поступак сет_рецорд ће убацити запис типа записа у табелу емп.

Корак 1) Израда спецификације пакета

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

Излаз:

Package created

Објашњење кода

  • Редак 1-5 : Стварање спецификације пакета за гуру99_гет_сет са једном процедуром и једном функцијом. Ово двоје су сада јавни елементи овог пакета.

Корак 2) Пакет садржи тело Пакета, где ће бити дефинисане све процедуре и функције стварне дефиниције. У овом кораку креира се тело пакета.

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

Излаз:

Package body created

Објашњење кода

  • Линија кода 7 : Креирање тела пакета.
  • Редак кода 9-16 : Дефинисање елемента 'сет_рецорд' који је декларисан у спецификацији. Ово је исто као дефинисање самосталне процедуре у ПЛ / СКЛ.
  • Линија кода 17-24: Дефинисање елемента 'гет_рецорд'. То је исто као и дефинисање самосталне функције.
  • Линија кода 25-26: Дефинисање дела иницијализације пакета.

Корак 3) Стварање анонимног блока за уметање и приказивање записа позивајући се на горе створени пакет.

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

Излаз:

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

Објашњење кода:

  • Линија кода 34-37: Попуњавање података променљиве типа записа у анонимном блоку за позивање елемента 'сет_рецорд' пакета.
  • Линија кода 38: Позван је „сет_рецорд“ пакета гуру99_гет_сет. Сада је пакет инстанциран и трајаће до краја сесије.
  • Извршава се део иницијализације пакета јер је ово први позив пакету.
  • Запис у који је елемент 'сет_рецорд' убацио у табелу.
  • Линија кода 41: Позивање елемента 'гет_рецорд' ради приказивања детаља уметнутог запосленог.
  • Пакет се упућује други пут током позива 'гет_рецорд' на пакет. Али део иницијализације се овај пут не извршава јер је пакет већ иницијализован у овој сесији.
  • Кодни ред 42-45: Штампање података о запосленом.

Зависност у пакетима

Будући да је пакет логичко груписање повезаних ствари, он има неке зависности. Следи зависност о којој треба водити рачуна.

  • Спецификација је самостални објекат.
  • Тело пакета зависи од спецификација.
  • Тело пакета се може саставити одвојено. Кад год се састави спецификација, тело треба да се прекомпајлира јер ће постати неваљано.
  • Подпрограм у телу пакета који зависи од приватног елемента треба дефинисати тек након декларације приватног елемента.
  • Објекти базе података који су наведени у спецификацији и тело морају бити у важећем статусу у време састављања пакета.

Информације о пакету

Једном када се креирају информације о пакету, информације о пакету, као што су извор пакета, детаљи подпрограма и детаљи преоптерећења, доступне су у табелама дефиниције података Орацле.

Испод табеле дата је табела дефиниције података и информације о пакету доступне у табели.

Назив табеле Опис Упит
АЛЛ_ОБЈЕЦТ Даје детаље о пакету попут објецт_ид, цреате_дате, ласт_ддл_тиме, итд. Садржаће објекте које су креирали сви корисници. СЕЛЕЦТ * ФРОМ алл_објецтс вхере објецт_наме = '<пацкаге_наме>'
УСЕР_ОБЈЕЦТ Даје детаље о пакету попут објецт_ид, цреате_дате, ласт_ддл_тиме, итд. Садржаће објекте које је креирао тренутни корисник. СЕЛЕЦТ * ФРОМ усер_објецтс вхере објецт_наме = '<пацкаге_наме>'
АЛЛ_СОУРЦЕ Даје извор објеката које су креирали сви корисници. СЕЛЕЦТ * ФРОМ алл_соурце вхере наме = '<пацкаге_наме>'
УСЕР_СОУРЦЕ Даје извор објеката које је креирао тренутни корисник. СЕЛЕЦТ * ФРОМ усер_соурце вхере наме = '<пацкаге_наме>'
СВИ_ПРОЦЕДУРЕ Даје детаље потпрограма као што су објецт_ид, детаљи преоптерећења итд. Које су креирали сви корисници. СЕЛЕЦТ * ФРОМ алл_процедурес Вхере_наме_име = '<пацкаге_наме>'
УСЕР_ПРОЦЕДУРЕС Даје детаље потпрограма као што су објецт_ид, детаљи преоптерећења итд. Које је креирао тренутни корисник. СЕЛЕЦТ * ФРОМ усер_процедурес Вхере_наме_име = '<пацкаге_наме>'

УТЛ ФИЛЕ - Преглед

УТЛ датотека је засебни услужни пакет који Орацле пружа за обављање посебних задатака. Ово се углавном користи за читање и писање датотека оперативног система из ПЛ / СКЛ пакета или потпрограма. Добио је одвојене функције за стављање информација и за добијање информација из датотека. Такође омогућава читање / писање у изворном скупу знакова.

Програмер то може користити за писање датотека оперативног система било које врсте и датотека ће бити записана директно на сервер базе података. Име и пут до директоријума биће наведени током писања.

Резиме

Сада смо научили пакете у ПЛ / СКЛ и сада бисте могли да радите на следећем.

  • ПЛ / СКЛ пакети и његове компоненте
  • Карактеристике пакета
  • Упућивање и преоптерећење елемената пакета
  • Управљање зависностима у пакетима
  • Преглед информација о пакету
  • Шта је УТЛ датотека