Какво представлява пакетът в Oracle?
PL / SQL пакетът е логическо групиране на свързана подпрограма (процедура / функция) в един елемент. Пакетът се компилира и съхранява като обект на база данни, който може да се използва по-късно.
В този урок ще научите -
- Компоненти на пакетите
- Спецификация на опаковката
- Пакетно тяло
- Препращащи елементи на пакета
- Създайте пакет в PL / SQL
- Предаване на декларации
- Използване на курсори в пакет
- Претоварване
- Зависимост в пакетите
- Информация за пакета
- UTL ФАЙЛ - Общ преглед
Компоненти на пакетите
PL / SQL пакетът има два компонента.
- Спецификация на опаковката
- Пакетно тяло
Спецификация на опаковката
Спецификацията на пакета се състои от декларация на всички публични променливи, курсори, обекти, процедури, функции и изключение.
По-долу има няколко характеристики на спецификацията на пакета.
- Всички елементи, декларирани в спецификацията, могат да бъдат достъпни извън пакета. Такива елементи са известни като публичен елемент.
- Спецификацията на пакета е самостоятелен елемент, което означава, че може да съществува самостоятелно без тялото на пакета.
- Винаги, когато даден пакет се позовава, се създава екземпляр на пакета за тази конкретна сесия.
- След създаването на екземпляра за сесия, всички елементи на пакета, които са инициирани в този екземпляр, са валидни до края на сесията.
Синтаксис
CREATE [OR REPLACE] PACKAGEIS … END
Горният синтаксис показва създаването на спецификация на пакета.
Пакетно тяло
Състои се от дефиницията на всички елементи, които присъстват в спецификацията на пакета. Също така може да има дефиниция на елементи, които не са декларирани в спецификацията, тези елементи се наричат частни елементи и могат да бъдат извикани само от вътрешната страна на пакета.
По-долу са дадени характеристиките на корпуса на опаковката.
- Той трябва да съдържа дефиниции за всички подпрограми / курсори, които са декларирани в спецификацията.
- Може да има и повече подпрограми или други елементи, които не са декларирани в спецификацията. Те се наричат частни елементи.
- Това е надежден обект и зависи от спецификацията на пакета.
- Състоянието на тялото на пакета става „Невалидно“, когато спецификацията се компилира. Следователно трябва да се прекомпилира всеки път след съставянето на спецификацията.
- Личните елементи трябва да бъдат дефинирани първо, преди да бъдат използвани в тялото на пакета.
- Първата част на пакета е частта за глобална декларация. Това включва променливи, курсори и частни елементи (декларация за препращане), която е видима за целия пакет.
- Последната част на пакета е частта за инициализация на пакета, която се изпълнява еднократно, когато пакетът е отнесен за първи път в сесията.
Синтаксис:
CREATE [OR REPLACE] PACKAGE BODYIS . END
- Горният синтаксис показва създаването на тялото на пакета.
Сега ще видим как да препращаме елементи на пакета в програмата.
Препращащи елементи на пакета
След като елементите бъдат декларирани и дефинирани в пакета, трябва да препратим елементите, за да ги използваме.
Всички публични елементи на пакета могат да бъдат препратени чрез извикване на името на пакета, последвано от името на елемента, разделено с точка, т.е. „<име_на_пакет>.
Публичната променлива на пакета също може да се използва по същия начин за присвояване и извличане на стойности от тях, т.е. '
Създайте пакет в PL / SQL
В PL / SQL всеки път, когато пакет се препрати / извика в сесия, ще се създаде нов екземпляр за този пакет.
Oracle предоставя средство за инициализиране на елементи на пакета или за извършване на каквато и да е дейност по време на създаването на този екземпляр чрез „Инициализация на пакета“.
Това не е нищо друго освен блок за изпълнение, който се записва в тялото на пакета след дефиниране на всички елементи на пакета. Този блок ще бъде изпълнен всеки път, когато даден пакет е отнесен за първи път в сесията.
Синтаксис
CREATE [OR REPLACE] PACKAGE BODYIS .BEGINE END
- Горният синтаксис показва дефиницията за инициализация на пакета в тялото на пакета.
Предаване на декларации
Препращащата декларация / препратка в пакета не е нищо друго освен деклариране на частните елементи поотделно и дефинирането му в по-късната част на тялото на пакета.
Частни елементи могат да бъдат препращани само ако това вече е декларирано в тялото на пакета. Поради тази причина се използва препращаща декларация. Но е доста необичайно за използване, тъй като през повечето време частните елементи се декларират и дефинират в първата част на тялото на пакета.
Препращащата декларация е опция, предоставена от Oracle, тя не е задължителна и използването и неизползването зависи от изискванията на програмиста.
Синтаксис:
CREATE [OR REPLACE] PACKAGE BODYIS … … .BEGIN ;END
Горният синтаксис показва декларация за препращане. Частните елементи се декларират отделно в предната част на пакета и са дефинирани в по-късната част.
Използване на курсори в пакет
За разлика от други елементи, трябва да се внимава при използването на курсори вътре в пакета.
Ако курсорът е дефиниран в спецификацията на пакета или в глобалната част на тялото на пакета, след като веднъж отворен курсорът ще продължи до края на сесията.
Така че винаги трябва да се използват атрибутите на курсора '% ISOPEN', за да се провери състоянието на курсора, преди да се насочи към него.
Претоварване
Претоварването е концепцията за наличието на много подпрограми със същото име. Тези подпрограми ще се различават една от друга по редица параметри или видове параметри или тип връщане, т.е. подпрограма със същото име, но с различен брой параметри, различен тип параметри или различен тип повторно се считат за претоварване.
Това е полезно, когато много подпрограми трябва да изпълняват една и съща задача, но начинът на извикване на всяка от тях трябва да е различен. В този случай името на подпрограмата ще остане едно и също за всички и параметрите ще бъдат променени според извикващия оператор.
Пример 1 : В този пример ще създадем пакет за получаване и задаване на стойностите на информацията на служителя в таблицата „emp“. Функцията get_record ще върне изхода на типа запис за дадения номер на служител, а процедурата set_record ще вмъкне записа от типа на записа в таблицата emp.
Стъпка 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 : Създаване на спецификация на пакета за guru99_get_set с една процедура и една функция. Тези две вече са публични елементи на този пакет.
Стъпка 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 : Дефиниране на елемента 'set_record', който е деклариран в спецификацията. Това е същото като дефинирането на самостоятелната процедура в PL / SQL.
- Кодов ред 17-24: Дефиниране на елемента 'get_record'. Това е същото като дефинирането на самостоятелната функция.
- Кодов ред 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: Попълване на данните за променлива от тип запис в анонимен блок за извикване на елемент 'set_record' на пакета.
- Кодов ред 38: Извършено е обаждане до 'set_record' на пакета guru99_get_set. Сега пакетът е инстанциран и ще продължи до края на сесията.
- Частта за инициализация на пакета се изпълнява, тъй като това е първото извикване на пакета.
- Записът, вмъкнат от елемента 'set_record' в таблицата.
- Кодов ред 41: Извикване на елемента 'get_record', за да се покажат подробностите за въведения служител.
- Пакетът се препраща за втори път по време на повикването 'get_record' към пакета. Но частта за инициализация този път не се изпълнява, тъй като пакетът вече е инициализиран в тази сесия.
- Кодов ред 42-45: Отпечатване на данни за служителя.
Зависимост в пакетите
Тъй като пакетът е логическото групиране на свързани неща, той има някои зависимости. Следват зависимостите, които трябва да се полагат.
- Спецификацията е самостоятелен обект.
- Тялото на пакета зависи от спецификацията.
- Тялото на пакета може да се компилира отделно. Всеки път, когато спецификацията се компилира, тялото трябва да се прекомпилира, тъй като ще стане невалидно.
- Подпрограмата в тялото на пакета, която зависи от частен елемент, трябва да бъде дефинирана само след декларацията за частен елемент.
- Обектите на базата данни, които са посочени в спецификацията и тялото, трябва да са в валидно състояние по време на компилирането на пакета.
Информация за пакета
След като информацията за пакета е създадена, информацията за пакета, като източник на пакета, подробности за подпрограмата и подробности за претоварване, е налична в таблиците за дефиниране на данни на Oracle.
Под таблицата са дадени таблицата за дефиниция на данни и информацията за пакета, която е налична в таблицата.
Име на таблицата | Описание | Заявка |
ALL_OBJECT | Дава подробности за пакета като object_id, create_date, last_ddl_time и др. Той ще съдържа обектите, създадени от всички потребители. | SELECT * FROM all_objects where object_name = '
|
USER_OBJECT | Дава подробности за пакета като object_id, create_date, last_ddl_time и др. Той ще съдържа обектите, създадени от текущия потребител. | SELECT * FROM user_objects where object_name = '
|
ALL_SOURCE | Дава източника на обектите, създадени от всички потребители. | ИЗБЕРЕТЕ * ОТ all_source, където name = '
|
USER_SOURCE | Дава източника на обектите, създадени от текущия потребител. | ИЗБЕРЕТЕ * ОТ потребителски_източник, където name = '<име_на_пакет>' |
ВСИЧКИ_ ПРОЦЕДУРИ | Дава подробности за подпрограмата като object_id, подробности за претоварване и др., Създадени от всички потребители. | SELECT * FROM all_procedures Where object_name = '
|
USER_PROCEDURES | Дава подробности за подпрограмата като object_id, подробности за претоварване и др., Създадени от текущия потребител. | ИЗБЕРЕТЕ * ОТ потребителски_процедури Където име_на_металото ' |
UTL ФАЙЛ - Общ преглед
UTL файлът е отделният полезен пакет, предоставен от Oracle за изпълнение на специални задачи. Това се използва главно за четене и запис на файловете на операционната система от PL / SQL пакети или подпрограми. Той има отделни функции за поставяне на информацията и за получаване на информацията от файлове. Също така позволява четене / писане в родния набор от символи.
Програмистът може да използва това, за да пише файлове от операционната система от всякакъв тип и файлът ще бъде записан директно на сървъра на базата данни. Името и пътят до директорията ще бъдат споменати по време на писането.
Обобщение
Вече научихме пакетите в PL / SQL и вече трябва да можете да работите по-долу.
- PL / SQL пакети и неговите компоненти
- Характеристики на опаковките
- Препращане и претоварване на елементи на пакета
- Управление на зависимости в пакети
- Преглед на информацията за пакета
- Какво е UTL файл