2016-02-29 3 views
1

Oracle 12c.Ограничение ввода данных на основе количества экземпляров в таблице

В настоящее время у меня есть таблица для проведения посещений пациентов, содержащих идентификатор врача, идентификатор пациента и данные/время посещения.

Я хотел бы создать ограничение, которое при вводе данных проверяет, имеет ли конкретный врач 5 назначений в этот заданный день. Если у врача есть 5 назначений, дополнительное назначение не может быть добавлено.

Есть ли способ сделать это, кроме использования хранимой процедуры для входа?

Если я должен был использовать хранимая процедура (в отличие от проблем, связанных с триггером, объявляющих переменную), я получаю следующую ошибку: Ошибка (4,8): PLS-00103: Обнаружен символ «ОБНОВЛЕНИЕ» при ожидании одного из следующего:: =. (@%;.? Не нулевой диапазон символов по умолчанию

Я уверен, если это потому, что я не могу использовать перед обновлением на процедуры Есть мысли

CREATE OR REPLACE PROCEDURE doc_apt_limit_5 
IS 
v_visit_count 
BEFORE UPDATE OR INSERT ON aa_patient_visit 
FOR EACH ROW 
BEGIN 
SELECT (COUNT(*)) INTO v_visit_count 
FROM aa_patient_visit 
WHERE physid = :NEW.physid 
GROUP BY physid, visittime; 
IF v_visit_count > 4 THEN 
RAISE_APPLICATION_ERROR(-20001, 'physician is fully booked  on  this date'); 
END IF; 
END; 
+2

Триггер кажется естественные решения, но это в основном та же идея. –

+0

Я думаю, что это, наверное, лучший маршрут. Я пробовал делать это с помощью процедуры, так как у меня возникли проблемы с объявлением переменной с помощью моего триггера, однако получаю сообщение об ошибке. добавил это к моему оригинальному сообщению. Спасибо gain – Ian

+0

До (или после) только для триггеров, а не для процедур. Объявление переменной в триггере не является проблемой. Попытка принудительного применения такого ограничения связана, однако, из-за параллелизма (две вставки/обновления в то же время не могут видеть друг друга), если вы каким-то образом не сериализуете и не изменяете проблемы с таблицей. В любом случае это похоже на странное ограничение - количество назначений довольно заполнено назначенными слотами. –

ответ

0

Go with trigger. Probably the best solution in this scenario.

CREATE OR REPLACE TRIGGER doc_apt_limit_5 BEFORE 
    UPDATE OR 
    INSERT ON aa_patient_visit FOR EACH ROW 
    DECLARE v_visit_count PLS_INTEGER; 
    BEGIN 
    SELECT COUNT(*) 
    INTO v_visit_count 
    FROM aa_patient_visit 
    WHERE physid = :NEW.physid 
    GROUP BY physid, 
     visittime; 
    IF v_visit_count > 4 THEN 
     RAISE_APPLICATION_ERROR(-20001, 'physician is fully booked  on  this date'); 
    END IF; 
    END; 
+0

Как вы будете иметь дело с одновременными вставками/обновлениями, которые не могут видеть изменения друг друга? И мутирующие ошибки таблицы? –

+0

@Alex: Переходим с триггером уровня инструкции, чем уровень строки, как показано на рисунке. –