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 таблиці визначення даних.
У таблиці нижче наведено таблицю визначення даних і інформацію про пакет, яка доступна в таблиці.
Назва таблиці | Опис | Запит |
---|---|---|
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, де object_name =' ' |
ALL_SOURCE | Надає джерело об’єктів, створених усіма користувачами. | SELECT * FROM all_source where name=' ' |
USER_SOURCE | Надає джерело об’єктів, створених поточним користувачем. | SELECT * FROM user_source where name=' ' |
УСІ_ПРОЦЕДУРИ | Надає такі деталі підпрограми, як object_id, деталі перевантаження тощо, створені всіма користувачами. | ВИБРАТИ * FROM all_procedures Де object_name=' ' |
USER_PROCEDURES | Надає такі деталі підпрограми, як object_id, деталі перевантаження тощо, створені поточним користувачем. | SELECT * FROM user_procedures Де object_name=' ' |
UTL-ФАЙЛ – Огляд
Файл UTL — це окремий пакет утиліт, який надає Oracle для виконання спеціальних завдань. Це в основному використовується для читання та запису файлів операційної системи з пакетів або підпрограм PL/SQL. Він отримав окремі функції для розміщення інформації та отримання інформації з файлів. Він також дозволяє читати/записувати у рідному наборі символів.
Програміст може використовувати це для запису файлів операційної системи будь-якого типу, і файл буде записаний безпосередньо на сервер бази даних. Ім'я та шлях до каталогу буде згадано під час написання.
Підсумки
Тепер ми вивчили пакети в PL / SQL, і тепер ви зможете працювати в наступному.
- Пакети PL/SQL та їх компоненти
- Характеристики пакетів
- Пересилання та перевантаження елементів пакету
- Управління залежностями в пакетах
- Перегляд інформації про пакет
- Що таке файл UTL