Язык PL/SQL является легко переносимым; он стандартизован для всех серверов фирм Oracle на различных платформах. Так как его типы данных базируются на типах данных серверов, язык является полностью машинно-независимым. Вам нет необходимости изучать ( версии для UNIX, Windows NT, NetWare и т.д. Программа, написанная на языке PL/SQL,может быть откомпилирована и выполнена на любом сервере фирмы Oracle без модификации.
Ускорение выполнения сценариев SQL
Одни сценарии SQL*Plus могут генерировать другие сценарии, такие как распечатка количества строк в каждой таблице базы данных. Однако сценарии могут быть переписаны на языке PL/SQL, откомпилированы и сохранены в базе данных, выполняясь гораздо быстрее, без записи промежуточного сценария в файл.
Написание сценариев SQL*PIus является достаточно трудной задачей; программа-сценарий PL/SQL является более легким для документирования и сопровождения средством. Кроме того, откомпилированная программа на языке PL/SQL обычно является разделяемой между администраторами баз данных. Каждый из них знает, где находятся такие программы-сценарии и как их выполнить; продолжительные поиски на жестком диске не требуются.
Упрощение администрирования баз данных
У администраторов баз данных, вероятно, имеется определенный набор сценариев SQL, предоставляющих информацию о действующей базе данных. Но, изучив язык PL/SQL, можно создать совершенно новый набор программ, дающий дополнительную информацию о производительности базы данных, использовании пространства, загрузке пользователей, блокировках и т.д. Язык PL/SQL отвергает ограничения и препятствия, с которыми обычно сталкиваются разработчики сценариев SQL.
Пакеты позволяют автоматизировать выполнение многих задач через установленные интервалы времени. Можно передавать данные о системе или приложении внешним мониторам производительности, написанным, возможно, на языках C++ и Delphi, и затем использовать их усовершенствованные средства построения отчетов и графиков для вывода информации в реальном масштабе времени.
SQL Server)
Можно настроить расписание (Sheadule) на выполнение подобных задач, на запуск хранимых процедур (например в определенные дни недели для профилактических работ) и настроить выдачу различных сообщений (Alerts).
Существует возможность объявления переменных:
@ имя локальной переменной;
Declare @ Var1 int.
кроме этого уже заранее есть глобальные переменные, которые могут быть вызваны:
@@ Version SQLServer
, присвоения значений, проверки условий и ветвления.
Oracle) продолжение PL/SQL
· Если проектирование объемного и сложного SQL-кода затруднительно, можно разбить его на части и выполнить их вместе в сценарии языка PL/SQL. Такой путь предпочтительнее, чем попытка объединить более семи таблиц, после чего SQL Executor наверняка зависнет.
· Чтобы разработать эффективное приложение, можно использовать язык PL/SQL для создания хранимых процедур и пакетов.
Oracle)
Последовательность (Sequence) - это объект БД, создаваемый и принадлежащий пользователю и представляющий собой генератор чисел.
Типичное применение последовательности - создание значения для первичного ключа.
Числа последовательности хранятся и генерируются независимо от таблиц, поэтому последовательность может использоваться при генерации уникальных значений для разных таблиц. Последовательность может использоваться разными пользователями.
Пример использования последовательности:
INSERT INTO КЛИЕНТЫ
VALUES (КЛИЕНТ_ИД_ПОСЛ. NEXTVAL,'АОЗТ "Россы"', 1500, 101);
В свободный номер последовательности вставляется новая запись. Удобно тем что последовательность сама найдет следующий идентификатор. Также возможна работа с текущей записью при помощи CURVAL.
SQL Server)
Здесь нет такого объекта. Последовательная работа с ключевыми полями возможна через ключевой курсор, но этот курсор не может генерировать новых значений ключа.
Курсоры.
Oracle)
Курсоры могут явно объявляться в процедуре, функции или пакете
для облегчения ориентированной на записи обработки данных
ORACLE. Курсоры могут также неявно объявляться (для поддержки
других действий манипулирования данными) самим процессором
PL/SQL.
SQL Server)
Для перемещения по записям существует объект курсор
Курсоры бывают нескольких видов:
1) Динамический - позволяет перемещаться в любом направлении, отражает изменение данных и позволяет изменять данные
DECLARE клиенты_curs CURSOR
FOR SELECT ид, наименование
FROM клиенты
WHERE кредит> = 40000
ORDER BY ид;
2) не позиционный (forward only) – не позволяет перемещаться в любом направлении, только вперед, открывается быстро, работает относительно долго.
DECLARE клиенты_cursor CURSOR
FOR SELECT ид, наименование
FROM клиенты
WHERE кредит> = 40000
3) Ключевой курсор (keyset), при его открытии набор полей однозначно идентифицирующий запись переносится в базу с временными данными Tempdb. Курсор позволяет менять поля не входящие в ключ. Отражает изменения.
DECLARE клиенты_cursor CURSOR
FOR SELECT ид, ФИО
FROM продавцы
ORDER BY ид;
4) Статический - целиком переносит записи в базу TempDb (база временных таблиц и данных), не отражает изменений и не позволяет изменять данные.
различаются по направлениям движения по записям таблиц, по скорости работы и скорости открывания.
Курсор позволяет изменять данные и отражать изменения данных.
Можно изменять те данные в таблицах, куда указывает курсор
Update Table1
Set my_name=’andrew’
Where current of Name Cursor
Аналогичные возможности для вставки и удаления.
Триггеры.
Общее)
Триггеры это особый вид хранимых процедур, которые выполняются при изменение данных. Предназначены для проверки данных, для поддержки де нормализованных структур.
Триггер это часть транзакции вызвавшей его срабатывание, поэтому может вызвать откат транзакции.
Триггер связан с таблицей, на которую он наложен - это таблица триггера.
SQL Server)
На время работы триггера создаются две временные таблицы Inserted, Deleted аналогичные по структуре таблице триггера.
Последовательность действий при срабатывании триггера:
Проверка ограничений- если они выполняются то данные меняются - записываются в таблицы Inserted, Deleted - срабатывает триггер.
Структура создания триггера:
Create trigger имя триггера
On таблица1
For действие (insert, update, delete)
As
Блок SQL;
Oracle)
Триггеры делятся по времени срабатывания BEFORE, AFTER (до или после события вызвавшего триггер) и так же по событиям (Insert, Update, Delete)
Порядок выполнения триггеров: операторный триггер BEFORE - однострочный триггер BEFORE - СОБЫТИЕ - однострочный триггер AFTER - операторный триггер AFTER.- срабатывает триггер - проверка ограничений
Структура создания триггера:
Create trigger имя триггера
Before/After
[Delete] [or Insert] [or delete]
On таблица1
[For each row]
[when(условие )]
Блок PL/SQL;
Примеры создания триггеров.
1) Создать триггера, изменяющие объем продаж (поле результат) для продавца и офиса, при каком-либо изменении таблицы ЗАКАЗЫ.
Oracle)
CREATE TRIGGER Credit BEFORE INSERT
ON Клиенты FOR EACH ROW
BEGIN
IF :New.кредит IS NULL or :New.кредит=0 THEN
:New.кредит=1000;
END IF;
END;
SQL Server)
CREATE TRIGGER Credit
ON Клиенты
FOR INSERT
As
IF Кредит IS NULL or Кредит=0 THEN
Кредит=1000;
2) Создать триггера, изменяющие объем продаж (поле результат) для продавца и офиса, при каком-либо изменении таблицы ЗАКАЗЫ.
Здесь для каждого вида изменений можно написать по триггеру, т.е. on Update, on Insert, on delete с некоторыми малыми отличиями для каждой СУБД, как это было уже показано выше. Но в СУБД Oracle можно все это объединить в один триггер.
Oracle)
Create trigger SaleWeight before insert or update or delete
ON Заказы FOR EACH ROW
begin
IF updating then
update продавцы
set результат:=результат+:new.сумма-:old.сумма
where :old.прод_ид=ид;
update офисы
set результат:=результат+:new.сумма-:old.сумма
where :old.прод_ид=прод_ид;
end if;
IF deleting then
update продавцы
set результат:=результат-:old.сумма
where :old.прод_ид=ид;
update офисы
set результат:=результат-:old.сумма
where :old.прод_ид=прод_ид;
end if;
IF inserting then
update продавцы
set результат:=результат+:new.сумма
where :old.прод_ид=ид;
update офисы
set результат:=результат+:new.сумма
where :old.прод_ид=прод_ид;
end if;
end;
· Oracle позволяет более гибко распределиться временем срабатывания триггера в отличие от SQL Server.
· В SQL Server нет надобности смотреть, когда срабатывает триггер “до или после”, изменения записываются сразу же, а триггер после всех изменений и только в недопустимых случаях происходит откат транзакции.
· Oracle позволяет давать более сложное описание триггера.
Поддержка национальных языков
Средство поддержки национальных языков Oracle (National Language Support - NLS) позволяет пользователям использовать базу данных на их собственных языках. Это средство обеспечивает следующие функции: