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.
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
@Kieran: J'ai mis à jour la réponse: le problème semble être le mot-clé FORCE ici –
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