2010-08-07 35 views
1

Je suis nouveau dans l'oracle et je ne sais pas ce qui ne va pas avec ce déclencheur:problème avec déclencheur dans l'oracle

CREATE OR REPLACE TRIGGER "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO" 
FOR EACH ROW 
WHEN (new."CASASCAL" IS NULL) 
BEGIN 
    SELECT PROPUESTA.CASAS 
    INTO :new."CASASCAL" 
    FROM PROPUESTA WHERE PROPUESTA.IDPROPUESTA=new.IDPROPUESTA ; 
END; 
/

Erreur:

PL/SQL: ORA-00904: "NEW"."IDPROPUESTA": identifider not valid

+2

Quel est le problème? Il message d'erreur que vous obtenez ... –

+0

@Leniel, quand je cours le sql est bien, mais quand j'insère une ligne dans la table, je reçois une erreur sur: le déclencheur 'MJVS.propuesta_casas' n'est pas valide .. – diegueus9

+0

quand j'ai compilé je reçois: a été trouvé EOF quand weit commencer fin de cas déclarer exit fin pour goto si boucle mod null pragma raise retour sélectionner mise à jour – diegueus9

Répondre

2

D'après ce que vous avez décrit:

Essayez de recompiler le déclencheur et voyez ce qui se passe ...

Un déclencheur devient invalide si l'objet de base (ex..table) devient es invalide ou altéré et le déclencheur fait référence à la table affectée.

+0

quand je compile je reçois: a été trouvé EOF quand weit commencer cas déclarer fin exception sortie pour goto if loop mod null pragma raise return sélectionnez la mise à jour – diegueus9

+0

Vous obtenez ce message précis? N'y a-t-il pas un code d'erreur ORA-XXX? –

+0

Il me manquait le stament END, mais maintenant c'est la nouvelle erreur: PL/SQL: ORA-00904: "NOUVEAU". "IDPROPUESTA": identificateur non valide – diegueus9

3

Vous ne savez pas pourquoi la réponse acceptée a été acceptée car ni elle ni les commentaires joints ne semblent résoudre le problème évident dans le code affiché.

Dans un corps de déclencheur, nous référencions des valeurs dans la ligne insérée avec le mot de code :NEW. Le code posté n'a pas le signe deux-points lorsqu'il référence la colonne dans la clause WHERE. C'est ce qui est nécessaire:

CREATE OR REPLACE TRIGGER "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO" 
FOR EACH ROW 
WHEN (new."CASASCAL" IS NULL) 
BEGIN 
    SELECT PROPUESTA.CASAS 
    INTO :new."CASASCAL" 
    FROM PROPUESTA 
    WHERE PROPUESTA.IDPROPUESTA=:new.IDPROPUESTA ; 
END; 
/

Soit dit en passant, attention à l'aide de minuscules guillemets doubles lors de la création d'objets.

Par défaut, tous les noms Oracle sont stockés dans le dictionnaire de données en majuscules, mais les instructions SQL ne sont pas sensibles à la casse. Ainsi, les deux suivants statments se réfèrent au même objet:

select * from emp 
/
select * from EMP 
/

Cependant, si nous créons notre objet avec un nom en majuscules ou minuscules minuscules et le mettre entre guillemets il est stocké dans le dictionnaire de données avec que cas exact. Cela signifie que nous devons utiliser ce cas précis chaque fois que nous référençons l'objet, entre guillemets. Donc, si nous avons créé une table avec tous les minuscules ...

create table "emp" ... 

... alors cette déclaration échouera:

select * from emp 
/

Il doit être

select * from "emp" 
/

Bien sûr, si nous avons déjà une table appelée EMP alors la première déclaration aurait réussi, si seulement aurait choisi d'une table différente.

Dans le cas des déclencheurs, nous ne les désignons généralement pas par leur nom. Mais nous devons utiliser le cas chaque fois que nous recherchons le déclencheur dans le dictionnaire de données:

select status 
from user_triggers 
where trigger_name = 'propuesta_casas' 
/