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