Информационное обеспечение



бет11/56
Дата05.03.2023
өлшемі256,49 Kb.
#71567
түріПрактикум
1   ...   7   8   9   10   11   12   13   14   ...   56

ЛАБОРАТОРНАЯ РАБОТА №4




ПРОЦЕДУРЫ, ФУНКЦИИ И ПАКЕТЫ PL/SQL


Цель работы – изучить основные возможности и программные кон- струкции языка PL/SQL. Приобрести навыки разработки хранимых процедур, функций, пакетов.


Теоретические сведения




Структура программ PL/SQL. Язык PL/SQL (Procedural Language / Structured Query Language) – это язык программирования, представляющий со- бой процедурное расширение Oracle – версии языка SQL. В первую очередь PL/SQL дает возможность использовать переменные, операторы управления ходом выполнения программы, массивы, курсоры и исключения.
Язык программирования PL/SQL разработан на базе языка третьего поко- ления Ada. Одним из общих свойств этих языков является их блочная структу- ра. Из Ada заимствованы также обработка исключительных ситуаций, синтак- сис объявления процедур и функций, модули (пакеты). Блок может содержать вложенные блоки, называемые иногда подблоками. Из блоков создаются про- цедуры и функции, из которых в свою очередь строятся приложения. Блок определяет область действия логически связанных объектов. В блоке группи- руются связанные между собой объявления и выполняются операторы [3].
Блоки PL/SQL имеют следующую структуру:

  • раздел заголовка, который начинается ключевыми словами CREATE OR REPLACE и определяет имя блока, необходим только для именованных блоков и отсутствует для анонимных;

  • раздел объявлений, который начинается ключевым словом DECLARE и содержит объявления переменных, констант, курсоров, типов и локальных про- грамм, используемых в данном блоке. Может отсутствовать. Слово DECLARE используется только в триггерах и анонимных блоках, во всех остальных про- граммных единицах объявления расположены между заголовком и BEGIN;

  • раздел выполнения, который начинается ключевым словом BEGIN и содержит выполняемый код, включающий процедурные и SQL-операторы, за- канчивается ключевым словом END. Это основной раздел блока, который так- же называют выполняемым, он должен содержать по крайней мере один вы- полняемый оператор. Не обязателен только в спецификациях пакетов и типов.

  • раздел исключений, который начинается ключевым словом EXCEP- TION, заканчивается END, содержит операторы обработки исключительных ситуаций (ошибок). Может отсутствовать.

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

[DECLARE] BEGIN


Исполняемые операторы [EXCEPTION]
END;
/

Пример использования:


DECLARE
X INTEGER := 8; Y INTEGER :=5; BEGIN


X: = X+Y; Y: = Y-3; DBMS_OUTPUT.PUT_LINE('X ='||X||' Y='||Y); END;
/

Отметим, что любой блок в SQL*Plus завершается символом наклонной черты «/», а оператор присваивания обозначается символом «:=».


Также следует не забывать о необходимости включать серверный вывод результатов работы блоков в SQL*Plus при использовании функций пакета DBMS_OUTPUT командой

SET SERVEROUTPUT ON


Именованный блок может быть разделен на три подвида:



  1. Помеченные блоки – это анонимные блоки с меткой. Они создаются обычно динамически и выполняются только один раз. Метка позволяет ссылаться на переменные блока, которые иначе были бы недоступны. Метка задается перед ключевым словом DECLARE или после ключевого слова END, например:

<> DECLARE
counter INTEGER := 0; BEGIN
DECLARE
counter INTEGER := 1; BEGIN
IF counter = outerblock.counter THEN
DBMS_OUTPUT.PUT_LINE ('X_out ='||outerblock.counter); ELSE DBMS_OUTPUT.PUT_LINE ('X_int ='||counter);
END IF;
END;
END outerblock;
/

В этом примере при выполнении получим X_int = 1, а если поменять при запуске значение counter INTEGER := 1 во внешнем блоке, то X_out = 1. Также отметим, что в примере без метки блока невозможно было бы различить две переменные с одинаковым именем counter, но на практике лучше присвоить та- ким переменным разные имена.



  1. Подпрограммы – это процедуры и функции, которые могут храниться в БД как автономные объекты, как часть пакета или как метод объектного типа. Подпрограммы обычно не изменяются и выполняются неоднократно, могут быть объявлены в других блоках, для обозначения секции объявлений в них не применяется ключевое слово DECLARE. Независимо, где объявлены, они вы- полняются явно посредством вызова процедуры или функции.

