Pergunta

Isto é o que eu tenho atualmente:

CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER INSERT ON SOMETABLE
FOR EACH ROW    

DECLARE
 v_emplid varchar2(10);    

BEGIN
 SELECT
  personnum into v_emplid
 FROM PERSON
 WHERE PERSONID = :new.EMPLOYEEID;

dbms_output.put(v_emplid);

/* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values from the trigger table*/

END MYTRIGGER;    

DBA_ERRORS tem este erro: PL / SQL: ORA-00923: DA palavra-chave não encontrado onde esperado

Foi útil?

Solução

1) Deve haver algo mais para o seu exemplo, porque essa certeza parece funcionar para mim

SQL> create table someTable( employeeid number );

Table created.

SQL> create table person( personid number, personnum varchar2(10) );

Table created.

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER MYTRIGGER
  2    AFTER INSERT ON SOMETABLE
  3    FOR EACH ROW
  4  DECLARE
  5   v_emplid varchar2(10);
  6  BEGIN
  7   SELECT personnum
  8     into v_emplid
  9     FROM PERSON
 10    WHERE PERSONID = :new.EMPLOYEEID;
 11    dbms_output.put(v_emplid);
 12    /* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values
 from the trigger table*/
 13* END MYTRIGGER;
 14  /

Trigger created.

SQL> insert into person values( 1, '123' );

1 row created.

SQL> insert into sometable values( 1 );

1 row created.

2) Você provavelmente quer declarar V_EMPLID como sendo do tipo Person.PersonNum% TYPE para que você possa ter certeza de que o tipo de dados está correto e de modo que se o tipo de dados da tabela muda você não vai precisar alterar seu código.

3) Eu suponho que você sabe que seu gatilho não pode consultar ou atualizar a tabela na qual o gatilho está definido (por isso há consultas ou inserções em SomeTable).

Outras dicas

Você está jogando com Lava (não apenas fogo) no seu gatilho. DBMS_OUTPUT em um gatilho é muito, muito ruim. Você pode fundir-out em um buffer overflow no seu gatilho e toda a transação é tiro. Boa sorte rastreamento que para baixo. Se você deve fazer output-se console como comportamento, invocar um procedimento de transação autônoma que grava em uma tabela.

Os gatilhos são muito mal. Eu costumava como eles, mas eles são muito difíceis de lembrar sobre. Eles afetam os dados muitas vezes levando a dados mutação (assustador e não apenas porque o Dia das Bruxas está perto).

Nós usamos gatilhos para alterar o valor de colunas como .new: LAST_MODIFIED: = sysdate e .new: LAST_MODIFIED_BY: = usuário. É isso.

Nunca permitir que um gatilho para impedir que uma transação seja concluída. Encontrar outra opção.

Eu não usaria uma instrução select em um gatilho nunca. Inserir na tabela em vez de um select into. Uma vez que a tabela já existe select into não funciona na maioria dos bancos de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top