Что такое пакет в 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, creation_date, last_ddl_time и т. Д. Он будет содержать объекты, созданные всеми пользователями. | ВЫБРАТЬ * ИЗ всех_объектов, где имя_объекта = '<имя_пакета>' |
USER_OBJECT | Предоставляет детали пакета, такие как object_id, creation_date, last_ddl_time и т. Д. Он будет содержать объекты, созданные текущим пользователем. | ВЫБРАТЬ * ИЗ user_objects, где object_name = '
|
ALL_SOURCE | Предоставляет источник объектов, созданных всеми пользователями. | ВЫБРАТЬ * ИЗ all_source, где name = '
|
USER_SOURCE | Предоставляет источник объектов, созданных текущим пользователем. | ВЫБЕРИТЕ * ИЗ user_source, где name = '
|
ВСЕ_ПРОЦЕДУРЫ | Предоставляет детали подпрограммы, такие как object_id, детали перегрузки и т. Д., Созданные всеми пользователями. | ВЫБРАТЬ * ИЗ всех_процедур, где имя_объекта = '<имя_пакета>' |
USER_PROCEDURES | Предоставляет детали подпрограммы, такие как object_id, детали перегрузки и т. Д., Созданные текущим пользователем. | ВЫБРАТЬ * ИЗ user_procedures Где имя_объекта = '<имя_пакета>' |
UTL-ФАЙЛ - Обзор
Файл UTL - это отдельный пакет служебных программ, предоставляемый Oracle для выполнения специальных задач. В основном это используется для чтения и записи файлов операционной системы из пакетов или подпрограмм PL / SQL. У него есть отдельные функции для размещения информации и получения информации из файлов. Он также позволяет читать / писать в собственном наборе символов.
Программист может использовать это для записи файлов операционной системы любого типа, и файл будет записан непосредственно на сервер базы данных. Имя и путь к каталогу будут указаны во время написания.
Резюме
Теперь мы изучили пакеты в PL / SQL, и теперь вы должны иметь возможность работать со следующим.
- Пакеты PL / SQL и их компоненты
- Характеристики пакетов
- Обращение к элементам пакета и их перегрузка
- Управление зависимостями в пакетах
- Просмотр информации о пакете
- Что такое файл UTL