Pregunta

Soy nuevo en Oracle y no sé lo que está mal con este disparador:

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

Error:

  

PL / SQL: ORA-00904:. "NUEVO" "IDPROPUESTA": identifider no válida

¿Fue útil?

Solución

A partir de lo que usted describe:

Trate de volver a compilar el gatillo y ver qué pasa ...

Un disparador se convierte en no válida si el objeto base (ex..table) se convierte en no válida o alterado y el gatillo se refiere a la tabla afectada.

Otros consejos

No sé por qué la respuesta aceptada ha sido aceptada como ni él ni los comentarios adjuntos parecen abordar la cuestión obvia en el código publicadas.

En un cuerpo de activador que los valores de referencia de la fila insertada con la palabra código :NEW. El código Posteado carece de los dos puntos cuando se hace referencia a la columna en la cláusula WHERE. Esto es lo que se necesita:

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

A propósito, cuidado con el uso de caja inferior entre comillas dobles cuando la creación de objetos.

Por defecto, todos los nombres de Oracle se almacenan en el diccionario de datos en mayúsculas, pero las sentencias SQL son sensibles a mayúsculas. Así que la siguiente statments dos se refieren al mismo objeto:

select * from emp
/
select * from EMP
/

Sin embargo, si creamos nuestro objeto con un nombre en mayúsculas y minúsculas o en minúsculas y lo ponemos entre comillas dobles que se almacena en el diccionario de datos con ese caso exacta . Esto significa que tenemos que utilizar ese caso exacto cada vez que hacen referencia al objeto, entre comillas dobles. Así que si creamos una tabla con todas las letras minúsculas ...

create table "emp"  ...

... entonces esta declaración se producirá un error:

select * from emp
/

Tiene que ser

select * from "emp"
/

Por supuesto, si ya tenemos una tabla llamada EMP entonces la primera declaración habría tenido éxito, si solo hubiera seleccionado de una tabla diferente.

En el caso de los disparadores por lo general no se refieren a ellos por su nombre. Pero tenemos que utilizar el caso cuando miramos hacia arriba el gatillo en el diccionario de datos:

select status
from user_triggers
where trigger_name = 'propuesta_casas'
/
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top