Процедуры – это именованные PL/SQL-блоки, которые могут принимать входящие параметры, но не возвращают явно никакого значения. Функции – это именованные PL/SQL-блоки, которые могут принимать входящие парамет- ры и всегда возвращают значение. Разница между процедурой и функцией за- ключается в том, что функция обязательно должна возвращать значение в вы- зывающую программу.
Кроме того, к подпрограммам в PL/SQL можно отнести пакеты. Пакет – это именованный объект базы данных, который группирует логически связан- ные типы, программные объекты и подпрограммы PL/SQL. Пакеты обычно со- стоят из двух частей – спецификации и тела. Спецификация пакета – это ин- терфейс с приложениями, она объявляет типы, переменные, константы, исклю- чения, курсоры и подпрограммы, доступные для использования в пакете. Тело пакета полностью определяет курсоры и подпрограммы, тем самым реализуя спецификацию пакета (CREATE PACKAGE и CREATE PACKAGE BODY).

  1. Триггеры – это именованные блоки, которые ассоциируются с некото- рым событием, происходящим в БД, обычно не изменяются и выполняются многократно неявным образом при наступлении соответствующих событий (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, запуск и останов сеан- са работы с БД и др.).

Комментарии и литералы. В программах PL/SQL используются коммен- тарии двух типов:

  • однострочный, который начинается двумя символами «--» и действует до конца строки;

  • многострочный, который начинается с символов «/*» и заканчивается символами «*/».

Также в программах используются литералы. Литерал – это значение, с которым не связан ни один идентификатор. Литерал может быть представлен:

  • числовым значением, например 123, 345.6, 0.54, NULL;

  • строковым значением, например, 'это Литерал̍';

  • типом BOOLEAN: TRUE, FALSE, NULL;

  • интервальным типом: INTERVAL '04-5' YEAR TO MONTH, INTERVAL '-4' YEAR, INTERVAL '5' MONTH, INTERVAL '5 04:03:02.01' DAY TO SECOND.

