Анонимный блок, или блок без имени, – это блок PL/SQL, не хранящийся в базе данных. В процессе работы приложение просто посылает такой кодовый блок серверу баз данных, и после его обработки сервером блок прекращает существование.
В предыдущих примерах этой главы все блоки были анонимными блоками PL/SQL, в которых раздел объявлений, начинался с ключевого слова DECLARE и заканчивался ключевым слово END.
Подпрограмма – это именованная программа PL/SQL, которая может использовать параметры и вызываться приложением. Скомпилированный двоичный код логических схем приложения можно хранить в базе данных ORACLE при помощи хранимых подпрограмм. В базе данных ORACLE можно хранить в качестве объектов схем подпрограммы двух типов: хранимые процедуры и хранимые функции. Хранимые процедуры и функции в отличие от анонимных блоков сохраняются в базе данных и наряду с таблицами, представлениями и др. являются самостоятельными объектами баз данных ORACLE. Процедуры и функции сохраняются в базе данных в откомпилированном виде, и при их вызове загружаются в разделяемый пул (pool – системная область памяти СУБД), откуда удаляются по мере его заполнения в порядке частоты использования кода процедуры или функции. Наиболее редко используемый код, разумеется, удаляется раньше, и при очередном вызове данный код снова загружается в пул с диска. Такая организация способствует производительности выполнения вызываемых процедур и функций, поскольку исключает постоянную загрузку с диска, исполняемого кода. Хранимая функция отличается от процедуры тем, что функция в отличие от процедуры возвращает значения в вызывающую среду.
Для создания в базе данных ORACLE хранимой процедуры или функции применяется команда CREATE PROCEDURE или CREATE FUNCTION.
Как уже указывалось, процедуры создаются посредством инструкции PL/SQL CREATE PROCEDURE:
сreate[or replace] procedure имя_процедуры [(аргумент1 [{in | out | in out}] тип, … аргумент2 [{in | out | in out}] тип)] {is|as} тело процедуры/
Чтобы изменить текст процедуры, её необходимо удалить, а затем повторно создать. Во время разработки процедур эта операция повторяется достаточно часто, поэтому ключевые слова OR REPLACE позволяют выполнить такую операцию за один раз. Если процедура существует, то она удаляется без всякого предупреждения (в данном случае вызов инструкции DROP PROCEDURE не требуется), если же не существовала, то она просто создаётся.
Параметры IN, OUT и IN OUT используются как при создании процедур, так и функций. Смысл параметра INв следующем: Значение физического параметра передаётся в функцию. Внутри процедуры формальный параметр рассматривается в качестве константы PL/SQL (параметр только для чтения) и не может быть изменен. Когда процедура завершается, и управление программой передаётся в вызывающую среду, фактический параметр не изменяется. При использовании параметра OUT, любое значение, которое имеет фактический параметр при вызове процедуры, игнорируется. Внутри процедуры формальный параметр рассматривается в качестве неинициализированной переменной, т. е содержит NULL – значение, и можно как записать в него значение, так и считать значение из него. Когда управление передаётся в вызывающую среду, содержание формальной переменной присваивается фактическому параметру. Параметр IN OUT это комбинация параметров INи OUT. В данном случае формальный параметр рассматривается в качестве инициализированной переменной.