Пакет Oracle PL / SQL: тип, спецификация, тело (пример)

Содержание:

Anonim

Что такое пакет в Oracle?

Пакет PL / SQL - это логическая группировка связанной подпрограммы (процедуры / функции) в один элемент. Пакет компилируется и сохраняется как объект базы данных, который можно использовать позже.

В этом руководстве вы узнаете:

  • Компоненты пакетов
  • Спецификация пакета
  • Тело пакета
  • Ссылка на элементы пакета
  • Создать пакет в PL / SQL
  • Предварительные декларации
  • Использование курсоров в пакете
  • Перегрузка
  • Зависимость в пакетах
  • Информация о пакете
  • UTL-ФАЙЛ - Обзор

Компоненты пакетов

Пакет PL / SQL состоит из двух компонентов.

  • Спецификация пакета
  • Тело пакета

Спецификация пакета

Спецификация пакета состоит из объявления всех общедоступных переменных, курсоров, объектов, процедур, функций и исключений.

Ниже приведены некоторые характеристики спецификации пакета.

  • Доступ ко всем элементам, объявленным в спецификации, можно получить извне пакета. Такие элементы называются общедоступными.
  • Спецификация пакета - это отдельный элемент, что означает, что он может существовать отдельно без тела пакета.
  • Всякий раз, когда пакет ссылается на этот конкретный сеанс, создается его экземпляр.
  • После создания экземпляра для сеанса все элементы пакета, инициированные в этом экземпляре, действительны до конца сеанса.

Синтаксис

CREATE [OR REPLACE] PACKAGE 
IS… END 

Приведенный выше синтаксис показывает создание спецификации пакета.

Тело пакета

Он состоит из определения всех элементов, присутствующих в спецификации пакета. Он также может иметь определение элементов, которые не объявлены в спецификации, эти элементы называются частными элементами и могут вызываться только изнутри пакета.

Ниже приведены характеристики корпуса пакета.

  • Он должен содержать определения для всех подпрограмм / курсоров, которые были объявлены в спецификации.
  • Он также может иметь больше подпрограмм или других элементов, не объявленных в спецификации. Это так называемые частные элементы.
  • Это надежный объект, и это зависит от спецификации пакета.
  • Состояние тела пакета становится «Недействительным» всякий раз, когда компилируется спецификация. Следовательно, его нужно перекомпилировать каждый раз после составления спецификации.
  • Прежде чем использовать в теле пакета, необходимо определить частные элементы.
  • Первая часть пакета - это часть глобального объявления. Сюда входят переменные, курсоры и частные элементы (предварительное объявление), видимые для всего пакета.
  • Последняя часть пакета - это часть инициализации пакета, которая выполняется один раз, когда пакет упоминается впервые в сеансе.

Синтаксис:

CREATE [OR REPLACE] PACKAGE BODY 
IS.END 
  • Приведенный выше синтаксис показывает создание тела пакета.

Теперь мы посмотрим, как ссылаться на элементы пакета в программе.

Ссылка на элементы пакета

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

На все общедоступные элементы пакета можно ссылаться, вызывая имя пакета, за которым следует имя элемента, разделенное точкой, то есть «<имя_пакета>. <Имя_элемента>».

Общую переменную пакета также можно использовать таким же образом для присвоения и выборки значений из них, например «<имя_пакета>. <Имя_переменной>».

Создать пакет в PL / SQL

В PL / SQL всякий раз, когда пакет упоминается / вызывается в сеансе, для этого пакета создается новый экземпляр.

Oracle предоставляет возможность инициализировать элементы пакета или выполнять любые действия во время создания этого экземпляра с помощью «Инициализации пакета».

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

Синтаксис

CREATE [OR REPLACE] PACKAGE BODY 
IS.BEGINEEND 
  • Приведенный выше синтаксис показывает определение инициализации пакета в теле пакета.

Предварительные декларации

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

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

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

Синтаксис:

CREATE [OR REPLACE] PACKAGE BODY 
IS.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