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:
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;
/