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


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



Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Majestic-12 [Bot] e 6 visitantes

cron