2016-10-18 2 views
1

Вот мой PostGreSQL кодСоздание функции Триггер PSQL «ошибка синтаксиса или вблизи„CREATE“»

CREATE FUNCTION connectedExhibitionFunction() 
RETURNS trigger AS 
$$ 
BEGIN 
     IF (SELECT COUNT("exName") FROM Exhibitions WHERE NEW."exName" = "exName") > 0 THEN 
       IF (SELECT Count(doorLoc1) FROM Doors, ExhibitionLocations WHERE (dorLoc1=NEW.elLocation AND dorLoc2=elLocations) OR (dorLoc2=NEW.elLocation AND dorLoc1=elLocations) > 0 THEN 
         RAISE EXCEPTION 'You can't have the exhibition there, the same exhibition is in an unconnected room'; 
       END IF; 
     END IF; 
END; 
$$ 
LANGUAGE plpgsql; 

CREATE TRIGGER connectedExhibitionTrigger 
     BEFORE INSERT 
     ON ExhibitionsLocations 
     EXECUTE PROCEDURE connectedExhibitionFunction(); 

И это ошибка я получаю

psql:file.txt:62: ERROR: syntax error at or near "CREATE" 
LINE 8: CREATE FUNCTION connectedExhibitionFunction() 
     ^
psql:file.txt:67: ERROR: current transaction is aborted, commands ignored until end of transaction block 

я не могу похоже, выяснили ошибку, может ли кто-нибудь что-нибудь здесь увидеть?

+1

Ошибка говорит 'LINE 8'. Я предполагаю, что в предложении перед ним отсутствует точка с запятой. –

+0

Это не на 100% ясно, что должен делать триггер, но, похоже, вы пытаетесь создать с ним уникальное ограничение. Почему бы просто не создать для этого уникальный индекс? И должен действительно научиться использовать явный оператор 'JOIN' вместо древних, устаревших и хрупких неявных объединений в предложении' where' –

ответ

2

Я думаю, вы пропустили. Выберите «)» и предложение об исключении исключений не может быть «не может». И вы можете использовать только END вместо END IF. Насколько я знаю, ваша проблема в этом.

Попробуйте это пожалуйста.

IF (SELECT Count(doorLoc1) FROM Doors, ExhibitionLocations 
    WHERE (dorLoc1=NEW.elLocation AND dorLoc2=elLocations) OR 
    (dorLoc2=NEW.elLocation AND dorLoc1=elLocations)) > 0 THEN 
    RAISE EXCEPTION 'You cant have the exhibition there, the same exhibition is in an unconnected room'; 
END 
1

Вы не должны использовать функцию count() для проверки на наличие данных, используйте команду PERFORM. Вы должны также RETURN NEW или RETURN NULL от функции триггера или ваша вставка не будет выполнена по определению. С некоторыми другими улучшениями вы получите следующее:

CREATE FUNCTION connectedExhibitionFunction() RETURNS trigger AS $$ 
BEGIN 
    PERFORM * FROM Exhibitions WHERE "exName" = NEW."exName"; 
    IF FOUND THEN 
     PERFORM * FROM Doors, ExhibitionLocations 
     WHERE (dorLoc1 = NEW.elLocation AND dorLoc2 = elLocations) 
      OR (dorLoc2 = NEW.elLocation AND dorLoc1 = elLocations); 
     IF FOUND THEN 
      RAISE EXCEPTION 'You can''t have the exhibition there, the same exhibition is in an unconnected room'; 
      RETURN NULL; -- Make the INSERT fail 
     END IF; 
    END IF; 
    RETURN NEW; -- Make the INSERT succeed 
END; 
$$ LANGUAGE plpgsql; 
Смежные вопросы