Oracle
 sql >> Base de données >  >> RDS >> Oracle

erreur de déclencheur invalide

Ok, je vais poster ceci comme réponse car les commentaires ne permettront pas autant de texte.

En voyant vos tables, certaines choses ne sont toujours pas claires. votre fonction ADD_PACIENTE_QUARTO implémente un SELECT instruction qui énonce le prédicat Where PAC = CONT mais PAC n'est pas dans PACIENTE mais est plutôt la variable locale où vous stockez votre résultat et CONT est votre paramètre, ce que vous avez essayé n'est pas clair.

Maintenant, votre déclencheur présente des défauts de logique et d'implémentation.

Tout d'abord, le nom de votre déclencheur est PACIENTE_TRIGGER mais la ligne INSERT OR UPDATE ON TIPO_QUARTO me dit que c'est sur le TIPO_QUARTO table, ce n'est pas un problème de syntaxe, mais logiquement, cela peut être pénible pour quelqu'un qui essaie de déterminer à quelle table appartient le déclencheur.

Ensuite, utilisez INSERT OR UPDATE OF TIPO ON TIPO_QUARTO pour surveiller les insertions ou mettre à jour les modifications uniquement dans la colonne TIPO de TIPO_QUARTO tableau.

Maintenant cette ligne If :new.TIPO_QUARTO = 'UTI' then , en supposant que ce déclencheur est attaché à TIPO_QUARTO table, cette table n'a pas de colonne nommée TIPO_QUARTO changez-le en :new.TIPO .

Ensuite, PAC est de type VARCHAR donc je ne sais pas ce que vous essayez de faire dans PAC := PAC - :new.TIPO; et dans PAC := PAC + :new.TIPO; les deux lignes renverront invalid number exception car vous ne pouvez pas ajouter ou soustraire des chaînes, peut-être que votre intention était de concaténer ou d'obtenir une sous-chaîne.

Et enfin l'appel à UPDATE TIPO_QUARTO SET TIPO = PAC à l'intérieur d'un déclencheur pour TIPO_QUARTO entraînera la mutating table exception, vous ne pouvez pas interroger/mettre à jour une table qui se trouve au milieu d'une instruction DML (INSERT ou UPDATE dans ce cas) pour résoudre ce problème, vous pouvez simplement attribuer :new.TIPO := PAC .

Prenez soin de ces détails et peut-être alors votre problème ne sera plus.