Подпрограммами называются именованные блоки PL/SQL, которые могут иметь параметры.
Язык PL/SQL позволяет создавать подпрограммы и как процедуры, так и как функции PL/SQL.
Подпрограммы могут быть объявлены в любом блоке PL/SQL, подпрограмме или пакете. Любая процедура или функция должна быть объявлена до ее использования. В том случае, если одной подпрограмме требуется использовать другую подпрограмму, объявляемую позже, то следует использовать механизм предварительного объявления. При этом предварительно объявляемая подпрограмма содержит только спецификацию, а полное объявление подпрограммы может быть выполнено ниже в соответствии с обычным синтаксисом.
Для того чтобы подпрограмму пакета можно было вызвать извне, она должна быть объявлена в спецификации пакета, определяемой оператором CREATE PACKAGE.
Для того чтобы самостоятельную подпрограмму можно было вызвать извне она должна храниться в базе данных. Такие подпрограммы называются хранимыми процедурами или хранимыми функциями. Для их создания применяются SQL-операторы CREATE PROCEDURE и CREATE FUNCTION.
Определение процедуры может иметь следующее формальное описание:
PROCEDURE name [(parameter[, parameter, ...])] IS [local declarations] BEGIN executable statements [EXCEPTION exception handlers] END [name];
Параметры в списке параметров определяются как:
parameter_name [IN | OUT | IN OUT] datatype [{:= | DEFAULT} expression]
Параметры, используемые при объявлении процедуры или функции, называются формальными параметрами, а при вызове - фактическими параметрами.
Язык PL/SQL позволяет, чтобы количество фактических параметров было меньше, чем количество формальных параметров. В этом случае будут использованы значения по умолчанию, которые обязательно должны присутствовать для отсутствующих значений параметров.
Для определения соответствия между формальными и фактическими параметрами предусмотрены два типа нотаций:
позиционная;
именованная.
При позиционной нотации порядок формальных и фактических параметров должен совпадать.
При именованной нотации порядок указания параметров не имеет значения, но перед значением параметра указывается имя формального параметра и символ =>. Список параметров может содержать оба типа нотаций одновременно, но именованная нотация располагается только в конце списка.
Процедура имеет две части:
спецификацию, начинающуюся ключевым словом PROCEDURE и завершающуюся именем процедуры или списком параметров;
тело процедуры, начинающееся ключевым словом IS и завершающееся ключевым словом END.
Тело процедуры, как и любой блок PL/SQL, имеет секцию объявлений, секцию выполняемого кода и необязательную секцию обработчиков исключений.
Определение функции может иметь следующее формальное описание:
FUNCTION name [(parameter[, parameter, ...])] RETURN datatype IS [local declarations] BEGIN executable statements [EXCEPTION exception handlers] END [name];
Параметры в списке параметров определяются как:
parameter_name [IN | OUT | IN OUT] datatype [{:= | DEFAULT} expression]
Например:
FUNCTION fun1 (f1 REAL, f2 REAL) RETURN BOOLEAN IS min_f1 REAL :=0; max_f1 REAL :=1; BEGIN SELECT ff1min, ff2max INTO min_f1, max_f1 FROM tbl1 WHERE ff2 = f2; RETURN (f1 >= min_f1) AND (f2 <= max_f1); EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO tbl2 VALUES (min_f1, max_f1); RETURN FALSE; END fun1;
Язык PL/SQL позволяет создавать перегружаемые подпрограммы, имеющие одинаковое имя, но различный список формальных параметров. Параметры перегружаемых функций должны различаться хотя бы по одному из следующих признаков: по типу, по количеству, по порядку следования параметров.
Перегружаемые подпрограммы можно применять для реализации одних и тех же действий над переменными различных типов. Для перегружаемых подпрограмм компилятор будет искать подпрограмму с совпадающим списком фактических параметров только до тех пор, пока не просмотрит все перегружаемые подпрограммы данного блока. И только в том случае, если перегружаемых подпрограмм с указанным именем в данном блоке нет, то компилятор продолжит поиск во внешнем блоке.