Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Вызов хранимых подпрограмм




Begin

Процедуры и функции

Процедура/функция (подпрограмма) объявляется в конце раздела Declare любого блока PL/SQL и имеет сле­ду­ющую структуру:

Procedure/Function <имя> [(<объявление параметра>,...)] [ Return <тип>]

{As | Is}

[<объявления локальных объектов>]

<операторы обработки>

Return [<возвращаемое значение функции> --завершение работы]

[ Exeption

<операторы обработки исключительных ситуаций, включая Return>]

End [<имя процедуры/функции>];

Параметр объявляется в виде:

<имя параметра> [ in | out | in out] <тип параметра>[:=<значение>]

В типе параметра размерность не указывается.

Допускается позиционная и именованная запись фактических пара­мет­ров (<имя формального параметра> = <значение параметра>) одновре­мен­­­но (позиционные параметры располагаются в начале списка параметров).

Пример создания функции возвращающей сумму продаж товаров.

Create or replace function Sumprod () return number as

Sump number:= 0.0;

Begin Select sum(stoim) into Sump from prodaga_tovarov; return Sump; End;

Для того чтобы подпрограммы хранились в базе данных и были об­ще­доступными в виде хранимых процедур или функций, они должны быть созданы SQL‑операторами:

Create [ or replace ] procedure/function [<схема>.]<имя процедуры/функции>

<параметры и тело процедуры/функции>

or replace ‑ указывает замещение старого текста подпрограммы.

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

Приложение предкомпилятора или приложение OCI может вы­зывать хранимые подпрограммы из анонимных блоков PL/SQL.

Пример вызова процедур create_dept из предкомпилятора.

exec sql execute

begin create_dept(:name,:location); end;

end-exec;

Фактические параметры:name и:location - это хост-переменные (пе­­ре­менные, объявленные во внешней среде, например в языках програм­мирования).

Пример вызова процедуры create_dept из пакет emp_actions.

exec sql execute

begin emp_actions.create_dept(:name,:location); end;

end-exec;

Пример вариантов вызова процедуры create_dept из SQL*Plus.

sql> execute create_dept('marketing', 'new york');

sql> begin create_dept('marketing', 'new york'); end;

Пример создания процедуры вывода в таблицу сум­мы продаж това­ров и налога на добавленную стоимость за текущий день.

Create or replace

Procedure z_ prodaga_tovarov (stoimost_tovara in number, nds in number:=0.2) as

Begin Insert into prodaga_tovarov

values (sysdate, stoimost_tovara, nds * stoimost_tovara);

End;

Для уничтожения подпрограммы используется SQL‑оператор:

Drop procedure/function [<схема>.]<имя процедуры/функции>

Перезагружаемыми подпрограммами называются подпрограммы с одинаковыми именами, но с различными параметрами. Oracle автома­ти­чес­ки вызывает нужную подпрограмму по набору фактических параметров (ар­гументов).

Для вызова встроенной подпрограммы, при наличии одноименной подпрограммы пользователя, эта подпрограмма уточняется именем пакета standard (x:=standard.sign(x)).

Рекурсивная подпрограмма содержит вызов этой же подпрограммы. Каждый рекурсивный вызов создает новый набор всех элементов под­прог­раммы (параметры, переменные, курсоры, исключения и др.).

Пример рекурсивной подпрограммы вычисления факториала числа n: n!=n*(n-1)!

Function factorial (n integer) Return integer is

Begin if n=1 then return 1; else return n* factorial (n-1); endif; end factorial;

Пример процедуры, которая устанавливает новый оклад сотруднику.

procedure izmenit_oklad (tabn number, novii_oklad real) is

oklad_otsutstvuet exception; --исключение (п. 5.4.9)

begin

if novii_oklad is null then raise oklad_otsutstvuet;--генерация исключения (п. 5.4.9)

else update oklad set oklad = novii_oklad where tn=tabn;

end if;

exception --обработка исключений (п. 5.4.9)

when no_data_found then --отстутствует строка в запросе

insert into sotr_audit values ('Отсутствует сотрудник с таб. N ', tabn);

when oklad_otsutstvuet then --отсутствует значение нового оклада

insert into sotr_audit values (‘Оклад отсутствует для сотр. c таб. N ’,tabn);

end izmenit_oklad;

Пример функции контроля оклада на диапазон допустимых значе­ний для указанного кода должности.

function oklad_ok (oklad real, koddolg real) return boolean is

min_oklad real; max_oklad real;

begin select minoklad, maxoklad into min_oklad, max_oklad from dolgnosti

where kd=koddolg; return (oklad >= min_oklad) and (oklad <= max_oklad);

end oklad _ok;




Поделиться с друзьями:


Дата добавления: 2014-12-10; Просмотров: 373; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.