Tenho uma procedure que pode copiar ou mover registro. A pk é composta de três campos. Na procedure passo os trÊs campos de origem (ini) e os três de destino (fim). Porém quando mando copiar dá um erro de unique constraint em correção de valores, o que é estranho, pois estou tentando copiar um processo que só tem um registro nesta tabela. Enfim se consulto a tabela de correçaõ o registro fim não existe, se tento rodar a procedure, dá erro de unique constraint. Está me faltando ve ro que? Roberto Oracle 8
create or replace procedure prgrp_mover_processo(p_cd_emp_ini in number, p_cd_fil_ini in number, p_cd_processo_ini in number, p_cd_emp_fim in number, p_cd_fil_fim in number, p_cd_processo_fim in number, p_copiar_mover in varchar2) is begin -- Aqui copia ao processo, registro pai begin insert into e0238_processos (d0002_cd_emp, d0004_cd_fil, d0238_cd_processo, d0232_cd_area, d0231_cd_org) select p_cd_emp_fim, p_cd_fil_fim, p_cd_processo_fim, d0232_cd_area, d0231_cd_org from e0238_processos where e0238_processos.d0002_cd_emp = p_cd_emp_ini and e0238_processos.d0004_cd_fil = p_cd_fil_ini and e0238_processos.d0238_cd_processo = p_cd_processo_ini; exception when others then raise; end; -- Correção de Valores move ou copia os registros da tabela filha if p_copiar_mover = 'C' then begin insert into e1516_correcao_valores (d0002_cd_emp, d0004_cd_fil, d0238_cd_processo, d1516_cd_indice, d1516_incidencia, d1516_data_ini, d1516_data_fim, d1516_valor_indice, d1516_seg_indice) select p_cd_emp_fim, p_cd_fil_fim, p_cd_processo_fim, d1516_cd_indice, d1516_incidencia, d1516_data_ini, d1516_data_fim, d1516_valor_indice, d1516_seg_indice from e1516_correcao_valores where d0002_cd_emp = p_cd_emp_ini and d0004_cd_fil = p_cd_fil_ini and d0238_cd_processo = p_cd_processo_ini; exception when others then raise; end; else begin update e1516_correcao_valores set d0002_cd_emp = p_cd_emp_fim, d0004_cd_fil = p_cd_fil_fim, d0238_cd_processo = p_cd_processo_fim where d0002_cd_emp = p_cd_emp_ini and d0004_cd_fil = p_cd_fil_ini and d0238_cd_processo = p_cd_processo_ini; exception when others then raise; end; end if; -- Após passar todo o processo para nova localização deve-se apaga-lo na localização antiga caso a opção seja mover. if p_copiar_mover = 'M' then begin delete from e0238_processos where e0238_processos.d0002_cd_emp = p_cd_emp_ini and e0238_processos.d0004_cd_fil = p_cd_fil_ini and e0238_processos.d0238_cd_processo = p_cd_processo_ini; exception when others then raise; end; end if; commit; exception when others then raise; end prgrp_mover_processo; Descrição da tabela de correção: create table E1516_CORRECAO_VALORES ( D0002_CD_EMP NUMBER(2) not null, D0004_CD_FIL NUMBER(3) not null, D0238_CD_PROCESSO NUMBER(6) not null, D1516_CD_INDICE NUMBER(2) not null, D1516_INCIDENCIA VARCHAR2(1), D1516_DATA_INI DATE, D1516_DATA_FIM DATE, D1516_VALOR_INDICE NUMBER(7,4), D1516_SEG_INDICE NUMBER(7,4) ) alter table E1516_CORRECAO_VALORES add constraint PKGRP_1516_CORRECAO_VALORES primary key (D0002_CD_EMP,D0004_CD_FIL,D0238_CD_PROCESSO, D1516_CD_INDICE) alter table E1516_CORRECAO_VALORES add constraint FKGRP_1516_PROCESSOS foreign key (D0002_CD_EMP,D0004_CD_FIL,D0238_CD_PROCESSO) references E0238_PROCESSOS (D0002_CD_EMP,D0004_CD_FIL,D0238_CD_PROCESSO);