Oracle PL/SQL пакет: тип, спецификация, тяло [Пример]
Какво представлява Package in Oracle?
PL/SQL пакетът е логическо групиране на свързана подпрограма (процедура/функция) в един елемент. Пакетът се компилира и съхранява като обект на база данни, който може да се използва по-късно.
Компоненти на пакети
PL/SQL пакетът има два компонента.
- Спецификация на пакета
- Тяло на опаковката
Спецификация на пакета
Спецификацията на пакета се състои от декларация за всички публични променливи, курсори, обекти, процедури, функции и изключения.
По-долу са дадени няколко характеристики на спецификацията на пакета.
- Елементите, които са декларирани в спецификацията, могат да бъдат достъпни извън пакета. Такива елементи са известни като публичен елемент.
- Спецификацията на пакета е самостоятелен елемент, което означава, че може да съществува самостоятелно без тялото на пакета.
- Всеки път, когато даден пакет препрати, се създава екземпляр на пакета за тази конкретна сесия.
- След като екземплярът е създаден за сесия, всички елементи на пакета, които са инициирани в този екземпляр, са валидни до края на сесията.
Синтаксис
CREATE [OR REPLACE] PACKAGE <package_name> IS <sub_program and public element declaration> . . END <package name>
Горният синтаксис показва създаването на спецификация на пакета.
Тяло на опаковката
Състои се от дефиницията на всички елементи, които присъстват в спецификацията на пакета. Може също така да има дефиниция на елементи, които не са декларирани в спецификацията, тези елементи се наричат частни елементи и могат да бъдат извикани само от вътрешността на пакета.
По-долу са характеристиките на тялото на опаковката.
- Трябва да съдържа дефиниции за всички подпрограми/курсори които са декларирани в спецификацията.
- Може също така да има повече подпрограми или други елементи, които не са декларирани в спецификацията. Те се наричат частни елементи.
- Това е надежден обект и зависи от спецификацията на пакета.
- Състоянието на тялото на пакета става „Невалидно“ всеки път, когато спецификацията се компилира. Следователно, той трябва да се компилира отново всеки път след компилирането на спецификацията.
- Частните елементи трябва да бъдат дефинирани първо, преди да бъдат използвани в тялото на пакета.
- Първата част на пакета е частта за глобалната декларация. Това включва променливи, курсори и частни елементи (предна декларация), които са видими за целия пакет.
- Последната част от пакета е частта за инициализация на пакет, която се изпълнява веднъж, когато даден пакет е препратен за първи път в сесията.
Синтаксис:
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>
- Горният синтаксис показва създаването на тялото на пакета.
Сега ще видим как да препращаме към елементите на пакета в програмата.
Елементи на препращащ пакет
След като елементите са декларирани и дефинирани в пакета, трябва да препратим елементите, за да ги използваме.
Всички публични елементи на пакета могат да бъдат посочени чрез извикване на името на пакета, последвано от името на елемента, разделено с точка, т.е. . '.
Публичната променлива на пакета също може да се използва по същия начин за присвояване и извличане на стойности от тях, т.е. . '.
Създаване на пакет в PL/SQL
В PL/SQL всеки път, когато даден пакет бъде препратен/извикан в сесия, ще бъде създаден нов екземпляр за този пакет.
Oracle предоставя възможност за инициализиране на елементи на пакет или за извършване на каквато и да е дейност по време на създаването на този екземпляр чрез „Инициализация на пакета“.
Това не е нищо друго освен блок за изпълнение, който се записва в тялото на пакета след дефиниране на всички елементи на пакета. Този блок ще се изпълнява всеки път, когато даден пакет бъде препратен за първи път в сесията.
Синтаксис
CREATE [OR REPLACE] PACKAGE BODY <package_name> IS <Private element definition> <sub_program and public element definition> . BEGINE <Package Initialization> END <package_name>
- Горният синтаксис показва дефиницията на инициализация на пакет в тялото на пакета.
Предварителни декларации
Предаващата декларация/препратка в пакета не е нищо друго освен деклариране на частните елементи отделно и дефинирането им в по-късната част на тялото на пакета.
Частните елементи могат да бъдат препращани само ако вече са декларирани в тялото на пакета. Поради тази причина се използва предварителна декларация. Но е доста необичайно за използване, защото в повечето случаи частните елементи се декларират и дефинират в първата част на тялото на пакета.
Предаващата декларация е опция, предоставена от Oracle, не е задължително и използването и неизползването зависи от изискванията на програмиста.
Синтаксис:
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>
Горният синтаксис показва декларация напред. Частните елементи се декларират отделно в предната част на пакета и са дефинирани в по-късната част.
Използване на курсори в пакет
За разлика от други елементи, човек трябва да внимава при използването на курсори вътре в пакета.
Ако курсорът е дефиниран в спецификацията на пакета или в глобалната част на тялото на пакета, тогава веднъж отворен курсорът ще остане до края на сесията.
Така че винаги трябва да използвате атрибутите на курсора '%ISOPEN', за да проверите състоянието на курсора, преди да го препратите.
Претоварване
Претоварването е концепцията за наличие на много подпрограми с едно и също име. Тези подпрограми ще се различават една от друга по редица параметри или типове параметри или тип връщане, т.е. подпрограма със същото име, но с различен брой параметри, различен тип параметри или различен повторен тип се считат за претоварване.
Това е полезно, когато много подпрограми трябва да изпълняват една и съща задача, но начинът на извикване на всяка от тях трябва да е различен. В този случай името на подпрограмата ще се запази едно и също за всички и параметрите ще бъдат променени според оператора за извикване.
Пример 1: В този пример ще създадем пакет за получаване и задаване на стойностите на информацията за служителя в таблицата „emp“. Функцията get_record ще върне изходния тип запис за дадения номер на служител, а процедурата set_record ще вмъкне записа тип запис в таблицата emp.
Стъпка 1) Създаване на пакетна спецификация
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: /
Изход:
Package created
Обяснение на кода
- Кодов ред 1-5: Създаване на спецификацията на пакета за guru99_get_set с една процедура и една функция. Тези два вече са публични елементи на този пакет.
Стъпка 2) Пакетът съдържа тялото на пакета, където ще бъдат дефинирани всички процедури и функции. В тази стъпка се създава тялото на пакета.
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: /
Изход:
Package body created
Обяснение на кода
- Кодов ред 7: Създаване на тялото на пакета.
- Кодов ред 9-16: Дефиниране на елемента 'set_record', който е деклариран в спецификацията. Това е същото като дефинирането на самостоятелната процедура в PL/SQL.
- Кодов ред 17-24: Дефиниране на елемента 'get_record'. Това е същото като дефинирането на самостоятелна функция.
- Кодов ред 25-26: Дефиниране на частта за инициализация на пакета.
Стъпка 3) Създаване на анонимен блок за вмъкване и показване на записите чрез позоваване на създадения по-горе пакет.
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: /
Изход:
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
Обяснение на кода:
- Кодов ред 34-37: Попълване на данните за променлива тип запис в анонимен блок за извикване на елемента „set_record“ от пакета.
- Кодов ред 38: Беше направено повикване към 'set_record' на пакет guru99_get_set. Сега пакетът е създаден и ще се запази до края на сесията.
- Частта за инициализация на пакета се изпълнява, тъй като това е първото извикване на пакета.
- Записът е вмъкнат от елемента „set_record“ в таблицата.
- Кодов ред 41: Извикване на елемента 'get_record' за показване на подробностите за вмъкнатия служител.
- Пакетът се препраща за втори път по време на извикването 'get_record' към пакета. Но частта за инициализация не се изпълнява този път, тъй като пакетът вече е инициализиран в тази сесия.
- Кодов ред 42-45: Отпечатване на данните за служителя.
Зависимост в пакети
Тъй като пакетът е логическото групиране на свързани неща, той има някои зависимости. Следват зависимостите, за които трябва да се погрижите.
- Спецификацията е самостоятелен обект.
- Тялото на пакета зависи от спецификацията.
- Тялото на пакета може да се компилира отделно. Всеки път, когато се компилира спецификация, тялото трябва да се компилира отново, тъй като ще стане невалидно.
- Подпрограмата в тялото на пакета, която зависи от частен елемент, трябва да бъде дефинирана само след декларацията на частния елемент.
- Обектите на базата данни, които са посочени в спецификацията и тялото, трябва да бъдат във валиден статус по време на компилирането на пакета.
Информация за пакета
След като информацията за пакета бъде създадена, тя е достъпна в Oracle таблици за дефиниране на данни.
Таблицата по-долу дава таблицата за дефиниране на данни и информацията за пакета, която е налична в таблицата.
Име на таблицата | Descriptйон | Запитване |
---|---|---|
ВСИЧКИ_ОБЕКТ | Дава подробности за пакета като object_id, create_date, last_ddl_time и т.н. Той ще съдържа обектите, създадени от всички потребители. | SELECT * FROM all_objects където object_name =' ' |
USER_OBJECT | Дава подробности за пакета като object_id, create_date, last_ddl_time и др. Той ще съдържа обектите, създадени от текущия потребител. | SELECT * FROM user_objects където object_name =' ' |
ALL_SOURCE | Дава източника на обектите, създадени от всички потребители. | SELECT * FROM all_source where name=' ' |
USER_SOURCE | Дава източника на обектите, създадени от текущия потребител. | SELECT * FROM user_source where name=' ' |
ВСИЧКИ_ПРОЦЕДУРИ | Дава подробности за подпрограмата като object_id, подробности за претоварване и т.н., създадени от всички потребители. | ИЗБЕРЕТЕ * ОТ всички_процедури Където object_name=' ' |
USER_PROCEDURES | Дава подробности за подпрограмата като object_id, подробности за претоварване и т.н., създадени от текущия потребител. | ИЗБЕРЕТЕ * ОТ user_procedures Където object_name=' ' |
UTL ФАЙЛ – Общ преглед
UTL файлът е отделен помощен пакет, предоставен от Oracle за изпълнение на специални задачи. Това се използва главно за четене и запис на файлове на операционната система от PL/SQL пакети или подпрограми. Има отделни функции за поставяне на информация и за получаване на информация от файлове. Той също така позволява четене/запис в родния набор от знаци.
Програмистът може да използва това, за да записва файлове на операционната система от всякакъв тип и файлът ще бъде записан директно в сървъра на базата данни. Името и пътят на директорията ще бъдат споменати по време на писане.
Oбобщение
Вече научихме пакетите в PL / SQL, и вече трябва да можете да работите в следното.
- PL/SQL пакети и техните компоненти
- Характеристики на пакетите
- Препращащи и претоварващи елементи на пакета
- Управление на зависимости в пакети
- Преглед на информация за пакета
- Какво е UTL файл