Trigger como ler uma tabela e gravar em outras duas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
MarioMedeiros
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 15 Jun 2018 7:22 pm

Boa noite galera, estou com um probleminha na trigger abaixo, ela é bem simples:
-> Tenho campo ID_NOTA é concatenado nf+serie+cnpj
> neste registro que esta sendo atualizado através deste ID_NOTA eu preciso de informação de outro campo NROCTO qual erá usado para dar baixa em outra tabela GT_CTO, e por fim concatenando os ID_NOTA + NROCTO farei a inserção na tabela Histórico.
A maior dificuldade esta sendo em como pegar este campo NROCTO justamento do registro que esta sendo atualizado via ID_NOTA, como não consegui fiz este mesclado update tabela GT_CTO e select na tabela GT_NOTAs tudo junto, e na sequencia faço insert na tabela de histórico.
A principio poderá funcionar, mas ocorre os 2 erros abaixo, já mudei os encerramentos de linhas para varias posições e em cada uma delas da erros diferentes,
De acordo com as mensagens são erros claros mas por falta de experiencia não estou encontrando.


Desde já agradeço a ajuda.

Mário Medeiros



Os erros são:
Erro(19,9): PL/SQL: SQL Statement ignored
Erro(20,13): PL/SQL: ORA-00933: comando SQL não encerrado adequadamente

Selecionar tudo

create or replace TRIGGER TRG_BXCTO_HISTO 
AFTER INSERT OR UPDATE ON TB_INFOGED
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW

BEGIN
    UPDATE GT_NOTAS SET 
           NT_DT_ENT       = :NEW.DATA_RECEBIMENTO,
           NT_DT_LANCAM    = TO_DATE(TO_CHAR(systimestamp, 'DD/MM/YYYY HH24:MI:SS'), 'DD/MM/YYYY HH24:MI:SS'), 
           NT_OBSENT1      = :NEW.OCORRENCIA,
           NT_SIGLA_DT_ENT = 'INF',
           NT_POSICAO      = '5',
           NT_USER_ENT     = 'INFOGED',
           NT_FLG_muito       = 0
    WHERE NT_POSICAO <> 3 AND NT_NEY = :NEW.ID_NOTA;

----------------------------------------------------------------------------------------------------------------------------

    IF :NEW.ID_NOTA IS NOT NULL THEN
        UPDATE GT_CTO SET DS_POSICAO = "3", DS_PE_TIPO = :NEW.OCORRENCIA
            SELECT NT_NUMCTO FROM GT_NOTAS
				WHERE GT_NOTAS.NT_CGCREM = Substr(:NEW.ID_NOTA,((Length(:NEW.ID_NOTA) - 14) + 1), 14)
                   AND GT_NOTAS.NT_SERIE = Substr(:NEW.ID_NOTA,((Length(:NEW.ID_NOTA) - 17) + 1), 3)
                    AND GT_NOTAS.NT_NOTA = Substr(:NEW.ID_NOTA,((Length(:NEW.ID_NOTA) - 17) + 1), 3)
        WHERE GT_CTO.DS_NO_CON = GT_NOTAS.NT_NUMCTO;

        INSERT INTO GT_HISTO (
                HI_KEY,
                HI_CTO,
                HI_DATA,
                HI_TIPO,
                HI_DATA_EV,
                HI_OCORRENCIA,
                HI_DESCR,
                HI_FLG_muito,
                HI_FLG_WEB,
                HI_HORA,
                HI_USUARIO,
                HI_STATUS,
                HI_HR,
                HI_CGCREM,
                HI_ORIGEM)
            VALUES (:NEW.ID_NOTA,
                'ACERTAR999',
                to_char(sysdate, 'dd/mm/yyyy'),
                1,
                to_char(sysdate, 'dd/mm/yyyy'),
                :NEW.OCORRENCIA,
                FUNC_OCORRENCIA(:NEW.OCORRENCIA),
                '0',
                '0',
                to_char(sysdate, 'hh24:mm'),
                'TRIGGER',
                90,
                to_char(sysdate, 'hh24:mm'),
                Substr(:NEW.ID_NOTA,((s_tam - 14)+ 1), 14),
                0);
    END IF;
END;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá,

Cara no trecho abaixo existem seguintes partes que destaco:
SET DS_POSICAO = "3", --- DEVERIA SER '3'
e
SELECT NT_NUMCTO
FROM GT_NOTAS


Este último está fora de parenteses, sem INTO, não entendi para que ele serve. Se ele tem a ver com o UPDATE ou não.

Selecionar tudo

  IF :NEW.ID_NOTA IS NOT NULL THEN
    UPDATE GT_CTO
       SET DS_POSICAO = "3",  ---  DEVERIA SER '3'
           DS_PE_TIPO = :NEW.OCORRENCIA
                         SELECT NT_NUMCTO  --Para que esse select??
                           FROM GT_NOTAS
                          WHERE GT_NOTAS.NT_CGCREM =
                                Substr(:NEW.ID_NOTA,
                                       ((Length(:NEW.ID_NOTA) - 14) + 1),
                                       14)
                            AND GT_NOTAS.NT_SERIE =
                                Substr(:NEW.ID_NOTA,
                                       ((Length(:NEW.ID_NOTA) - 17) + 1),
                                       3)
                            AND GT_NOTAS.NT_NOTA =
                                Substr(:NEW.ID_NOTA,
                                       ((Length(:NEW.ID_NOTA) - 17) + 1),
                                       3)
                          WHERE GT_CTO.DS_NO_CON = GT_NOTAS.NT_NUMCTO;
MarioMedeiros
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 15 Jun 2018 7:22 pm

Boa tarde, valeu pela ajuda, segui seu modelo com os ajustes deu certo.
Pode ser encerrado o topico.
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

ola, boa noite...

Estou tentando copiar dados de uma tabela para outra, porem não esta dando certo... peguei esse exemplo e adaptei com meus campos...

Selecionar tudo

INSERT INTO LIC_PROCESSOS
(CODIGO, ANO, NR_PROCESSO)
SELECT ID_CODIGO, ANO, NR_PROC FROM LIC_LICITACAO;
Um detalhe, to em dúvida se a tabela de DESTINO precisa ter os mesmos campos da tabela de ORIGEM, porq no meu caso, minha tabela ORIGEM tem uns 30 campos, porém eu so preciso copiar 3 campos...

A ordem dos campos estão corretos, o tipo de dados do campo são os mesmos (numero com numero)

aparentemente esta correto, porém me aparece a seguinte mensagem:

ORA-04098: gatilho 'INFO_ADMINISTRATIVO.BI_LIC_PROCESSOS' é inválido e a revalidação falhou


alguém pode me ajudar, mostrar o q há d errado.... agradeço
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Parece que esse trigger ta gerando algum erro.
Cada vez que você tenta inserir o dado na tabela, o oracle tenta compilar e não consegue.
Tente recompilar o gatilho pra ver se tem algum erro.

Dá pra ver o que está dando por esse select também:

Selecionar tudo

select * from user_errors where type = 'TRIGGER'
where name='BI_LIC_PROCESSOS'
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes