Ajuda na trigger ao disparar gatilho

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
KATIA DIAS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 16 Mar 2006 8:48 pm
Localização: são PAULO

Bom dia a todos!

Alguém pode me dar uma dica? Seguinte:

Tenho esta estrutura JSON,, um campo string, que será inserido na tabela "Atualizar". Então toda vez que for inserido uma linha nesta tabela , quero disparar um gatilho chamando minha procedure que fara insert em algumas tabelas, certo? Estou quebrando cabeça, como eu faço, pois no momento do disparo do gatilho , eu quero passar o CNPJ que inclusive vem desta string, que será parâmetro da chamada da procedure....Eu tentei porém não esta dando certo. Se puderem ajudar agradeço...

---estrutura JSON------------

Selecionar tudo

'{
          "ID_PROCESSO"    : "301501",
          "ID_CLIETE"          : "PESSOA101",
          "CNPJ"                 : "000.000.001.20",
          "DSC_PROCESSO"   : "HOMOLOGAÇAO",
          "DSC_NOME"       : "Ricardo Santos",
         
         }');
--- tabela-----

Selecionar tudo

CREATE TABLE ATUALIZAR 
   (ID_PROCESSO   VARCHAR2(40) not null,
    JSON  CLOB not null,
   CONSTRAINT atualizar_pk PRIMARY KEY (id),
   CONSTRAINT atualizar_chk CHECK (Json IS JSON));
--- INSERT TABELA---

Selecionar tudo

BEGIN
INSERT INTO atualizar (id_processo, dta_insercao, status, json)
VALUES (atualiza_SEQ.nextval, sysdate, 'Inserido',
        '{
          "ID_PROCESSO"    : "PROP151",
          "ID_CLIETE"      : "PESSOA101",
          "CNPJ"           : "000.000.001.20",
          "DSC_PROCESSO"   : "HOMOLOGAÇAO",
          "DSC_NOME"       : "Ricardo Sanos",
         
         }');

	COMMIT;

END;
------------- triggers ideia----

Selecionar tudo

CREATE OR REPLACE TRIGGER ATUALIZAR
BEFORE UPDATE  OR INSERT ON ATUALIZAR
FOR EACH ROW
DECLARE
  v_CPF  varchar2(40);

BEGIN
  
 SELECT a.json.cpfj into v_CPF
    FROM  ATUALIZAR a WHERE id=(SELECT max(ID_PROCESSO) FROM ATUALIZAR  e);

  -- chama uma procedure passando os dados inseridos pra procedure.
   .PRC_ATUALIZA (v_CPF);
   
END;
Muito obrigada,

att,

Kátia Dias
KATIA DIAS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 16 Mar 2006 8:48 pm
Localização: são PAULO

--- Foi bagunçado esta parte acima da triggers------

Selecionar tudo

CREATE OR REPLACE TRIGGER ATUALIZAR
BEFORE UPDATE OR INSERT ON ATUALIZAR
FOR EACH ROW
DECLARE
v_CNPJ varchar2(40);
BEGIN
SELECT a.json.CNPJj into v_CNPJ
FROM ATUALIZAR a WHERE  ID_PROCESSO=(SELECT max(ID_PROCESSO) FROM ATUALIZAR e);

-- chama uma procedure passando os dados inseridos pra procedure.
.PRC_ATUALIZA (v_CNPJ);

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

Acho que isso deve estar dando Mutating Trigger, pois você está fazendo query na própria tabela.
Acredito que você deve utilizar os valores sendo inseridos/alterados diretamente, usando :new.SEUCAMPO.
Leia sobre os valores :old e :new dentro de triggers. Acho que é a peça que ta faltando pra você.
KATIA DIAS
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 16 Mar 2006 8:48 pm
Localização: são PAULO

Bom dia dr_gori!

Obrigada pela ajuda! Consegui resolver o problema criando estas duas triggers. 1 Insiro em uma tabela temporária e outra chamo a minha procedure.

Selecionar tudo

CREATE OR REPLACE TRIGGER TRG_PROCESSA_1
AFTER INSERT ON  ATUALIZAR
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
---Guarda o id na temporária
INSERT INTO TEMP_ID
VALUES(:NEW.id );

EXCEPTION

WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('código erro: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('descrição erro: ' || SQLERRM);

END RG_PROCESSA_1;

Selecionar tudo

CREATE OR REPLACE TRIGGER TRG_PROCESSA2
AFTER INSERT ON  ATUALIZAR
REFERENCING NEW AS NEW OLD AS OLD

declare
--Declarando variáveis
vtemp varchar2(40);
BEGIN
-- Busca o Número do CPF para parâmetro para chamada da procedure ---
SELECT a.dsc_json.num_cpf_cnpj
into vtemp
FROM ATUALIZACAO a
WHERE a.id=(SELECT e.id FROM temp_id e where e.id= a.id);

-- chama uma procedure passando os dados inseridos pra procedure.
PRC_ATUALIZAR(vtemp);

--Deleta a temporária a cada linha inserida na temp_id-----
DELETE FROM temp_id;

EXCEPTION

WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('código erro: ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('descrição erro: ' || SQLERRM);
EN DTRG_PROCESSA2;
Responder
  • Informação
  • Quem está online

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