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, 'Пересечение промежутков времени работы/болезни');
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.