Sql Trigger Trouble - PullRequest
       8

Sql Trigger Trouble

1 голос
/ 02 июня 2010

Эй, ребята, я не могу заставить этот триггер сработать, я работал над ним в течение часа или около того и не могу понять, где я иду не так, любая помощь будет оценена

CREATE OR REPLACE TRIGGER allergy

 BEFORE INSERT ON   

 DECLARE 
 med VARCHAR2(20);

 BEGIN

 SELECT  v.medication RCD.specify
 INTO  med
 FROM  visit v, relcondetails RCD
 WHERE :new.medication = v.medication AND RCD.specifiy = 'allergies';

 IF med = allergies THEN
  RAISE_APPLICATION_ERROR(-20000, 'Patient Is alergic to this medication');
 END IF;
END allergy;

Когда введено в оракул

ОШИБКА в строке 6: ORA-04079: недействительно спецификация триггера

Ответы [ 4 ]

8 голосов
/ 03 июня 2010
CREATE OR REPLACE TRIGGER allergy BEFORE INSERT ON   

название таблицы здесь

FOR EACH ROW -- forgot this too

DECLARE 
    med VARCHAR2(20);

Вы действительно должны объявить это как% type.

    med visit.medication%type;

 BEGIN

 SELECT  v.medication RCD.specify

Требуется запятая между столбцами

    INTO  med

Для двух столбцов нужны две переменные

    FROM  visit v, relcondetails RCD
    WHERE :new.medication = v.medication AND RCD.specifiy = 'allergies';

У вас нет условий соединения двух таблиц, это очень плохо. Этот запрос выполнит декартову шкалу между двумя таблицами, а затем вернет все из них, у которых есть «аллергии» и: new.medication в соответствующих столбцах.

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

  IF med = allergies THEN

Я не знаю, что / аллергии / есть в этом ЕСЛИ. Нет такой переменной, которая определена как таковая, и без кавычек это не строка.

    RAISE_APPLICATION_ERROR(-20000, 'Patient Is alergic to this medication');

Это сообщение об ошибке подтверждает то, что я сказал по поводу вашего запроса. Вы думаете, что запрашиваете одного пациента, но это не так.

  END IF;
END allergy;

Серьезно, если вы пишете программное обеспечение, чтобы уберечь человека от приема потенциально опасных для жизни лекарств, подумайте о другой сфере деятельности. Клянусь, я не говорю, что это грубо, но ваш пример кода почти не понимает язык pl / sql, sql или какой-либо кусочек программирования. Я думаю, что вы начали с некоторого примера кода и пытались изменить его во что-то. Но ты действительно остался с тарабарщиной. Я начинаю думать, что это домашнее задание.

2 голосов
/ 02 июня 2010

В дополнение к точке Марка о том, что вам не хватает имени таблицы, и точке зрения Мартина о том, что вы хотите, чтобы это был триггер уровня строки, ваше фактическое тело не будет компилироваться по двум причинам.

  • Похоже, вы пытаетесь выбрать два столбца, но между ними нет запятой, и в предложении INTO есть только одна локальная переменная
  • Вы используете идентификатор allergies, который нигде не объявлен.

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

1 голос
/ 02 июня 2010
BEFORE INSERT ON <TABLE NAME>

и зачем выбирать v.medication и RCD.specify, когда вы выбираете только одну переменную?

0 голосов
/ 02 июня 2010

Вы, наверное, видели это, но: http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

CREATE TRIGGER TriggerName
ON MyTableName
FOR MyEvent
AS
     -- My Trigger Logic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...