Pular para o conteúdo

Fóruns Banco de dados Oracle Ora-06159 Ora-06159

#105821
rman
Participante

    @elciodba

    Solução com transação autonoma e com COMMIT:

    create or replace trigger TRG_COMPART_TRAB_REFER
    after insert on crd.trab_referencia
    REFERENCING NEW AS NEW
    for each row
    declare
    Pragma Autonomous_Transaction;
    v_compartilha_cadastro crd.regras_negocio.compartilha_cadastro%type := null;
    v_empresa_origem crd.cliente.empresa_origem%type;
    v_cpf_cgc crd.cliente.cpf_cgc%type;
    v_debug varchar2(1000);

    --CURSOR PARA ATUALIZA¿¿O DO CADASTRO COMPARTILHADO
    cursor cur_dados_compart(pc_codcpf_cgc in crd.cliente.cpf_cgc%type, pc_empresa_origem in crd.cliente.empresa_origem%type) is
    select cli.empresa empresacli,
    cli.cliente,
    cli.empresa_origem,
    cli.loja_origem,
    rn.empresa,
    rn.compartilha_cadastro
    from crd.cliente cli, crd.regras_negocio rn
    where cli.cpf_cgc = pc_codcpf_cgc
    and cli.empresa_origem = rn.empresa
    and cli.empresa_origem NOT IN (pc_empresa_origem)
    and rn.compartilha_cadastro = 'S';
    reg_dados_compart cur_dados_compart%rowtype;
    begin

    begin
    select cli.cpf_cgc, cli.empresa_origem, rn.compartilha_cadastro
    into v_cpf_cgc, v_empresa_origem, v_compartilha_cadastro
    from crd.cliente cli, crd.regras_negocio rn
    where cli.empresa = :NEW.EMPRESA
    and cli.cliente = :NEW.CLIENTE
    and cli.empresa_origem = rn.empresa;
    exception
    when others then
    v_compartilha_cadastro := 'N';
    end;

    if (user 'REPADMIN') AND (v_compartilha_cadastro = 'S') then
    open cur_dados_compart(v_cpf_cgc, v_empresa_origem);
    loop
    fetch cur_dados_compart
    into reg_dados_compart;
    exit when cur_dados_compart%notfound;
    begin
    UPDATE crd.trab_referencia
    SET PAI = :NEW.PAI,
    MAE = :NEW.MAE,
    TRABALHO = :NEW.TRABALHO,
    LOGRADOURO = :NEW.LOGRADOURO,
    ENDERECO = :NEW.ENDERECO,
    NUMERO = :NEW.NUMERO,
    COMPLEMENTO = :NEW.COMPLEMENTO,
    BAIRRO = :NEW.BAIRRO,
    CIDADE = :NEW.CIDADE,
    UF = :NEW.UF,
    CEP = :NEW.CEP,
    TELEFONE = :NEW.TELEFONE,
    CELULAR = :NEW.CELULAR,
    ENVIA_E_MAIL = :NEW.ENVIA_E_MAIL,
    E_MAIL = :NEW.E_MAIL,
    SALARIO = :NEW.SALARIO,
    RENDA = :NEW.RENDA,
    RENDA_NOMINAL = :NEW.RENDA_NOMINAL,
    ADMISSAO = :NEW.ADMISSAO,
    CGC_SOCIED = :NEW.CGC_SOCIED,
    CAPITAL_SOC = :NEW.CAPITAL_SOC,
    COTAS_SOC = :NEW.COTAS_SOC,
    RESIDENCIA_SITUACAO = :NEW.RESIDENCIA_SITUACAO,
    TEMPO_RESIDENCIA = :NEW.TEMPO_RESIDENCIA,
    VAL_ALUGUEL = :NEW.VAL_ALUGUEL,
    TELEFONE_SITUACAO = :NEW.TELEFONE_SITUACAO,
    QTD_DEPENDENTES = :NEW.QTD_DEPENDENTES,
    CARTOES_CREDITO = :NEW.CARTOES_CREDITO,
    MARCA_VEICULO = :NEW.MARCA_VEICULO,
    MODELO_VEICULO = :NEW.MODELO_VEICULO,
    ANO_VEICULO = :NEW.ANO_VEICULO,
    REF1_PESSOAL = :NEW.REF1_PESSOAL,
    END1_REF_PESSOAL = :NEW.END1_REF_PESSOAL,
    TEL1_REF_PESSOAL = :NEW.TEL1_REF_PESSOAL,
    REF2_PESSOAL = :NEW.REF2_PESSOAL,
    END2_REF_PESSOAL = :NEW.END2_REF_PESSOAL,
    TEL2_REF_PESSOAL = :NEW.TEL2_REF_PESSOAL,
    BCO1_BANCO = :NEW.BCO1_BANCO,
    BCO1_AGENCIA = :NEW.BCO1_AGENCIA,
    BCO1_CONTA = :NEW.BCO1_CONTA,
    BCO2_BANCO = :NEW.BCO2_BANCO,
    BCO2_AGENCIA = :NEW.BCO2_AGENCIA,
    BCO2_CONTA = :NEW.BCO2_CONTA,
    AUTORIZA_DEBITO = :NEW.AUTORIZA_DEBITO,
    RENDA_FAMILIAR = :NEW.RENDA_FAMILIAR,
    VAL_COTAS_SOC = :NEW.VAL_COTAS_SOC,
    DATA_FUNDACAO_SOC = :NEW.DATA_FUNDACAO_SOC,
    SITUACAO_VEICULO = :NEW.SITUACAO_VEICULO,
    VALOR_VEICULO = :NEW.VALOR_VEICULO,
    BCO1_TIPO_CONTA = :NEW.BCO1_TIPO_CONTA,
    BCO2_TIPO_CONTA = :NEW.BCO2_TIPO_CONTA,
    BCO1_CLI_DESDE = :NEW.BCO1_CLI_DESDE,
    BCO2_CLI_DESDE = :NEW.BCO2_CLI_DESDE,
    GRAU_INSTRUCAO = :NEW.GRAU_INSTRUCAO,
    APRESENTOU_END = :NEW.APRESENTOU_END,
    RAMAL1_REF_PESSOAL = :NEW.RAMAL1_REF_PESSOAL,
    RAMAL2_REF_PESSOAL = :NEW.RAMAL2_REF_PESSOAL,
    POSSUI_SEGURO = :NEW.POSSUI_SEGURO,
    TIPO_RENDA_PRESUMIDA = :NEW.TIPO_RENDA_PRESUMIDA,
    VALOR_RENDA_PRESUMIDA = :NEW.VALOR_RENDA_PRESUMIDA,
    QTD_PRESTACAO_PRESUMIDA = :NEW.QTD_PRESTACAO_PRESUMIDA,
    EMPRESA_USUARIO = :NEW.EMPRESA_USUARIO,
    TIPO_RENDIMENTO = :NEW.TIPO_RENDIMENTO,
    TEMPO_TRABALHO = :NEW.TEMPO_TRABALHO,
    TEMPO_RESIDENCIA1 = :NEW.TEMPO_RESIDENCIA1,
    TIPO_LOG_CEP = :NEW.TIPO_LOG_CEP,
    CELULAR_REF1_PESSOAL = :NEW.CELULAR_REF1_PESSOAL,
    CELULAR_REF2_PESSOAL = :NEW.CELULAR_REF2_PESSOAL
    WHERE EMPRESA = reg_dados_compart.empresacli
    and CLIENTE = reg_dados_compart.cliente;
    exception
    when others then

          htp.print('erro');
      end;
    end loop;
    close cur_dados_compart;  
    COMMIT;
    

    ELSE
    ROLLBACK;
    end if;

    end TRG_COMPART_TRAB_REFER;

    Solução sem transação autonoma e sem COMMIT:

    Desta forma o COMMIT é feito pela transação que disparou a TRIGGER.

    create or replace trigger TRG_COMPART_TRAB_REFER
    after insert on crd.trab_referencia
    REFERENCING NEW AS NEW
    for each row
    declare
    v_compartilha_cadastro crd.regras_negocio.compartilha_cadastro%type := null;
    v_empresa_origem crd.cliente.empresa_origem%type;
    v_cpf_cgc crd.cliente.cpf_cgc%type;
    v_debug varchar2(1000);

    --CURSOR PARA ATUALIZA¿¿O DO CADASTRO COMPARTILHADO
    cursor cur_dados_compart(pc_codcpf_cgc in crd.cliente.cpf_cgc%type, pc_empresa_origem in crd.cliente.empresa_origem%type) is
    select cli.empresa empresacli,
    cli.cliente,
    cli.empresa_origem,
    cli.loja_origem,
    rn.empresa,
    rn.compartilha_cadastro
    from crd.cliente cli, crd.regras_negocio rn
    where cli.cpf_cgc = pc_codcpf_cgc
    and cli.empresa_origem = rn.empresa
    and cli.empresa_origem NOT IN (pc_empresa_origem)
    and rn.compartilha_cadastro = 'S';
    reg_dados_compart cur_dados_compart%rowtype;
    begin

    begin
    select cli.cpf_cgc, cli.empresa_origem, rn.compartilha_cadastro
    into v_cpf_cgc, v_empresa_origem, v_compartilha_cadastro
    from crd.cliente cli, crd.regras_negocio rn
    where cli.empresa = :NEW.EMPRESA
    and cli.cliente = :NEW.CLIENTE
    and cli.empresa_origem = rn.empresa;
    exception
    when others then
    v_compartilha_cadastro := 'N';
    end;

    if user 'REPADMIN' then
    IF INSERTING THEN
    if (v_compartilha_cadastro = 'S') then

        open cur_dados_compart(v_cpf_cgc, v_empresa_origem);
        loop
          fetch cur_dados_compart
            into reg_dados_compart;
          exit when cur_dados_compart%notfound;
          begin
            UPDATE crd.trab_referencia
               SET PAI                     = :NEW.PAI,
                   MAE                     = :NEW.MAE,
                   TRABALHO                = :NEW.TRABALHO,
                   LOGRADOURO              = :NEW.LOGRADOURO,
                   ENDERECO                = :NEW.ENDERECO,
                   NUMERO                  = :NEW.NUMERO,
                   COMPLEMENTO             = :NEW.COMPLEMENTO,
                   BAIRRO                  = :NEW.BAIRRO,
                   CIDADE                  = :NEW.CIDADE,
                   UF                      = :NEW.UF,
                   CEP                     = :NEW.CEP,
                   TELEFONE                = :NEW.TELEFONE,
                   CELULAR                 = :NEW.CELULAR,
                   ENVIA_E_MAIL            = :NEW.ENVIA_E_MAIL,
                   E_MAIL                  = :NEW.E_MAIL,
                   SALARIO                 = :NEW.SALARIO,
                   RENDA                   = :NEW.RENDA,
                   RENDA_NOMINAL           = :NEW.RENDA_NOMINAL,
                   ADMISSAO                = :NEW.ADMISSAO,
                   CGC_SOCIED              = :NEW.CGC_SOCIED,
                   CAPITAL_SOC             = :NEW.CAPITAL_SOC,
                   COTAS_SOC               = :NEW.COTAS_SOC,
                   RESIDENCIA_SITUACAO     = :NEW.RESIDENCIA_SITUACAO,
                   TEMPO_RESIDENCIA        = :NEW.TEMPO_RESIDENCIA,
                   VAL_ALUGUEL             = :NEW.VAL_ALUGUEL,
                   TELEFONE_SITUACAO       = :NEW.TELEFONE_SITUACAO,
                   QTD_DEPENDENTES         = :NEW.QTD_DEPENDENTES,
                   CARTOES_CREDITO         = :NEW.CARTOES_CREDITO,
                   MARCA_VEICULO           = :NEW.MARCA_VEICULO,
                   MODELO_VEICULO          = :NEW.MODELO_VEICULO,
                   ANO_VEICULO             = :NEW.ANO_VEICULO,
                   REF1_PESSOAL            = :NEW.REF1_PESSOAL,
                   END1_REF_PESSOAL        = :NEW.END1_REF_PESSOAL,
                   TEL1_REF_PESSOAL        = :NEW.TEL1_REF_PESSOAL,
                   REF2_PESSOAL            = :NEW.REF2_PESSOAL,
                   END2_REF_PESSOAL        = :NEW.END2_REF_PESSOAL,
                   TEL2_REF_PESSOAL        = :NEW.TEL2_REF_PESSOAL,
                   BCO1_BANCO              = :NEW.BCO1_BANCO,
                   BCO1_AGENCIA            = :NEW.BCO1_AGENCIA,
                   BCO1_CONTA              = :NEW.BCO1_CONTA,
                   BCO2_BANCO              = :NEW.BCO2_BANCO,
                   BCO2_AGENCIA            = :NEW.BCO2_AGENCIA,
                   BCO2_CONTA              = :NEW.BCO2_CONTA,
                   AUTORIZA_DEBITO         = :NEW.AUTORIZA_DEBITO,
                   RENDA_FAMILIAR          = :NEW.RENDA_FAMILIAR,
                   VAL_COTAS_SOC           = :NEW.VAL_COTAS_SOC,
                   DATA_FUNDACAO_SOC       = :NEW.DATA_FUNDACAO_SOC,
                   SITUACAO_VEICULO        = :NEW.SITUACAO_VEICULO,
                   VALOR_VEICULO           = :NEW.VALOR_VEICULO,
                   BCO1_TIPO_CONTA         = :NEW.BCO1_TIPO_CONTA,
                   BCO2_TIPO_CONTA         = :NEW.BCO2_TIPO_CONTA,
                   BCO1_CLI_DESDE          = :NEW.BCO1_CLI_DESDE,
                   BCO2_CLI_DESDE          = :NEW.BCO2_CLI_DESDE,
                   GRAU_INSTRUCAO          = :NEW.GRAU_INSTRUCAO,
                   APRESENTOU_END          = :NEW.APRESENTOU_END,
                   RAMAL1_REF_PESSOAL      = :NEW.RAMAL1_REF_PESSOAL,
                   RAMAL2_REF_PESSOAL      = :NEW.RAMAL2_REF_PESSOAL,
                   POSSUI_SEGURO           = :NEW.POSSUI_SEGURO,
                   TIPO_RENDA_PRESUMIDA    = :NEW.TIPO_RENDA_PRESUMIDA,
                   VALOR_RENDA_PRESUMIDA   = :NEW.VALOR_RENDA_PRESUMIDA,
                   QTD_PRESTACAO_PRESUMIDA = :NEW.QTD_PRESTACAO_PRESUMIDA,
                   EMPRESA_USUARIO         = :NEW.EMPRESA_USUARIO,
                   TIPO_RENDIMENTO         = :NEW.TIPO_RENDIMENTO,
                   TEMPO_TRABALHO          = :NEW.TEMPO_TRABALHO,
                   TEMPO_RESIDENCIA1       = :NEW.TEMPO_RESIDENCIA1,
                   TIPO_LOG_CEP            = :NEW.TIPO_LOG_CEP,
                   CELULAR_REF1_PESSOAL    = :NEW.CELULAR_REF1_PESSOAL,
                   CELULAR_REF2_PESSOAL    = :NEW.CELULAR_REF2_PESSOAL
             WHERE EMPRESA = reg_dados_compart.empresacli
               and CLIENTE = reg_dados_compart.cliente;
          exception
            when others then
    
              htp.print('erro');
          end;
        end loop;
        close cur_dados_compart;
      end if;
    END IF;
    

    end if;

    end TRG_COMPART_TRAB_REFER;

    Verifique qual é a melhor solução, provavelmente você deve seguir um padrão de desenvolvimento.