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.