База данных для хранения и обработки информации, которая требуется типичной психиатрической больнице, страница 28

       num INTEGER;

BEGIN

       SELECT COUNT(*) INTO num FROM ДИАГНОЗЫ WHERE НАЗВАНИЕ = pНАЗВАНИЕ AND WAS_REMOVED=1;

       IF num = 0 THEN

               INSERT INTO ДИАГНОЗЫ (НАЗВАНИЕ, ОПИСАНИЕ) VALUES (pНАЗВАНИЕ, pОПИСАНИЕ) RETURNING ID INTO pID;

       ELSE

               UPDATE ДИАГНОЗЫ SET WAS_REMOVED = 0, ОПИСАНИЕ = pОПИСАНИЕ WHERE НАЗВАНИЕ = pНАЗВАНИЕ AND WAS_REMOVED = 1 RETURNING ID INTO pID;

       END IF;

END;

/

--удаление записи из списка видимых заболеваний

CREATE PROCEDURE RemoveDisease (pID NUMBER) AS

BEGIN

       UPDATE ДИАГНОЗЫ SET WAS_REMOVED = 1 WHERE ID = pID;

END;

/

--создание записи в ЛЕКАРСТВА

CREATE PROCEDURE CreateNewDrug (pНАЗВАНИЕ VARCHAR2, pОПИСАНИЕ VARCHAR2, pID OUT NUMBER) AS

       num INTEGER;

BEGIN

       SELECT COUNT(*) INTO num FROM ЛЕКАРСТВА WHERE НАЗВАНИЕ = pНАЗВАНИЕ AND WAS_REMOVED=1;

       IF num = 0 THEN

               INSERT INTO ЛЕКАРСТВА (НАЗВАНИЕ, ОПИСАНИЕ) VALUES (pНАЗВАНИЕ, pОПИСАНИЕ) RETURNING ID INTO pID;

       ELSE

               UPDATE ЛЕКАРСТВА SET WAS_REMOVED = 0, ОПИСАНИЕ = pОПИСАНИЕ WHERE НАЗВАНИЕ = pНАЗВАНИЕ AND WAS_REMOVED = 1 RETURNING ID INTO pID;

       END IF;

END;

/

--удаление записи из списка видимых заболеваний

CREATE PROCEDURE RemoveDrug (pID NUMBER) AS

BEGIN

       UPDATE ЛЕКАРСТВА SET WAS_REMOVED = 1 WHERE ID = pID;

END;

/

--создание записи в ЧЕЛОВЕК

CREATE PROCEDURE CreateNewPerson (pИМЯ VARCHAR2, pФАМИЛИЯ VARCHAR2, pОТЧЕСТВО VARCHAR2, pПАСПОРТ VARCHAR2, pID OUT NUMBER) AS

BEGIN

  INSERT INTO ЧЕЛОВЕК (ИМЯ,ФАМИЛИЯ,ОТЧЕСТВО,ПАСПОРТ) VALUES(pИМЯ,pФАМИЛИЯ,pОТЧЕСТВО,pПАСПОРТ) RETURNING ID INTO pID;

END;

/

--создание записи в СОТРУДНИК

CREATE PROCEDURE CreateNewEmployee (pЧЕЛОВЕК_ID NUMBER, pДОЛЖНОСТЬ_ID NUMBER, pДАТА_РОЖДЕНИЯ DATE, pКОГДА_УСТРОИЛСЯ IN OUT DATE, pКОГДА_УВОЛИЛСЯ DATE, pКОНТАКТНЫЙ_ТЕЛЕФОН VARCHAR2, pLOGIN VARCHAR2, pPASSWORD VARCHAR2, pФОТОГРАФИЯ BLOB, pID OUT NUMBER) AS

       num number;

       excptIsWorking EXCEPTION;

BEGIN

       if pКОГДА_УСТРОИЛСЯ is null then pКОГДА_УСТРОИЛСЯ := SYSDATE; end if;

       --логин должен быть уникален для работающих сотрудников

       select count(*) into num from СОТРУДНИК where LOGIN = pLOGIN AND КОГДА_УВОЛИЛСЯ IS NULL;

       if num > 0 then RAISE_APPLICATION_ERROR(-20060, 'Этот логин уже задействован!'); end if;

       --чтоб не оказалось, что сотрудник работал/работает, в промежуток времени, когда УЖЕ работал/работает

       SELECT COUNT(ID) INTO num FROM СОТРУДНИК WHERE ЧЕЛОВЕК_ID = pЧЕЛОВЕК_ID

               AND isTimeIntersected(КОГДА_УСТРОИЛСЯ, КОГДА_УВОЛИЛСЯ, pКОГДА_УСТРОИЛСЯ, pКОГДА_УВОЛИЛСЯ) = 1;

       IF num > 0 THEN RAISE excptIsWorking; END IF;

       INSERT INTO СОТРУДНИК (ЧЕЛОВЕК_ID, ДОЛЖНОСТЬ_ID, КОГДА_УСТРОИЛСЯ, КОГДА_УВОЛИЛСЯ, ДАТА_РОЖДЕНИЯ, КОНТАКТНЫЙ_ТЕЛЕФОН, LOGIN, PASSWORD, ФОТОГРАФИЯ) VALUES (pЧЕЛОВЕК_ID, pДОЛЖНОСТЬ_ID, pКОГДА_УСТРОИЛСЯ, pКОГДА_УВОЛИЛСЯ, pДАТА_РОЖДЕНИЯ, pКОНТАКТНЫЙ_ТЕЛЕФОН, pLOGIN, pPASSWORD, pФОТОГРАФИЯ) RETURNING ID INTO pID;

EXCEPTION

       WHEN excptIsWorking           THEN RAISE_APPLICATION_ERROR(-20000, 'Сотрудник УЖЕ работает!');

