Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование хранимых процедур. Сервер InterBase. 
:(
    Опции темы
Pakshin A. S.
Дата 4.11.2004, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Хранимая процедура представляет собой программу, расположенную на сервере и вызываемую из приложения клиента. Использование этих объектов увеличивает скорость доступа к БД по следующим причинам:
1) вместо текста запроса, который может быть достаточно длинным, серверу передается по сети относительно короткие обращения к хранимой процедуре;
2) хранимая процедура, в отличие от запроса, не требует предварительной синтаксической проверки.
Еще одним преимуществом при обращении к хранимым процедурам является то, что, будучи общими, для всех приложений-клиентов, они реализуют единые для них правила работы с БД.

СОЗДАНИЕ И ИЗМЕНЕНИЕ ХРАНИМОЙ ПРОЦЕДУРЫ
Хранимая процедура является оператором.
Код

CREATE PROCEDURE
<Имя процедуры> [(<Список входных параметров>)]
[RETURNS (<Список выходных параметров>)]
AS <Тело процедуры>

Список параметров выглядит так:
Код

<Имя параметра> <Тип параметра>,

[<Имя параметра> <Тип параметра>]

При использовании параметра в выражениях тела процедуры перед его именем нужно указывать знак «:».
Тело процедуры состоит из двух частей – описательной и исполнительной.
Код

[<Объявление переменных>]
BEGIN
 <Оператор1>
 <Оператор2>
 …
 <ОператорN>
END

В теле процедуры должен содержаться как минимум один параметр.
Созданную процедуру можно удалить при помощи следующего оператора:
Код

DROP PROCEDURE <Имя процедуры>

Изменение процедуры выполняется оператором ALTER PROCEDURE, имеющим тот же формат, что и оператор CREATE PROCEDURE.

ЯЗЫК ХРАНИМЫХ ПРОЦЕДУР
Рассмотрим кратко основные составляющие языка хранимых процедур.
В язык хранимых процедур включены операторы:
1) объявления переменных;
2) присваивания;
3) условные;
4) составные;
5) цикла;
6) выбора записи;
7) выбора нескольких записей;
8) возврата значений;
9) выхода из процедуры;
10) вызова процедуры:
11) посылка сообщения;
Операторы должны заканчивать точкой с запятой, кроме составного оператора.
Объявление переменных:
Код

DECLARE VARIABLE <Имя переменной> <Тип переменной>;

Тип переменной совпадает с типом столбцов базы данных.
Пример:
Код

DECLARE VARIABLE Number INTEGER;
DECLARE VARIABLE NewString VARCHAR(10);
DECLARE VARIABLE WorkDate DATE;

Оператор присваивания имеет следующий вид:
Код

<Имя переменной> = <Выражение>;

Пример:
Код

DECLARE VARIABLE n INTEGER;
DECLARE VARIABLE s VARCHAR(30);

n = 17;
s = UPPER(s);

Условный оператор имеет следующий формат:
Код

IF (<Условие>) THEN <Оператор1> [ELSE <Оператор2>];

Соответственно оба оператора могут быть составными и иметь следующий вид:
Код

BEGIN
 <Оператор1>
 <Оператор2>
 …
 <ОператорN>
END

Пример:
Код

IF (x < 0)
    THEN
  BEGIN
      n = 0;
      s = “”;
  END
    ELSE
  n = 10;

Оператор цикла (повтора) имеет следующий формат:
Код

WHILE (<Условие>) DO <Оператор>;

Пример:
Код

s = 0;
n = 1;
WHILE (n <= 10) DO
    BEGIN
  s = s + n;
  n = n + 1;
    END

Оператор выбора записи представляет собой оператор SELECT, который возвращает одну строку, поэтому его называют также оператором выбора строки. Значение столбцов возвращаемой строки присваиваются указанным переменным или параметрам.
Пример использования:
Код

CREATE PROCEDURE pSalary
    RETURNS (opSum FLOAT, opAvg FLOAT)
    AS
    BEGIN
  SELECT SUM(Salary), AVG(Salary)
  FROM Personnel
  INTO :opSum, :opAvg; /*Запись в параметры*/
    END

Оператор выбора нескольких записей также представляет собой оператор SELECT, способный возвращать несколько записей:
Код

FOR <Оператор выбора записи> DO <Оператор>;

Пример:
Код

CREATE PROCEDURE pCountCode
    RETURNS (opSum INTEGER)
    AS
    DECLARE VARIABLE n INTEGER;
    DECLARE VARIABLE x INTEGER;
    BEGIN
  x = 0;
  FOR SELECT Code FROM List INTO n DO
      x = x + n;
  opSum = x;
    END

Часто после слова DO указывается оператор SUSPEND; возврата значений, который передает в вызывающее приложение или хранимую процедуру значения выходных параметров.
Пример:
Код

CREATE PROCEDURE pSalary2 (ipSalaryMin FLOAT, ipSalaryMax FLOAT)
    RETURNS (opName VARCHAR(20), opSalary FLOAT)
    AS
    BEGIN
FOR SELECT Name, Salary FROM Personnel 
WHERE Salary >= :ipSalaryMin AND Salary <= :ipSalaryMax
INTO :opName; :opSalary
DO SUSPEND;
    END

Для немедленного выхода из процедуры используется оператор выхода:
Код

EXIT;

Из процедуры можно вызвать так же другую процедуру при помощи оператора EXECUTE:
Код

EXECUTE PROCEDURE <Имя процедуры> [(<Список входных параметров>)]
[RETURNING_VALUES (<Список выходных параметров>)]

