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 предоставя възможност за инициализиране на елементи на пакет или за извършване на каквато и да е дейност по време на създаването на този екземпляр чрез „Инициализация на пакета“.

Това не е нищо друго освен блок за изпълнение, който се записва в тялото на пакета след дефиниране на всички елементи на пакета. Този блок ще се изпълнява всеки път, когато даден пакет бъде препратен за първи път в сесията.

Синтаксис

Създаване на пакет в PL/SQL

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 файл