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);

Responder a