Конспект лекций по дисциплине «Сетевые базы данных», страница 27

[ (параметр [{IN | OUT | IN OUT}] тип,

(параметр [{IN | OUT | IN OUT}] тип)] {IS | AS}

/* раздел объявлений */

BEGIN

/* выполняемы раздел */

EXCEPTION

/* раздел исключительных ситуаций */

END [имя_процедуры];

/

Если сравнить структуру безымянного блока и структуру команда CREATE PROCEDURE, то можно отметить их сходство. Отличием является то, что вместо ключевого слова DECLARE используется набор ключевых слов команды CREATE, и после последнего из этого набора ключевого слова IS (или AS) начинается раздел объявлений.

Однако собственно команда CREATE – непростая конструкция. Команда может содержать необязательную фразу OR REPLACE, Если эта фраза указана, то процедура создается, даже если в БД уже есть процедура с таким же именем. В этом случае вновь создаваемая процедура заместит ту, которая уже есть в БД. Если же фраза OR REPLACE отсутствует, то сначала нужно удалить из БД процедуру с таким же именем командой DROP, а затем выполнять команду CREATE PROCEDURE.

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

Создаваемая процедура может иметь параметры, которые определяются так же, как и переменные в разделе объявлений – имя и тип данных. Но есть два отличия. Первое – это то, что при указании типа данных NUMBER, CHAR или VARCHAR2 не указывается их размер. Второе отличие заключается в указании, является ли параметр входным, выходным или  и тем и другим (см. п. 9.5).

Приведем пример создания хранимой процедуры с именем MY_POC и одним входным параметром.

CREATE [OR REPLACE] PROCEDURE my_proc

(p_City IN varchar2) IS

cnt number;

BEGIN

select count(*) into cnt from sal where cyti= p_City;

DBMS_OUTPUT.PUT_LINE(‘count = ’||cnt);

END my_proc;

/

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

            9.2. Функции

Функции очень похожи на процедуры. Функции и процедуры представляют собой различные формы блоков PL/SQL. Однако вызов процедуры сам по себе является оператором PL/SQL, в то время как вызов функции – это часть некоторого выражения. Синтаксис, применяемый при создании хранимой функции, очень похож на синтаксис создания процедуры:

CREATE [OR REPLACE] FUNCTION имя_функции

[ (параметр [{IN | OUT | IN OUT}] тип,

(параметр [{IN | OUT | IN OUT}] тип)]

RETURN возвращаемый_тип {IS | AS}

/* раздел объявлений */

BEGIN

/* выполняемы раздел */

EXCEPTION

/* раздел исключительных ситуаций */

END [имя_процедуры];

/

Именно потому, что функция используется как часть выражения, в команде CREATE FUNCTION присутствует фраза RETURN возвращаемый_тип. Этой фразой задается тип возвращаемого функцией значения.

Внутри тела функции оператор RETURN применяется для возврата управления в вызывающую среду с некоторым значением. Общий синтаксис оператора выглядит следующим образом:

RETURN выражение;

где выражение – это возвращаемое значение. В функции может быть несколько операторов RETURN, хотя выполняться будет только один из них. Завершение функции без оператора RETURN является ошибкой.

Во всем остальном команда CREATE FUNCTION аналогична команде CREATE PROCEDURE, описанной в п. 9.2.

Приведем пример создания функции, которая возвращает количество продавцов, проживающих в городе, название которого передается в параметре.

CREATE [OR REPLACE] FUNCTION my_func