- Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 2 meses atrás por elciodba.
-
AutorPosts
-
26 de agosto de 2013 às 5:59 pm #105804elciodbaParticipante
Bom dia estou com problema em uma trigger. Erro ORA-06159 porem essa trigger é igual a uma outra que ja funciona. Ja olhamos tudo e não tem diferencia nenhuma da que funciona.
Estou precisando de ajuda.Obrigado
26 de agosto de 2013 às 6:19 pm #105805rmanParticipante@elciodba
Existe COMMIT dentro desta trigger?
26 de agosto de 2013 às 6:25 pm #105806elciodbaParticipantenão…pode colocar commit em trigger????
26 de agosto de 2013 às 10:30 pm #105807rmanParticipante@elciodba
Poder até pode, mas não é recomendado.
Está usando Pragma AUTONOMOUS_TRANSACTION ?
Poderia postar a trigger?
26 de agosto de 2013 às 10:50 pm #105808elciodbaParticipanteQual é motivo que não é recomendando usar COMMIT na trigger ????? Qual é a função desse comando?
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;
beginbegin
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’) thenopen 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; end if; END IF;
end if;
end TRG_COMPART_TRAB_REFER;
Muito obrigado
27 de agosto de 2013 às 4:57 pm #105818rmanParticipante@elciodba
É necessário utilizar uma transação autonoma para utilizar o COMMIT dentro da TRIGGER. Pelo que vi você já está utilizando. A transação autonoma roda em paralelo da transação principal, ou seja, o ROLLBACK da transação principal não desfaz a transação autonoma, por isso não é recomandado utilizar.
Ao utilizar a transação autonoma é necessário obrigatóriamente utilizar o COMMIT ou ROLLBACK, se analisar os IFs, tem situação que não é rodado o COMMIT ou ROLLBACK.
27 de agosto de 2013 às 5:18 pm #105819elciodbaParticipanteMuito obrigado pela explicação, o que eu preciso fazer para resolver isso??? tirar os IFs???? OU Pragma AUTONOMOUS_TRANSACTION não sei o que fazer para resolver esse problema.
27 de agosto de 2013 às 7:53 pm #105821rmanParticipante@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;
beginbegin
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 thenhtp.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;
beginbegin
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') thenopen 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.
29 de agosto de 2013 às 9:26 pm #105832elciodbaParticipanteGostaria de agradecer deu certo. Agora esta vendo se é viável. Mas muito obrigado.
-
AutorPosts
- Você deve fazer login para responder a este tópico.