Pergunta

Sou novo no Oracle e não sei o que há de errado com este gatilho:

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

Erro:

PL/SQL: ORA-00904: "NOVO". "IDPROPUESTA": Identifider não é válido

Foi útil?

Solução

Pelo que você descreveu:

Tente recompilar o gatilho e ver o que acontece ...

Um gatilho se torna inválido se o objeto base (ex..table) se tornar inválido ou alterado e o gatilho refere -se à tabela afetada.

Outras dicas

Não sei por que a resposta aceita foi aceita, pois nem os comentários em anexo parecem abordar a questão óbvia no código publicado.

Em um corpo de gatilho, fazemos referência a valores na linha inserida com o :NEW palavra word. O código postado carece do cólon quando faz referência à coluna na cláusula WHERE. Isso é o que é necessário:

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

Aliás, cuidado com o uso de minúsculas em cotações duplas ao criar objetos.

Por padrão, todos os nomes do Oracle são armazenados no dicionário de dados no caso superior, mas as instruções SQL são insensíveis ao caso. Portanto, as duas instruções a seguir se referem ao mesmo objeto:

select * from emp
/
select * from EMP
/

No entanto, se criarmos nosso objeto com um nome em estojo misto ou minúscula e o colocarmos em citações duplas, ele é armazenado no dicionário de dados com Esse caso exato. Isso significa que temos que usar esse caso exato sempre que fazemos referência ao objeto, em cotações duplas. Então, se criamos uma tabela com todas as minúsculas ...

create table "emp"  ...

... então esta declaração falhará:

select * from emp
/

Tem que ser

select * from "emp"
/

Obviamente, se já tivéssemos uma tabela chamada EMP, a primeira declaração teria sido bem -sucedido, se tivesse apenas selecionado em uma tabela diferente.

No caso de gatilhos, geralmente não nos referimos a eles pelo nome. Mas temos que usar o caso sempre que procuramos o gatilho no dicionário de dados:

select status
from user_triggers
where trigger_name = 'propuesta_casas'
/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top