2009-11-04 7 views
4

J'ai un problème avec la compilation d'un déclencheur Oracle via SQL * PLUS - Je ne pense pas être stupide mais je ne vois pas quel est le problème. Nous avons un script d'installation qui est essentiellement un fichier batch qui crée/actualise tous les objets de la base de données en appelant SQLPLUS sur plusieurs scripts, chacun contenant une vue, un déclencheur, etc. Les tables et les vues sont créées en premier, puis puis déclenche. La vue V_BS_GRIDFIELDS ci-dessous peut ou ne peut pas être créée à ce stade, ou peut être créée ultérieurement par un processus différent. La vue est une vue actualisable, nous avons donc un déclencheur placé sur elle pour pousser les mises à jour à des tables différentes, comme ci-dessous:Erreur de compilation du déclencheur Oracle Pl/SQL via SQL * PLUS

CREATE OR REPLACE FORCE TRIGGER TR_INSTUPD_BS 
    INSTEAD OF INSERT OR UPDATE OR DELETE 
    ON V_BS_GRIDFIELDS 
FOR EACH ROW 
BEGIN 

    IF INSERTING OR DELETING THEN 
    NULL; 
    END IF; 

    IF UPDATING THEN 
    -- Can only change these fields 
    IF (:OLD.VISIBLE <> :NEW.VISIBLE) OR (:OLD.COMPULSORY <> :NEW.COMPULSORY) THEN 

     -- Source Table = BS_GRIDFIELDS 
     IF (:OLD.SOURCE_TYPE = 0) THEN 

     UPDATE BS_GRIDFIELDS BS_GF 
      SET BS_GF.VISIBLE = :NEW.VISIBLE, 
       BS_GF.COMPULSORY = :NEW.COMPULSORY 
     WHERE BS_GF.FIELD_NAME = :OLD.FIELD_NAME; 

     END IF; 
    END IF; 
    END IF; 
END; 

Le problème est que Oracle SQL * PLUS semble arrêter la compilation de la gâchette après la première ébauche ligne, ligne 6:

SQL> @"TR_INSTUPD_BS.sql"; 
SP2-0734: unknown command beginning "IF INSERTI..." - rest of line ignored. 
SP2-0042: unknown command "NULL" - rest of line ignored. 
SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0734: unknown command beginning "IF UPDATIN..." - rest of line ignored. 
SP2-0044: For a list of known commands enter HELP 
and to leave enter EXIT. 
SP2-0734: unknown command beginning "IF (:OLD.V..." - rest of line ignored. 
SP2-0734: unknown command beginning "IF (:OLD.S..." - rest of line ignored. 
SP2-0552: Bind variable "OLD" not declared. 
SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0042: unknown command "END" - rest of line ignored. 
SP2-0044: For a list of known commands enter HELP 
and to leave enter EXIT. 

Si vous supprimez la ligne vide sur la ligne 6, il semble arrêter la compilation au premier point-virgule, sur la ligne 7:

SQL> @"TR_INSTUPD_BS.sql"; 

Warning: Trigger created with compilation errors. 

SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0734: unknown command beginning "IF UPDATIN..." - rest of line ignored. 
SP2-0734: unknown command beginning "IF (:OLD.V..." - rest of line ignored. 
SP2-0734: unknown command beginning "IF (:OLD.S..." - rest of line ignored. 
SP2-0552: Bind variable "OLD" not declared. 
SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0042: unknown command "END IF" - rest of line ignored. 
SP2-0042: unknown command "END" - rest of line ignored. 
SP2-0044: For a list of known commands enter HELP 
and to leave enter EXIT. 
SQL> 

Nous avons beaucoup de déclencheurs cr de cette manière, et tous ont des espaces, des points-virgules, etc., et sont créés correctement. J'ai testé et vu le même problème sur Oracle 9, 10, 11. Quelqu'un peut-il faire la lumière sur cela?

Merci.

Répondre

5

dans son paramètre par défaut SQL * Plus ne traitera pas correctement avec des lignes vides, vous devez taper la commande suivante:

SQL> SET SQLBLANKLINES on 

Voir this other SO.

Mise à jour: J'ai répondu trop vite, la ligne vide ne semble pas être le problème ici. J'ai essayé votre code sur ma base de données et le problème semble provenir du mot-clé FORCE. Le 10gR2 documentation ne mentionne pas ce mot clé. Le déclencheur se compile lorsque vous le supprimez.

+0

Merci pour l'aide, mais nous avons essayé cela plus tôt, un peu après ma publication ici, et cela n'a pas fait de différence. Comme je l'ai mentionné ci-dessus, il existe plusieurs déclencheurs créés de la même manière, chacun avec des lignes vides et des points-virgules, et le déclencheur ci-dessus est le seul affecté de cette manière. Nous avons également essayé 'SET SQLT ';' 'pour voir si c'était le problème en ce qui concerne les points-virgules, mais encore une fois, aucun effet :( – Kieran

+0

@Kieran: J'ai mis à jour la réponse: le problème semble être le mot-clé FORCE ici –

+0

Intéressant! Je n'avais pas considéré cela, mais je suis d'accord que cela semble être le problème.Etrange quand on utilise le développeur PL/SQL, ce déclencheur compile avec ou sans le mot clé FORCE - c'est pourquoi je n'y ai pas pensé Merci :) – Kieran

Questions connexes