Что такое пакет в Oracle?
Пакет PL / SQL представляет собой логическое объединение связанной подпрограммы (процедуры / функции) в один элемент. Пакет компилируется и сохраняется как объект базы данных, который можно использовать позже.
В этом уроке вы узнаете
- Компоненты пакетов
- Спецификация упаковки
- Корпус
- Ссылающиеся элементы пакета
- Создать пакет в PL / SQL
- Форвардные декларации
- Использование курсоров в пакете
- перегрузка
- Зависимость в пакетах
- Информация о пакете
- UTL FILE — обзор
Компоненты пакетов
Пакет 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, creation_date, last_ddl_time и т. Д. Он будет содержать объекты, созданные всеми пользователями. | SELECT * FROM all_objects, где имя_объекта = ‘<имя_пакета>’ |
USER_OBJECT | Предоставляет сведения о пакете, такие как object_id, creation_date, last_ddl_time и т. Д. Он будет содержать объекты, созданные текущим пользователем. | SELECT * FROM user_objects, где имя_объекта = ‘<имя_пакета>’ |
ALL_SOURCE | Предоставляет источник объектов, созданных всеми пользователями. | SELECT * FROM all_source, где name = ‘<имя_пакета>’ |
USER_SOURCE | Предоставляет источник объектов, созданных текущим пользователем. | SELECT * FROM user_source, где name = ‘<имя_пакета>’ |
ALL_PROCEDURES | Предоставляет подробности подпрограммы, такие как object_id, сведения о перегрузке и т. Д., Созданные всеми пользователями. | SELECT * FROM all_procedures где имя_объекта = ‘<имя_пакета>’ |
USER_PROCEDURES | Предоставляет подробности подпрограммы, такие как object_id, сведения о перегрузке и т. Д., Созданные текущим пользователем. | SELECT * FROM user_procedures Где имя_объекта = ‘<имя_пакета>’ |
UTL FILE — обзор
UTL File — это отдельный пакет утилит, предоставляемый Oracle для выполнения специальных задач. Это в основном используется для чтения и записи файлов операционной системы из пакетов PL / SQL или подпрограмм. У него есть отдельные функции для размещения информации и получения информации из файлов. Это также позволяет читать / писать в собственном наборе символов.
Программист может использовать это для записи файлов операционной системы любого типа, и файл будет записан непосредственно на сервер базы данных. Имя и путь к каталогу будут указаны при написании.
Резюме
Теперь мы изучили пакеты на PL / SQL, и теперь вы сможете работать следующим образом.
- PL / SQL-пакеты и их компоненты
- Характеристики пакетов
- Ссылка и перегрузка элементов пакета
- Управление зависимостями в пакетах
- Просмотр информации о пакете
- Что такое файл UTL