1
resposta

[Dúvida] ERRO :02291 - ´PRECISO DE AJUDA

Boa Noite meu código está apresentando o seguinte erro:

Erro a partir da linha : 59 no comando -
declare
V_SEGMERCADO CLIENTE.segmercardo_id%TYPE := 7;
V_ID cliente.id%type := 1;
begin
loop
    V_ID := V_ID + 1;
    ALTERA_SEGMERCADO_ID(V_ID,V_SEGMERCADO);
exit when V_ID > 7;
end loop;
end;
Relatório de erros -
ORA-02291: restrição de integridade (SYSTEM.CLIENTE_SEGMERCADO_ID) violada - chave mãe não localizada
ORA-06512: em "SYSTEM.ALTERA_SEGMERCADO_ID", line 8
ORA-06512: em line 7
02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
*Cause:    A foreign key value has no matching primary key value.
*Action:   Delete the foreign key or add a matching primary key.

segue meu código:

create or replace function obter_categoria_cliente
(P_FATURAMENTO CLIENTE.FATURAMENTO_PREVISTO%TYPE)
RETURN CLIENTE.CATEGORIA%TYPE
IS 
V_CATEGORIA CLIENTE.CATEGORIA%TYPE;
BEGIN
IF P_FATURAMENTO <= 10000 THEN
V_CATEGORIA := 'BAIXO';
ELSIF P_FATURAMENTO <= 50000 THEN
V_CATEGORIA := 'MEDIO';
ELSIF P_FATURAMENTO <= 100000 THEN
V_CATEGORIA := 'MEDIO ALTO';
ELSE V_CATEGORIA := 'ALTO';
END IF;
return V_CATEGORIA;
END;


CREATE OR REPLACE PROCEDURE INCLUIR_CLIENTE
(P_ID CLIENTE.ID%TYPE,
P_RAZAO CLIENTE.RAZAO_SOCIAL%TYPE,
P_CNPJ CLIENTE.CNPJ%TYPE,
P_SEGMERCADO CLIENTE.segmercardo_id%TYPE,
P_FATURAMENTO CLIENTE.FATURAMENTO_PREVISTO%TYPE
)
IS
V_CATEGORIA CLIENTE.CATEGORIA%TYPE;
V_CNPJ CLIENTE.CNPJ%TYPE;
BEGIN
FORMATA_CNPJ(P_CNPJ,V_CNPJ);
V_CATEGORIA := OBTER_CATEGORIA_CLIENTE(P_FATURAMENTO);
INSERT INTO CLIENTE VALUES(P_ID,P_RAZAO,V_CNPJ,P_SEGMERCADO,SYSDATE,P_FATURAMENTO,V_CATEGORIA);
COMMIT;
END;



EXECUTE incluir_cliente(11,'supermercado tres irmaos','33333333333',1,100456);


create or replace procedure FORMATA_CNPJ
(P_CNPJ in CLIENTE.CNPJ%TYPE,P_CNPJ_SAIDA OUT CLIENTE.CNPJ%TYPE)
IS
BEGIN
P_CNPJ_SAIDA := substr(P_CNPJ,1,3) || '.' || substr(P_CNPJ,4,3) || '.' || substr(P_CNPJ,6,3) || '-' || substr(P_CNPJ,9,2);
END;


create or repLACE procedure ALTERA_SEGMERCADO_ID
(P_ID CLIENTE.ID%TYPE,P_SEGMERCADO_ID CLIENTE.ID%TYPE)
is
begin
UPDATE CLIENTE SET segmercardo_id = P_SEGMERCADO_ID WHERE ID = P_ID;
COMMIT;
end;
SELECT * FROM CLIENTE;


declare
V_SEGMERCADO CLIENTE.segmercardo_id%TYPE := 7;
V_ID cliente.id%type := 1;
begin
loop
    V_ID := V_ID + 1;
    ALTERA_SEGMERCADO_ID(V_ID,V_SEGMERCADO);
exit when V_ID > 7;
end loop;
end;
1 resposta

Oii, Hugo! Como vai?

Peço desculpas pela demora em obter uma resposta.

Segundo o relatório de erros contidos na primeira informação fornecida, temos 2 tipos de erros, sendo 1 ocorrendo duas vezes mas em linha de códigos diferentes.

O erro ORA-02291 indica que houve uma tentativa de fazer referência a uma tabela usando chava primária, mas as colunas listadas não correspondem a ela ou não existe uma chava primária para a tabela.

No link abaixo você pode acompanhar o passo a passo para a resolução desse erro, no qual precisará inserir o valor na tabela pai primeiro e depois inserir o valor que corresponde na tabela filho.

O segundo erro, o ORA-06512, ocorrem na linha 7 e 8 do código, indicando que a condição do erro causado por exceções não manipuladas no código. Na documentação encontramos as seguintes recomendações para a correção:

  • Corrigir a condição que está causado o erro;
  • Escrever um manipulador de exceção para o erro;

Deixo o link para conferir o passo a passo de cada um, você pode utilizar o que mais encaixe no seu projeto.

Espero ter ajudado. Qualquer dúvida, não hesite em recorrer ao fórum.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!