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