Пример:
Код

CREATE PROCEDURE pTest
    RETURNS (opResult FLOAT)
    AS    
    BEGIN
  EXECUTE PROCEDURE pDivide (100, 20) 
RETURNING_VALUES (opResult);
    END

Для общения с приложением можно использовать посылку сообщений оператором POST_EVENT:
Код

POST_EVENT “<Имя события>”;
[code=sql]
Пример:
[code=sql]

[B]ВИДЫ ХРАНИМЫХ ПРОЦЕДУР[/B]
Процедуры делятся не два вида:
1) возвращающие одну строку (или процедуры действия):
2) возвращающие несколько строк (или процедуры выбора).
В теле процедур выбора размещаются совместно используемые операторы выбора нескольких записей и возврата значений – FROM SELECT … DO … SUSPEND, которые и обеспечивают вывод нескольких записей.
[B]ВЫЗОВ ХРАНИМОЙ ПРОЦЕДРУ ВЫБОРА[/B]
[code=sql]
SELECT * FROM pSalary2 (2000, 3000)

ВЫЗОВ ХРАНИМОЙ ПРОЦЕДУРЫ ДЕЙСТВИЯ
Код

EXECUTE PROCEDURE pSalary;



ТРИГГЕР
Триггер представляет собой процедуру, которая находится на сервере БД и вызывается автоматически при модификации записей БД, т. е. при изменении столбцов или при их удалении и добавлении. В отличие от хранимых процедур, триггеры нельзя вызывать из приложения клиента, а также передавать им параметры и получать от них результаты. 
Триггеры обычно используются для программной реализации так называемых бизнес-правил. С их помощью удобно реализовать различные ограничения, например, ограничения на значения столбцов или ограничение ссылочной целостности, а также выполнять такие действия, как накапливание статистики работы БД или резервное копирования записей.

СОЗДАНИЕ И ИЗМЕНЕНИЕ ТРИГГЕРА
Создание триггера имеет следующий формат:
Код

CREATE TRIGGER <Имя триггера> FOR <Имя таблицы>
    [ACTIVE | INACTIVE]
    {BEFORE | AFTER}
    {UPDATE | INSERT | DELETE}
    [POSITION <Число>]
    AS <Тело триггера>

Описатели ACTIVE и INACTIVE определяет активность триггера стразу после его создания. По умолчанию действует ACTIVE.
Описатели BEFORE и AFTER задают момент начала выполнения триггера.
Описатели UPDATE, INSERT и DELETE определяют момент (событие) выполнения триггера.
При наличии нескольких триггеров для одного события определяют порядок вызова триггеров, который указывается в операнде POSITION.
Триггер можно удалить:
Код

DROP TRIGGER <Имя триггера>

Изменяется триггер оператором ALTER TRIGGER, имеющим такой же формат.
Программирование триггера ничем не отличается от программирования хранимых процедур.
Отметим, что для доступа к значениям столбца используются конструкции формата:
Код

OLD.<Имя столбца> /*Обращение к старому значению*/
NEW.<Имя столбца> /*Обращение к новому значению*/


СОЗДАНИЕ ГЕНЕРАТОРОВ ДЛЯ InterBase
В отличие от базы данных Paradox, для таблиц InterBase отсутствует автоинкрементный тип, обеспечивающий автоматическую установку уникальных значений. Поэтому для обеспечения уникальности значений ключевых столбцов совместно с триггерами используются генераторы. Генератор возвращает уникальное целочисленное значение.
Генератор создается следующим оператором:
Код

CREATE GENERATOR <Имя генератора>;

Начальное значение задаётся командой:
Код

SET GENERATOR <Имя генератора> TO <Начальное значение>;

Обращение к созданному генератору выполняется с помощью функции:
Код

GEN_ID (<Имя генератора>, <Шаг>);

Примеры:
Код

CREATE GENERATOR GenStore;
SET GENERATOR GetStore TO 1;
GEN_ID (GetStore, 1);


Использование функций, определяемых пользователем
Пример библиотеки выполненной в среде Delphi:
Код

library IBDLL;

uses
    SysUtils,
    Classes;

function Sqrt2 (x: real): real cdecl; export;
begin
    if x < 0
  then
      Sqrt2:=0
  else
      Sqrt2:=sqrt(s)
end;

exports
    Sqrt2;

begin
end.

Скомпилированную библиотеку нужно перенести в каталог с системой. Пример: С:\WINDOWS\SYSTEM32
Теперь объявляем функцию из библиотеки в БД:
Код

DECLARE EXTERNAL FUNCTION <Имя функции>
    [<Тип данных>, …, <Тип данных>]
    RETURNS {<Тип данных> [BY VALUE] | CSTRING (<Целое число>)}
    ENTRY_POINT “<Зарезервированное имя функции>”
    MODULE_NAME “<Имя библиотеки>”;

CSTRING (<Число символов в строке>) обеспечивает вывод строковых значений (в соответствии с типом PChar в Delphi).
Пример:
Код

DECLARE EXTERNAL FUNCTION Sqrt2 FLOAT
    RETURNS FLOAT BY VALUE
    ENTRY_POINT “Sqrt2”
    MODULE_NAME “IBDLL”;

Отменяется объявление функции через оператор:
Код

DROP EXTERNAL FUNCTION <Имя функции>;

После объявления функции её можно вызывать в операторах языка SQL наряду со встроенными функциями.
Отметим, что локальная версия сервера InterBase не поддерживает работу с функциями, определяемыми пользователем.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

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

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.