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
  

Mensagemem Qua, 07 Nov 2018 8:53 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


Código: Selecionar todos
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_MT       = 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_MT,
                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;
MarioMedeiros

Mensagemem Qui, 08 Nov 2018 1:47 pm

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.

Código: Selecionar todos
  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;
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Qui, 08 Nov 2018 3:30 pm

Boa tarde, valeu pela ajuda, segui seu modelo com os ajustes deu certo.
Pode ser encerrado o topico.
MarioMedeiros

Mensagemem Sex, 22 Fev 2019 7:04 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...

Código: Selecionar todos
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
carlynhos77

Mensagemem Ter, 26 Fev 2019 3:10 pm

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:
Código: Selecionar todos
select * from user_errors where type = 'TRIGGER'
where name='BI_LIC_PROCESSOS'
dr_gori
Localização: Portland, OR USA

Thomas F. G



Voltar para PL/SQL

Quem está online

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