END;

/

--восстановление сотрудника

CREATE PROCEDURE RestoreEmployee (pID IN OUT NUMBER) AS

       CURSOR empCursor IS SELECT * FROM СОТРУДНИК WHERE ID=pID;

       lastEmpRecord empCursor%ROWTYPE;

BEGIN

       OPEN empCursor;

       FETCH empCursor INTO lastEmpRecord;

       CLOSE empCursor;

       INSERT INTO СОТРУДНИК (ЧЕЛОВЕК_ID, ДОЛЖНОСТЬ_ID, КОГДА_УСТРОИЛСЯ, КОГДА_УВОЛИЛСЯ, ДАТА_РОЖДЕНИЯ, КОНТАКТНЫЙ_ТЕЛЕФОН, LOGIN, PASSWORD, ФОТОГРАФИЯ) VALUES(lastEmpRecord.ЧЕЛОВЕК_ID, lastEmpRecord.ДОЛЖНОСТЬ_ID, SYSDATE, NULL, lastEmpRecord.ДАТА_РОЖДЕНИЯ, lastEmpRecord.КОНТАКТНЫЙ_ТЕЛЕФОН, lastEmpRecord.LOGIN, lastEmpRecord.PASSWORD, lastEmpRecord.ФОТОГРАФИЯ) RETURNING ID INTO pID;

END;

/

--увольнение сотрудника

CREATE PROCEDURE FireEmployee (pID NUMBER) AS

BEGIN

       UPDATE СОТРУДНИК SET КОГДА_УВОЛИЛСЯ=SYSDATE WHERE ID=pID;

END;

/

--выписка пациента

CREATE PROCEDURE DischargePatient (pID NUMBER, pОСМОТРЕВШИЙ_ID NUMBER) AS

BEGIN

       UPDATE ИСТОРИЯ_БОЛЕЗНЕЙ SET ОСМОТРЕВШИЙ_ID=pОСМОТРЕВШИЙ_ID, ДАТА_ВЫПИСКИ=SYSDATE WHERE ID=pID;

END;

/

CREATE PROCEDURE UserEmployeeUpdate (pФОТОГРАФИЯ BLOB, pPHONE VARCHAR2, pLOGIN VARCHAR2, pPASSWORD VARCHAR2) AS

BEGIN

       UPDATE СОТРУДНИК SET ФОТОГРАФИЯ=pФОТОГРАФИЯ, КОНТАКТНЫЙ_ТЕЛЕФОН=pPHONE WHERE LOGIN = pLOGIN AND PASSWORD = pPASSWORD AND КОГДА_УВОЛИЛСЯ IS NULL;

END;

/

--назначение наказания

CREATE PROCEDURE AssignPunishment (pИСТОРИЯ_ID NUMBER, pНАКАЗАНИЕ_ID NUMBER, pНАЗНАЧИЛ_ID NUMBER, pЗА_ЧТО VARCHAR2, pКОГДА OUT DATE) AS

BEGIN

       INSERT INTO ИСТОРИЯ_НАКАЗАНИЙ (ИСТОРИЯ_ID, НАКАЗАНИЕ_ID, НАЗНАЧИЛ_ID, КОГДА, ЗА_ЧТО) VALUES (pИСТОРИЯ_ID, pНАКАЗАНИЕ_ID, pНАЗНАЧИЛ_ID, SYSDATE, pЗА_ЧТО) RETURNING КОГДА INTO pКОГДА;

END;

/

--назначение лечения

CREATE PROCEDURE AssignTreatment (pВРАЧ_ID NUMBER, pЛЕКАРСТВО_ID NUMBER, pИСТОРИЯ_ID NUMBER, pКОЛИЧЕСТВО NUMBER) AS

BEGIN

       INSERT INTO ЛЕЧЕНИЕ (ВРАЧ_ID, ЛЕКАРСТВО_ID, ИСТОРИЯ_ID, КОГДА, КОЛИЧЕСТВО) VALUES (pВРАЧ_ID, pЛЕКАРСТВО_ID, pИСТОРИЯ_ID, SYSDATE, pКОЛИЧЕСТВО);

END;

/

--добавление данных о пациенте

CREATE PROCEDURE AddDiseaseHistoryEntry (pДИАГНОЗ_ID NUMBER, pБОЛЬНОЙ_ID NUMBER, pID OUT NUMBER) AS

       num NUMBER;

       curDate DATE;

       excptIntersectOfTimeIntervals EXCEPTION;

BEGIN

       curDate := SYSDATE;

       --чтоб не оказалось, что человек болеет/болел, в промежуток времени, когда он УЖЕ это делал

       SELECT COUNT(ID) INTO num FROM ИСТОРИЯ_БОЛЕЗНЕЙ WHERE БОЛЬНОЙ_ID = pБОЛЬНОЙ_ID

               AND isTimeIntersected(curDate, NULL, ДАТА_ПОСТУПЛЕНИЯ, ДАТА_ВЫПИСКИ) = 1;

       IF num > 0 THEN RAISE excptIntersectOfTimeIntervals; END IF;

       INSERT INTO ИСТОРИЯ_БОЛЕЗНЕЙ (ДИАГНОЗ_ID, БОЛЬНОЙ_ID, ДАТА_ПОСТУПЛЕНИЯ, ОСМОТРЕВШИЙ_ID, ДАТА_ВЫПИСКИ) VALUES(pДИАГНОЗ_ID, pБОЛЬНОЙ_ID, curDate, NULL, NULL) RETURNING ID INTO pID;

EXCEPTION

       WHEN excptIntersectOfTimeIntervals THEN RAISE_APPLICATION_ERROR(-20010, 'Пересечение промежутков времени работы/болезни');