Domanda

Sono nuovo in Oracle e non so che cosa è sbagliato con questo trigger:

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;
/

Errore:

  

PL / SQL: ORA-00904:. "NEW" "IDPROPUESTA": identifider non validi

È stato utile?

Soluzione

Da quello che hai descritto:

Provare a ricompilare il grilletto e vedere cosa succede ...

Un trigger è valida se l'oggetto base (ex..table) diventa valida o alterata e il grilletto fa riferimento alla tabella interessata.

Altri suggerimenti

Non certo perché la risposta accettata è stata accettata come né essa né i commenti allegati sembrano affrontare la questione evidente nel codice distaccati.

In un trigger che valori di riferimento nella riga inserita con la parola di codice :NEW. Il codice Ripubblicato manca il colon quando si fa riferimento alla colonna nella clausola WHERE. Questo è ciò che è necessario:

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;
/

Tra l'altro, quando si usa minuscole tra virgolette durante la creazione degli oggetti.

Per impostazione predefinita tutti i nomi di Oracle sono memorizzate nel dizionario dei dati in maiuscolo, ma le istruzioni SQL sono case insensitive. Così il seguente due statments si riferiscono allo stesso oggetto:

select * from emp
/
select * from EMP
/

Tuttavia, se creiamo il nostro oggetto con un nome in caso misto o minuscolo e metterlo tra virgolette è memorizzato nei dati dizionario con questo caso esatto . Questo significa che dobbiamo utilizzare quel caso esatto ogniqualvolta riferimento all'oggetto, tra virgolette. Quindi, se abbiamo creato una tabella con tutte minuscolo ...

create table "emp"  ...

... allora questa affermazione fallirà:

select * from emp
/

Deve essere

select * from "emp"
/

Naturalmente se abbiamo già un tavolo chiamato EMP quindi la prima istruzione sarebbe riuscito, se sarebbe solo stata selezionata da una tabella diversa.

Nel caso di trigger che in genere non si riferiscono a loro per nome. Ma dobbiamo usare il caso ogni volta che guardiamo il grilletto nel dizionario dei dati:

select status
from user_triggers
where trigger_name = 'propuesta_casas'
/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top