Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД_Курсов (КН)_з_прикладом!.doc
Скачиваний:
7
Добавлен:
20.11.2019
Размер:
7.21 Mб
Скачать

3 Програмна частина

    1. Створення збережених процедур

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

Перевага збережених процедур заключається в тому, що вони виконуються на сервері в середовищі SQL Server. На перший погляд ця перевага може показатися недостатньо очевидною, але насправді вона складає саму суть моделі клієнт/сервер. Оскільки базами даних управляє SQL-сервер, то доцільно виконувати збережені процедури саме на сервері.

Збережені процедури можуть повертати деяку величину, модифікувати і перевіряти введені користувачем значення на відповідність заздалегідь заданим умовам, встановленим для вашої інформаційної системи. У збережену процедуру можна передавати значення. У той же час вона може повертати значення, які не обов'язково беруться безпосередньо з таблиці, а навпаки, обчислюються в ході виконання самої процедури.

Процедура NAME_CONTAINING використовується для фільтрації строкових даних при вибірці з таблиць-довідників. Процедура має 2 параметри. Перший параметр – вихідне значення рядка. Другий – значення фільтра. Якщо другий параметр є субрядком першого, незалежно від регістра, то процедура поверне перший параметр. У противному випадку результатом буде рядок 'ERROR'. Нижче приводиться текст збереженої процедури:

CREATE PROCEDURE NAME_CONTAINING (

IN_LNAM VARCHAR(255),

MASK VARCHAR(255)

) RETURNS (

OUT_LNAM VARCHAR(255)

) AS

BEGIN

IF ((IN_LNAM COLLATE PXW_CYRL) CONTAINING MASK) THEN OUT_LNAM=IN_LNAM;

ELSE OUT_LNAM='ERROR';

SUSPEND;

END

Процедура ENTRANTREPORT2_SELECT використовується для одержаня звіту «Сводка про хід подачі заяв»:

CREATE PROCEDURE ENTRANTREPORT2_SELECT RETURNS (

ORT INTEGER,

OFPRKEY INTEGER,

OFNAM VARCHAR(50),

OSPRKEY INTEGER,

OSNAM VARCHAR(50),

OPLAN INTEGER,

OTEACHFORMD INTEGER,

OTEACHFORMW INTEGER,

OJOINED INTEGER,

OPAYED INTEGER,

OENTERED INTEGER

) AS

DECLARE VARIABLE LPLANGOV INTEGER;

DECLARE VARIABLE LPLANEC INTEGER;

DECLARE VARIABLE LPLAN INTEGER;

DECLARE VARIABLE LJOINED INTEGER;

DECLARE VARIABLE LPAYED INTEGER;

DECLARE VARIABLE LENTERED INTEGER;

DECLARE VARIABLE LTEACHFORMD INTEGER;

DECLARE VARIABLE LTEACHFORMW INTEGER;

BEGIN

FOR SELECT F.PRKEY,F.LNAM

FROM FACULT F

ORDER BY F.LNAM

INTO :OFPRKEY,:OFNAM

DO

BEGIN

ORT=1;

OPLAN=NULL;

OJOINED=NULL;

OPAYED=NULL;

OENTERED=NULL;

SUSPEND;

LPLAN=0;

LJOINED=0;

LPAYED=0;

LENTERED=0;

LTEACHFORMD=0;

LTEACHFORMW=0;

ORT=2;

FOR SELECT S.PRKEY,S.LNAM,S.PLANGOV,S.PLANEC

FROM SPECIALIT S

WHERE S.LFACULT=:OFPRKEY

ORDER BY S.LNAM

INTO :OSPRKEY,:OSNAM,:LPLANGOV,:LPLANEC

DO

BEGIN

OPLAN=0;

IF(LPLANGOV>0)THEN OPLAN=OPLAN+LPLANGOV;

IF(LPLANEC>0)THEN OPLAN=OPLAN+LPLANEC;

OJOINED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND .GOTMONEY=0

INTO :OJOINED;

IF(OJOINED IS NULL)THEN OJOINED=0;

OPAYED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.PAYED=1

INTO :OPAYED;

IF(OPAYED IS NULL)THEN OPAYED=0;

OENTERED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.ENTERED=1

INTO :OENTERED;

IF(OENTERED IS NULL)THEN OENTERED=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.TEACHFORM=1

INTO :OTEACHFORMD;

IF(OTEACHFORMD IS NULL)THEN OTEACHFORMD=0;

SELECT COUNT(E.PRKEY)

FROM ENTRANT E

WHERE E.LSPECIALIT=:OSPRKEY AND E.TEACHFORM=2

INTO :OTEACHFORMW;

IF(OTEACHFORMW IS NULL)THEN OTEACHFORMW=0;

LPLAN=LPLAN+OPLAN;

LJOINED=LJOINED+OJOINED;

LPAYED=LPAYED+OPAYED;

LENTERED=LENTERED+OENTERED;

LTEACHFORMD=LTEACHFORMD+OTEACHFORMD;

LTEACHFORMW=LTEACHFORMW+OTEACHFORMW;

SUSPEND;

END

ORT=3;

OPLAN=LPLAN;

OJOINED=LJOINED;

OPAYED=LPAYED;

OENTERED=LENTERED;

OTEACHFORMD=LTEACHFORMD;

OTEACHFORMW=LTEACHFORMW;

SUSPEND;

END

END

Процедура FACULTREGID_GET_ID необхідна для генерації реєстраційного номера, унікального в межах факультету. Вона повертає реєстраційний номер і виділяє наступний реєстраційний номер.

CREATE PROCEDURE FACULTREGID_GET_ID (

ILFACULT INTEGER

) RETURNS (

OREGID INTEGER

) AS

DECLARE VARIABLE LCNT INTEGER;

DECLARE VARIABLE LREGID INTEGER;

BEGIN

SELECT MIN(F.REGID)

FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT

INTO :OREGID;

IF(OREGID IS NULL)THEN

BEGIN

OREGID=1;

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,2);

END

ELSE

BEGIN

DELETE FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT AND F.REGID=:OREGID;

SELECT COUNT(F.PRKEY)

FROM FACULTREGID F

WHERE F.LFACULT=:ILFACULT AND F.REGID<>:OREGID

INTO :LCNT;

IF((LCNT=0)OR(LCNT IS NULL))THEN

BEGIN

LREGID=OREGID+1;

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,:LREGID);

END

END

SUSPEND;

END

Аналогічно збережена процедура FACULTREGID_FREE_ID використовується при видаленні абітурієнта. Процедура відзначає реєстраційний номер абітурієнта, що видаляється, як невикористовуваний. Цей реєстраційний номер одержить перший абітурієнт, що подає документи у ВНЗ. Нижче приведений код збереженої процедури:

CREATE PROCEDURE FACULTREGID_FREE_ID (

ILFACULT INTEGER,

IREGID INTEGER

) AS

BEGIN

INSERT INTO FACULTREGID(PRKEY,LFACULT,REGID)

VALUES(GEN_ID(FACULTREGID_PRKEY_GEN,1),:ILFACULT,:IREGID);

END