Строковый литерал чувствителен к регистру, заключается в одинарные кавычки. Строковый литерал нулевой длины может быть представлен как '' и имеет значение NULL. В случае, когда строковый литерал содержит символ ка- вычка ('), этот символ в соответствии со стандартом представляется в виде двух последовательных кавычек, например:
BEGIN
DBMS_OUTPUT.PUT_LINE ('литерал содержит кавычку '' и имеет длину > 0 '); END;
/
Кроме этого, Oracle позволяет пользователю самостоятельно определять символ, который будет использоваться в качестве кавычек. Выглядеть такое переопределение может, например, так:
BEGIN
DBMS_OUTPUT.PUT_LINE (q'[литерал содержит кавычку' и имеет длину
> 0]');
END;
/
В этом примере в качестве кавычек выступают квадратные скобки.
Типы данных и объявление переменных. Передача информации между
PL/SQL и БД осуществляется с помощью переменных. Переменная (variable) – это область памяти, которая может быть считана или присвоена программой. Переменные объявляются в разделе объявлений блока (DECLARE).
Каждая переменная ассоциируется с определенным типом данных. Тип данных определяет вид информации, которая может храниться в данной пере- менной. Переменные PL/SQL могут иметь тот же тип данных, что и столбцы таблицы базы данных.
Типы данных в PL/SQL сгруппированы в скалярные (scalar), составные (composite), ссылки (reference) и большие объекты (LOB)[ссылка на конспект].
СУБД Oracle предоставляет следующие предопределенные типы данных:
CHAR – хранит строки фиксированной длины. Допустимая длина поля типа CHAR в таблице от 1 до 2000 байт.
VARCHAR2 – хранит строки переменной длины. Максимальная длина поля VARCHAR2 в таблице – 4000 байт. Максимальная длина
PL/SQL-переменной – 32 767 байт. Тип данных VARCHAR – синоним VARCHAR2, но его использования в Oracle стоит избегать.
NCHAR и NVARCHAR2 – являются Unicode-типами, они хранят Unicode- символы.
LONG – может хранить символьные данные переменной длины и содер- жит до 2 ГБ информации. Вместо LONG следует использовать CLOB или NCLOB.
NUMBER – хранит числа с фиксированной и плавающей запятой (до 38 цифр).
DATE – хранит момент времени (дату и время) в таблице, включая год, месяц, день, часы, минуты и секунды (после полуночи).
TIMESTAMP – расширяет тип данных DATE и хранит год, месяц, день, часы, минуты, секунды и доли секунды.
INTERVAL YEAR TO MONTH – представляет собой промежуток време- ни и содержит годы и месяцы.
INTERVAL DAY TO SECOND – представляет собой промежуток време- ни и содержит дни, часы, минуты и секунды.
LOB – включает BLOB, CLOB, NCLOB и BFILE, которые позволяют хра- нить большие блоки неструктурированных данных (текст, картинки, видео) до 4 ГБ в размере.
BLOB – хранит неструктурированные двоичные данные.
CLOB и NCLOB – хранят символьные данные. CLOB хранит символы в кодировке, установленной в БД, а NCLOB – в Unicode-кодировке.
BFILE – хранит неструктурированные двоичные данные в файлах опера- ционной системы вне БД. BFILE-поле таблицы содержит указатель (locator) на внешний файл.
RAW и LONG RAW – используются для данных, которые никак не долж- ны быть интерпретированы базой данных (например, при перемещении данных между разными системами). Эти типы предназначены для двоичных данных и байтовых строк.
СУБД Oracle использует тип данных ROWID для хранения уникального адреса каждой строки в базе данных. Physical Rowids хранят адреса строк обычных таблиц, кластерных таблиц, табличных партиций (partitions), индексов и индексных партиций. Logical Rowids хранят адреса строк в индекс- организованных таблицах (index-organizedtables).
В программах PL/SQL имеется также возможность определять пользова- тельские типы, которые могут быть как подтипами стандартных типов, так и более сложными конструкциями, такими как записи, коллекции или объекты. Например:

DECLARE
-- подтип без ограничений


SUBTYPE TMyFloat IS NUMBER(15,5);
varFloat TMyFloat;
-- подтип с ограничением
SUBTYPE TDayInMonth IS BINARY_INTEGER RANGE 1..31;
d TDayInMonth := 1; BEGIN
NULL; END;
/
Здесь определен собственный подтип TMyFloat на основе типа NUMBER и подтип TdayInMonth, который является целым в диапазоне от 1 до 31. Други- ми словами, подтипы без ограничений – это альтернативные имена стандарт- ных типов данных.
Объявления переменных. Для объявления переменных в блоках PL/SQL существует специальный раздел. Переменные объявляются по следующим пра- вилам:
имя_переменной тип_данных [CONSTANT] [NOT NULL] [{:=| DEFAULT} начальное_значение]
Например:

DECLARE
id INTEGER := 0;


standard INTEGER DEFAULT 500;
Если переменной присваивается значение по умолчанию, то при ее объ- явлении можно также указать, что она не должна принимать значение NULL, воспользовавшись указанием ограничения NOT NULL.
Вложенные блоки определяют область видимости объявленных пере- менных.
Существует понятие объявления переменной с привязкой, которое обла- дает рядом преимуществ, когда необходимо присваивать переменной значения из другого источника, например из поля таблицы. Привязывая переменную, можно установить ее тип на основе типа уже определенной структуры данных. Существует два вида привязки:

  • скалярная – с помощью атрибута %TYPE;

  • привязка к записи – с помощью атрибута %ROWTYPE.

Данные атрибуты используются для объявления переменных, констант и даже определяемых пользователями подтипов и составных типов, соответству- ющих свойствам столбцов и таблиц баз данных. Использование атрибутов не только упрощает объявление программных конструкций, но и делает програм- мы более удобными для модификации БД. Привязка переменной освобождает от необходимости контролировать изменения в полях базовых таблиц БД, ко- торые используются процедурами и функциями. Например:
sal employees.salary%TYPE; MyFloatType NUMBER(15,5);
SUBTYPE TMyFloat IS MyFloatType%TYPE;
Переменная, объявленная с атрибутом %ROWTYPE, фактически пред- ставляет собой запись или строку таблицы и может использоваться с другими составными конструкциями, например:
DECLARE
TYPE parts_table IS TABLE OF departments%ROWTYPE; current_part parts_table;
Здесь объявляется вложенная таблица (один из видов коллекций PL/SQL, которые рассматриваются в лабораторной работе №6) parts_table, структура кото- рой повторяет строку таблицы departments, и переменная current_part этого типа.
Запись RECORD – это составной тип данных, который представляет со- бой группу связанных полей, каждое из которых имеет свое имя и тип. Запись в PL/SQL задается пользователем и определяется как тип:
TYPE имя_типа IS RECORD (описание_поля_1 [,описание_поля_1]...); где описание_поля_1 имеет вид
имя_поля тип_поля [[NOT NULL] {:= | DEFAULT} выражение] Например:
TYPE jobs_type IS RECORD ( job_id jobs.job_id%Type, min_salary NUMBER (6),
max_salary NUMBER (7)
);
В отличие от других сложных типов, таких как VARRAY, NESTED TABLE, OBJECT, запись RECORD не может быть сохранена в БД.
Инициализация полей записи может быть описана при ее объявлении при помощи слова DEFAULT или оператора присваивания, например:
TYPE jobs_type IS RECORD ( job_id jobs.job_id%TYPE := ' ', min_salary NUMBER(6) :=0,
max_salary NUMBER(7) :=0
);
Обращение к записи происходит по имени переменной. Ссылка на поле записи происходит по имени переменной и через точку имени поля. При помо- щи атрибута %ROWTYPE переменная типа запись может быть сопоставлена со строкой любой таблицы в БД.
Переменная с типом запись может быть передана в качестве параметра в процедуру или функцию либо возвращена функцией в качестве результата. Рас- смотрим пример работы с записями для стандартной учебной БД Oracle – human resources (HR).

DECLARE
TYPE jobs_type IS RECORD ( job_id VARCHAR2(10), min_salary NUMBER(6), max_salary NUMBER(7)


);
myjob jobs_type; BEGIN
SELECT job_id, min_salary, max_salary INTO myjob FROM jobs WHERE job_id = 'IT_PROG';
DBMS_OUTPUT.put_line (myjob.job_id
|| ':'
|| myjob.min_salary
|| '-'
|| myjob.max_salary); END;
/
Управление ходом выполнения программ. Как и во всех языках програм- мирования, в PL/SQL существуют операторы управления вычислительным процессом, а именно: операторы условного, итерационного и последовательно- го управления.


Достарыңызбен бөлісу:
1   ...   7   8   9   10   11   12   13   14   ...   56




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет