SQL для триггеров, функций и хранимых процедур в Oracle (PL/SQL)
Хранимая процедура – отдельная программа, написанная на PL/SQL. Сами процедуры хранятся в базе данных. Хранимые процедуры позволяют вести поиск и обработку данных непосредственно на сервере, обеспечивая максимальную независимость клиентской части приложений. В них могут использоваться любые конструкции SQL для процедур и триггеров, кроме контекстных переменных :new.column, :old.column, применимых только в триггерах. Они, как обычные программы, могут получать входные параметры и возвращать значения вызвавшим их приложениям. Хранимая процедура может вызываться непосредственно из приложения или других хранимых процедур или триггеров. Использование этих процедур позволяет обеспечить ускорение обработки. Хранимые процедуры выполняются сервером, а не клиентом, что позволяет сократить сетевой трафик и ускорить выполнение, последнее особенно важно для удаленного клиентского доступа. При модификации процедуры внесенные изменения автоматически согласованно отражаются во всех приложениях, которые используют процедуру.
Язык PL/SQL включает: • инструкции манипуляции данных SQL: добавление, модификация, удаление из базы, выборка данных из базы в список переменных. • операторы SQL и выражения, включая функции пользователя (UDF – user defined functions). расширение SQL, включающее оператор присвоения, операторы управления последовательностью вычислений, возможность использования собственных и контекстных переменных, операторы генерации событий и исключений (ошибок), а также команды обработки ошибок. При работе с данными используются следующие операции (перечень дан в порядке убывания их приоритета): • арифметические операции "* /", далее "+ -" • операция конкатенации строковых данных "||" • операции сравнения =, ==, <>, !=, ~=, ^= (не равно), >, <, >=, <= , !>, ~>, ^> (не больше), !<, ~<, ^< (не меньше) • логические операции not, and, or. Хотя хранимые процедуры, функции и триггеры используются различным образом и в разных целях, они базируются на одном и том же языке. И хранимые процедуры, и триггеры могут использовать любые конструкции языка, за исключением следующих: • Контекстные переменные допустимы только в триггерах. Входные и выходные параметры, а также инструкции suspend и exit, которые возвращают значения, применимы только в хранимых процедурах, return <val> в функциях.
Программа (триггер, процедура, функция) включает объявление переменных и тело программы.
Программа имеет вид: <declarations> <exec_block>
<declarations> - объявление переменных. <exec_block> - текст программы
Прежде чем продолжить, уточним терминологию. Оператор declare – это оператор объявления переменных. Блок (<block>) – это один или несколько операторов (<compound_statement>), заключенных в операторные скобки begin-end. Оператор (<compound_statement>) – это простой оператор или блок. <exec_block> ::= <block>
Формализованная запись: <block> ::= <compound_statement> ::= {<block> | <statement>; [<compound_statement>]} <statement> - простой оператор. <statement> ::= {<op_set_val> | <op_excepton> | <op_call> | <op_if> | <op_for> | <op_while> | <op_post> | <op_sql> | <op_suspend> | <op_end> | <op_when>} Простые операторы: оператор присвоения; оператор вызова процедуры; оператор ветвления if; оператор цикла for; оператор цикла while; оператор прерывания цикла exit; оператор цикла for для курсоров; оператор перехода к метке goto; операторы SQL insert, update, select; оператор выхода из программы и возврата значения return; операторы генерации сообщений об ошибках и их обработка; операторы работы с курсорами open, fetch, close; задание транзакции. Кроме того, для удобства сопровождения программ в их текст могут быть внесены комментарии. Рассмотрим подробнее базовые конструкции перечисленных операторов. Оператор объявления переменных Оператор <declarations>применяется в хранимых процедурах, функциях и триггерах и размещается в начале их тела непосредственно перед скобкой begin, за которой размещаются все исполнимые операторы. Все используемые переменные должны быть объявлены. Оператор объявления завершается ";". Одним оператором может быть объявлена только одна переменная, и объявления имеют смысл только внутри хранимой процедуры, функции или триггера. <declarations>::=[declare] <list_decl> declare – начинает анонимный блок, если для него необходимы переменные; при определении функции, процедуры, модуля после слова is или as не ставится, а в триггере указывается (тело триггера трактуется, как анонимный блок).
<list_decl>::={<decl_var> | <decl_cur_type> | <decl_cursor> | <decl_subproc> | <decl_subfun>};[<list_decl>]
<declare _var> - объявление переменной <decl _var> ::= <var> <type > [not null] [{:= | default} <value>]} <var> - имя переменной <type> ::= {<datatype> | {<var _name> | <rel>.<col>% type}} {<var> | <rel>.<col>% type}} – тип данных по ссылке на ранее объявленный существующий. <datatype> - стандартный тип данных <var _name> - имя ранее объявленной переменной <rel>.<col> - ссылка на поле другой таблицы <rel> - имя таблицы <col> - имя поля <value> ::= {<literal> | null | <context_var>} Если используется конструкция not null, то обязательно присвоение начального значения. Если начального значение не присваивается, то переменная получает значение null.
<decl _cur _type> - объявляет курсорного тип данных. <decl_cur_type>::= type <ref_type_name> is ref cursor [return <return_type>];
<ref _type _name> - имя курсорного типа. <return _type> - тип списка выбираемых значений.
<decl_cursor> - объявление курсора для последующего чтения данных из набора, выбираемого командой select. Курсорные переменные могут объявляться только внутри процедур, функций и триггеров.
<decl_cursor> ::= <var> <ref_type_name>;
<decl_subproc>, <decl_subfun> - объявление процедуры, функции. Объявления необходимы в модулях. Функции и процедуры, объявленные в заголовке модуля (package), доступны для использования во внешних командах.
<decl_subproc> ::= procedure <proc_name> [(<list_ par>)];
<decl_subfun> ::= function <func_name> [(<list_par>)] returns <datatype>;
<list_ par>=<par_name>[{in | out | in out}] <datatype>[,<list_ par>]
<proc_name> - имя процедуры. <func_name> - имя функции. <list_par> - список входных параметров. {in | out | in out} – задает тип параметра: входной, выходной и входной – выходной. Оператор присвоения <variable> := <expression>; <variable> – локальная переменная, входной или выходной параметр, контекстная переменная. <expression> – любое допустимое в SQL выражение, включающее переменные, операторы SQL, пользовательские (UDF) функции и генераторы, выражения в скобках.
Оператор вызова процедуры Оператор осуществляет вызов хранимой процедуры. При вызове процедуры из ISQL оператор имеет следующий синтаксис. call procedure [<shema>.]<name> [<list_param>]; При вызове процедуры из другой процедуры, функции или триггера оператор имеет следующий синтаксис. [<shema>.]<name> [<list_param>];
<name> – имя вызываемой процедуры. Сама процедура должна быть предварительно создана в базе командой create procedure. <shema> - имя схемы, в которой создана процедура. <list_param> ::= <param> [,<list_param>] <param> –входной или выходной параметр процедуры (если процедура не требует параметров, список параметров может отсутствовать). Отдельные параметры могут быть константами или переменными. Оператор ветвления Оператор ветвления if … then … elsif … else обеспечивает выполнение того или иного действия в зависимости от истинности проверяемого условия. if <condition> then <list_ statement> [else <list_ statement>] end if;
<condition> – выражение, которое может принимать значение истина или ложь. <list_ statement> ::= <statement>; [<list_ statement>] <statement> - простой оператор (см. выше). Если условие выполнено (значение true), то выполняется оператор, следующий за конструкцией then. При невыполнении последовательно проверяются, если они присутствуют условия, заданные после elsif, иначе выполняется оператор, следующий за конструкцией else, если она присутствует. Присутствие блоков при наличии нескольких операторов после конструкций then или else не требуется. Окончание оператора помечается обязательной конструкцией end if. Оператор цикла loop, while, for Оператор цикла while обеспечивает выполнение операторов, указанных после ключевого слова loop пока указанное после while условие истинно. while <condition> loop <list_ statement> end loop; while … loop … end loop – оператор выполнения цикла, который повторяет операторы <list_ statement>, указанный после loop до ограничения цикла end loop, пока условие <condition> истинно. Условие проверяется в начале каждого цикла. Так пример 6.3.4. s=1; В Oracle примет вид Пример 6.4.1. s:=1; i:=12; end loop;
Оператор «бесконечного» цикла loop. loop <list_ statement> end loop; Пример 6.4.1. s:=1; i:=12; end loop;
Оператор прерывания цикла exit; Для досрочного выхода из цикла используется оператор exit. Оператор имеет следующий синтаксис. exit [when <condition>];
При отсутствии конструкции when происходит безусловный выход из цикла. Если используемся конструкции when, выход осуществляется, когда условие <condition> истинно. Для «бесконечного» цикла использование оператор exit обязательно. Пример 6.4.2. s:=1; i:=12; exit when i=0; end loop; Оператор цикла for с числовой переменной. for <val> in [reverse] <low_exp>..<high_exp> loop <list_ statement> end loop; Оператор обеспечивает выполнение цикла по переменной <val> с начальным значением <low_exp> и конечным <high_exp> с шагом 1, если режим reverse не задан, либо с начальным значением <high_exp> и конечным <low_exp> с шагом -1, если режим reverse задан. <low_exp>, <high_exp> - выражение приводимые к числовому виду. С помощью цикла for пример 6.4.1. примет следующий вид. Пример 6.4.3. s:=1; end loop; Метки, оператор перехода к метке goto Оператор перехода позволяет передать управление к помеченной точке программы. goto <label_name>; Сама метка размещается внутри текста программы и имеет вид << <label_name> >> <label_name> - имя метки, а двойные угловые скобки (выделены подчеркиванием) являются элементом синтаксиса.
Пример 6.4.4. loop … if a>5 then goto lbl1; end if; … end loop; <<lbl1>> … Метки могут также использоваться для именования циклов. В этом случае цикл имеет вид << <label_name> >> <op_cicle> <label_name> В этом случае оператор выхода из цикла может иметь вид exit <label_name> when <condition>; Выход при этом осуществляется из поименованного цикла. Последнее может быть полезно при выходе из вложенных циклов. Оператор цикла for для курсоров Операторы циклической выборки данных реализуются с помощью механизма курсоров. Наиболее простой способ – чтение данных с помощью неявных курсоров. Синтаксис цикла чтения из неявного курсора реализуется следующим образом for <cur_name> in(<select_statement>) loop <list_ statement> end loop; Доступ к считанным данным обеспечивается указанием имени курсора и имени поля. <cur_name>.<field_name> Так цикл чтения примера 6.3.3. примет вид Пример 6.4.5.
for cr in(select author, auname from tauthor) <list_ statement> if(cr.auname>p1) then if(cr.auname<p2) then <list_ statement> end if; <list_ statement> end loop; То же самое действие при явном объявлении имеет вид [declare] cursor <cur_name> is <select_statement>; … for <cur_name> loop <list_ statement> end loop;
И пример 6.4.5. примет вид Пример 6.4.6.
declare cursor cr is select author, auname from tauthor; for cr loop <list_ statement> if(cr.auname>p1) then if(cr.auname<p2) then <list_ statement> end if; <list_ statement> end loop;
Оператор выхода из программы и возврата значения return; Для выхода из процедуры до достижения ее окончания используется оператор return без параметров. Пример 6.4.7.
procedure … … begin <list_ statement> if(…) then return; <list_ statement> end Для выхода из функции используется оператор return <val>. Выражение, указанное в <val> задает возвращаемое значение. Программа может содержать несколько операторов return.
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (356)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |