Учебники

20) Пакеты в 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 предоставляет возможность инициализировать элементы пакета или выполнять какие-либо действия во время создания этого экземпляра с помощью «Инициализация пакета».

Это не что иное, как блок выполнения, который записывается в теле пакета после определения всех элементов пакета. Этот блок будет выполняться всякий раз, когда пакет передается в первый раз в сеансе.

Синтаксис

Пакеты в PL / SQL

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<Package Initialization> 
END <package_name>
  • Приведенный выше синтаксис показывает определение инициализации пакета в теле пакета.

Форвардные декларации

Прямое объявление / ссылка в пакете — это не что иное, как объявление отдельных элементов по отдельности и определение их в более поздней части тела пакета.

На частные элементы можно ссылаться, только если они уже объявлены в теле пакета. По этой причине используется предварительное объявление. Но это довольно необычно в использовании, потому что в большинстве случаев закрытые элементы объявляются и определяются в первой части тела пакета.

Форвардное объявление — это опция, предоставляемая Oracle, она не обязательна, и использование, а не использование — это требование программиста.

Пакеты в PL / SQL

Синтаксис:

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) Создание спецификации пакета

Пакеты в PL / SQL

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) Пакет содержит тело пакета, в котором будут определены все действительные процедуры и функции. На этом шаге создается тело пакета.

Пакеты в PL / SQL

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) Создание анонимного блока для вставки и отображения записей, ссылаясь на созданный выше пакет.

Пакеты в PL / SQL

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