Trigger mutante

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
rvneto99
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 26 Dez 2013 7:49 am

Bom Dia

Estou usando banco de dados Oracle, e preciso criar uma trigger em uma tabela que irá excluir outros registros dela mesmo.

Por exemplo, eu tenho uma tabela de solicitações (CS_SOLICITACOES), e uma solicitação pode conter vários textos (CS_SOL_TEXTOS). Essa solicitação normal pode ter uma outra atrelada a ela, então quando eu incluo um texto na solicitação normal esse texto deve ser replicado na solicitação atrelada a ela também. Se eu alterar um dos textos da solicitação normal, deverá alterar também na outra.

O problema é que eu posso ter varios textos na solicitação normal, e eu não tenho como relacionar um por um com os textos da outra, ou seja minha idéia era excluir todos os textos da outra que tem relação com essa solicitação normal, e depois buscar os textos na CS_SOLICITACOES de novo e dar um insert, contudo tenho o problema de trigger mutante. Uma idéia seria criar uma trigger statement, alguém poderia me ajudar?

Aqui vai o exemplo da minha trigger:

Selecionar tudo

CREATE OR REPLACE TRIGGER CSSOLT_MELHORIA_TG
   AFTER UPDATE OR DELETE
   ON CS_SOL_TEXTOS
   FOR EACH ROW
   /* 4.000 */

DECLARE

   wcod_emp             NUMBER(3);
   wnum_sol_patch       NUMBER(10);
   wcod_maq_sol_patch   NUMBER(4);
   wseq_sol_patch       NUMBER(3);
   wcod_texto           NUMBER;
   wseq_texto           NUMBER;

BEGIN
   IF nl_expurgo_pb.get_expurgo = 1 THEN
      RETURN;
   END IF;

   wcod_texto := ge_pars_sistema_sp (wcod_emp, 0, 'Solicitacoes', 9);

   /* Busca informações sobre a sol. guarda-chuva */
   BEGIN
      SELECT cod_emp
           , num_sol_patch
           , cod_maq_sol_patch
           , seq_sol_patch
        INTO wcod_emp
           , wnum_sol_patch
           , wcod_maq_sol_patch
           , wseq_sol_patch
        FROM cs_solicitacoes
       WHERE num_solicitacao = :NEW.num_solicitacao
         AND cod_maq_sol     = :NEW.cod_maq_sol
         AND seq_solicitacao = :NEW.seq_solicitacao;
   END;

   /* Se o código do texto for o mesmo do parâmetro e tiver sol. guarda-chuva executa */
   IF wcod_texto = :NEW.cod_texto AND
      wnum_sol_patch IS NOT NULL AND 
      wcod_maq_sol_patch IS NOT NULL AND
      wseq_sol_patch IS NOT NULL THEN

      /* Exclui os textos da sol. guarda-chuva ref. a solicitação corrente */
      DELETE cs_sol_textos
       WHERE des_texto LIKE '%' || :NEW.num_solicitacao || '/' || :NEW.cod_maq_sol || '/' ||:NEW.seq_solicitacao || '%'
         AND cod_texto       = wcod_texto
         AND seq_solicitacao = wseq_sol_patch
         AND cod_maq_sol     = wcod_maq_sol_patch
         AND num_solicitacao = wnum_sol_patch;

      /* Busca os textos do código do parâmetro da solicitação corrente */ 
      FOR txt IN ( SELECT des_texto
                        , txt_texto
                        , cod_usuario
                     FROM cs_sol_textos
                    WHERE cod_texto       = wcod_texto
                      AND seq_solicitacao = :NEW.seq_solicitacao
                      AND cod_maq_sol     = :NEW.cod_maq_sol
                      AND num_solicitacao = :NEW.num_solicitacao )
      LOOP
         /* Busca a sequencia livre de textos dentro da sol. guarda-chuva */
         BEGIN
             SELECT NVL (MAX (seq_texto), 0) + 1
               INTO wseq_texto
               FROM cs_sol_textos
              WHERE seq_texto       < 999
                AND seq_solicitacao = wseq_sol_patch
                AND cod_maq_sol     = wcod_maq_sol_patch
                AND num_solicitacao = wnum_sol_patch;
         END;

         /* Insere os textos na solicitação guarda-chuva */
         BEGIN
            INSERT INTO cs_sol_textos 
                      ( num_solicitacao         , cod_maq_sol
                      , seq_solicitacao         , seq_texto
                      , cod_texto               , des_texto
                      , txt_texto               , ind_anexo
                      , dta_inclusao            , cod_usuario)
               VALUES ( wnum_sol_patch          , wcod_maq_sol_patch
                      , wseq_sol_patch          , wseq_texto
                      , wcod_texto              , txt.des_texto || ' - ' || 'Sol.: ' || :NEW.num_solicitacao || '/' || :NEW.cod_maq_sol || '/' || :NEW.seq_solicitacao
                      , txt.txt_texto           , 0
                      , TRUNC(SYSDATE)          , txt.cod_usuario);
         EXCEPTION
            WHEN OTHERS THEN
               nl_application_error_sp ('CS', 20003, 'CS-Inclusão do texto de melhoria do sistema.#' ||SQLERRM);
         END;
      END LOOP;            
   END IF;
END CSSOLT_MELHORIA_TG;
/
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá rvneto99,

Bem vindo ao forum glufke !

Seria possível você publicar aqui a estrutura da tabela e exemplos de 'solicitacao normal' e 'solicitacao atrelada'? Talvez informando este pontos, o pessoal poderia dar uma sugestão para seu problema.

Abraços,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

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