À l'aide de if EXISTS (SELECT ...) dans un AVANT déclencheur d'INSERTION (Oracle)

Le code que j'ai ne fonctionne pas, Oracle me dit que le déclencheur a été créé pour les erreurs de compilation. Apparemment je ne peux pas obtenir tout renseignements plus précis sur ce que l'erreur de build est...

Je n'ai pas fait beaucoup de SQL avant, donc je ne suis pas familier avec la syntaxe. J'ai un pressentiment que c'est mon if EXISTS (SELECT ...) ENSUITE relevé que l'Oracle n'aime pas, j'ai cherché sur Google pour des exemples de ce genre, mais je ne pouvais pas vraiment trouver quelque chose qui a fonctionné dans mon cas.

Donc sur le code:

  • "débuts" est un attribut de date (début)
  • "fin" est un autre attribut de date (fin)
  • Je veux assurez-vous que la NOUVELLE ligne dates ne se chevauchent pas avec toute autre ligne dans le tableau si ces 2 lignes ont la même "numInfirmier" attribut.
  • Donc je sélectionne toutes les lignes qui ont le même numInfirmier que la NOUVELLE ligne et les dates se chevauchent.
  • Et SI quelque chose EXISTE dans que choisir, je lève une erreur.
    CREATE OR REPLACE TRIGGER chev_surv
    BEFORE INSERT OR UPDATE ON surveillance
    FOR EACH ROW
    BEGIN
        IF EXISTS (
            SELECT * FROM surveillance
            WHERE surveillance.numInfirmier = :NEW.numInfirmier
            AND ((surveillance.debut > :NEW.debut AND surveillance.debut < :NEW.fin)
            OR (surveillance.fin > :NEW.debut AND surveillance.fin < :NEW.fin))
        ) THEN
            RAISE_APPLICATION_ERROR(-20001,
            'Il ne doit pas y avoir de chevauchement entre deux périodes surveillance pour un surveillant.');
        END IF;
    END;
    /

Aucune idée de quel est le problème?

Vous pouvez obtenir des renseignements plus précis sur les erreurs réelles avec show errors si votre client prend en charge, ou select * from user_errors where type = 'TRIGGER' and name = 'CHEV_SURV'. Qui est disponible pour toutes stockées PL/SQL. Vous avez raison, vous ne pouvez pas utiliser exists à l'extérieur d'un select condition. Mais même si vous l'obtenez à compiler, vous obtiendrez une mutation erreur de table: vous ne pouvez pas interroger la table le déclencheur est contre.
Ah la vache, c'est une bonne chose à savoir XD
"afficher l'erreur", dit je ne peux utiliser "EXISTE" dans une instruction SQL.... wut?
Vous essayez de l'utiliser dans une PL/SQL contexte; c'est une autre (bien que souvent se chevauchent) de la langue. Vous pouvez utiliser seulement dans une sous-requête, comme select ... from ... where exists (select ... from ...). Justin réponse vous montre comment vous devez vérifier dans ce cas, et pourquoi cela ne fonctionne toujours pas *8-)

OriginalL'auteur MademoiselleC | 2014-03-28