1
resposta

Erro durante replicação do conteúdo da aula

Olá,

Tentei replicar o conteúdo da aula da seguinte forma.

CREATE TABLE BR_2017 (CLASSIFICACAO NUMBER, EQUIPES VARCHAR2(50),
PONTOS NUMBER, VITORIAS NUMBER, EMPATES NUMBER, DERROTAS NUMBER,
GOLS_FEITOS NUMBER, GOLS_SOFRIDOS NUMBER, SALDO_DE_GOLS NUMBER, 
RESULTADOS_FINAIS VARCHAR2(50));
CREATE OR REPLACE FUNCTION saldo_de_gols
    (p_GOLS_FEITOS IN BR_2017.GOLS_FEITOS%TYPE, p_GOLS_SOFRIDOS IN 
    BR_2017.GOLS_SOFRIDOS%TYPE)
    RETURN BR_2017.SALDO_DE_GOLS%TYPE
IS
    v_SALDO_DE_GOLS BR_2017.SALDO_DE_GOLS%TYPE;
BEGIN 
    SELECT GOLS_FEITOS - GOLS_SOFRIDOS INTO v_SALDO_DE_GOLS FROM BR_2017;
    RETURN v_SALDO_DE_GOLS;
END;
CREATE OR REPLACE FUNCTION resultados_finais
    (p_CLASSIFICACAO BR_2017.CLASSIFICACAO%TYPE)
    RETURN BR_2017.RESULTADOS_FINAIS%TYPE
IS
    v_RESULTADOS_FINAIS BR_2017.RESULTADOS_FINAIS%TYPE;
BEGIN
    IF p_CLASSIFICACAO = 1 THEN
        v_RESULTADOS_FINAIS := 'CAMPEÃO BRASILEIRO DE 2017';
    ELSIF p_CLASSIFICACAO BETWEEN 2 AND 5 THEN
        v_RESULTADOS_FINAIS := 'CLASSIFICADO PARA LIBERTADORES 2018';
     ELSIF p_CLASSIFICACAO BETWEEN 6 AND 9 THEN
        v_RESULTADOS_FINAIS := 'CLASSIFICADO PARA SULAMERICANA 2018';
    ELSIF p_CLASSIFICACAO BETWEEN 10 AND 16 THEN
        v_RESULTADOS_FINAIS := 'PERMANÊNCIA NA SÉRIE A';
    ELSE 
        v_RESULTADOS_FINAIS := 'REBAIXADO PARA SÉRIE B';
    END IF;
END;
CREATE OR REPLACE PROCEDURE inserir_equipe
    (p_CLASSIFICACAO IN BR_2017.CLASSIFICACAO%TYPE, 
    p_EQUIPES IN BR_2017.EQUIPES%TYPE, p_PONTOS IN BR_2017.PONTOS%TYPE, 
    p_VITORIAS IN BR_2017.VITORIAS%TYPE, p_EMPATES IN BR_2017.EMPATES%TYPE,
    p_DERROTAS IN BR_2017.DERROTAS%TYPE, 
    p_GOLS_FEITOS IN BR_2017.GOLS_FEITOS%TYPE, 
    p_GOLS_SOFRIDOS IN BR_2017.GOLS_SOFRIDOS%TYPE)
IS
    v_SALDO_DE_GOLS BR_2017.SALDO_DE_GOLS%TYPE;
    v_RESULTADOS_FINAIS BR_2017.RESULTADOS_FINAIS%TYPE;
BEGIN
    v_SALDO_DE_GOLS := SALDO_DE_GOLS(p_GOLS_FEITOS, p_GOLS_SOFRIDOS);
    v_RESULTADOS_FINAIS := RESULTADOS_FINAIS(p_CLASSIFICACAO);

    INSERT INTO BR_2017 (CLASSIFICACAO, EQUIPES, PONTOS, VITORIAS, EMPATES,
    DERROTAS, GOLS_FEITOS, GOLS_SOFRIDOS, SALDO_DE_GOLS, RESULTADOS_FINAIS)

    VALUES (p_CLASSIFICACAO,  p_EQUIPES, p_PONTOS, p_VITORIAS, p_EMPATES,
    p_DERROTAS, p_GOLS_FEITOS, p_GOLS_SOFRIDOS, v_SALDO_DE_GOLS, 
    v_RESULTADOS_FINAIS);

    COMMIT;
END;
EXECUTE inserir_equipe (1, 'CORINTHIANS', 72, 21, 9, 8, 50, 30);

No entanto recebi o erro ORA-01403: dados não encontrados. Depois de muita pesquisa ainda não consegui identificar porquê não consigo inserir os dados na minha tabela. Poderiam me esclarecer essa dúvida, por favor?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Oi, Allan! Tudo bom?

Peço desculpas pelo tempo que aguardou por uma resposta.

O erro ORA-01403: Dados não encontrados acontece quando uma instrução SELECT não retorna nenhum resultado. No seu caso, o erro está relacionado às funções saldo_de_gols e resultados_finais, as quais são chamadas dentro da procedure inserir_equipe.

Na função saldo_de_gols, você está realizando SELECT sem um filtro, o que provocará o retorno de todos os registros da tabela BR_2017. Isso resulta em uma condição de não encontrar dados quando você tenta atribuir o resultado à variável v_SALDO_DE_GOLS.

Sendo assim, a ideia é adicionar um WHERE no SELECT, relacionando os valores de GOLS_FEITOS e GOLS_SOFRIDOS, chegando em algo assim:

CREATE OR REPLACE FUNCTION saldo_de_gols (
    p_GOLS_FEITOS IN BR_2017.GOLS_FEITOS%TYPE, 
    p_GOLS_SOFRIDOS IN BR_2017.GOLS_SOFRIDOS%TYPE
) RETURN BR_2017.SALDO_DE_GOLS%TYPE
IS
    v_SALDO_DE_GOLS BR_2017.SALDO_DE_GOLS%TYPE;
BEGIN 
    SELECT GOLS_FEITOS - GOLS_SOFRIDOS INTO v_SALDO_DE_GOLS 
    FROM BR_2017 
    WHERE GOLS_FEITOS = p_GOLS_FEITOS 
    AND GOLS_SOFRIDOS = p_GOLS_SOFRIDOS;
    
    RETURN v_SALDO_DE_GOLS;
END;

Assim como a primeira função (saldo_de_gols), a segunda (resultados_finais) também precisa retornar um valor, que neste caso é o resultado final encontrado a partir da classificação do time adicionado. Após adicionar o comando de retorno, chegamos na seguinte função:

CREATE OR REPLACE FUNCTION resultados_finais (
    p_CLASSIFICACAO BR_2017.CLASSIFICACAO%TYPE
) RETURN BR_2017.RESULTADOS_FINAIS%TYPE
IS
    v_RESULTADOS_FINAIS BR_2017.RESULTADOS_FINAIS%TYPE;
BEGIN
    IF p_CLASSIFICACAO = 1 THEN
        v_RESULTADOS_FINAIS := 'CAMPEÃO BRASILEIRO DE 2017';
    ELSIF p_CLASSIFICACAO BETWEEN 2 AND 5 THEN
        v_RESULTADOS_FINAIS := 'CLASSIFICADO PARA LIBERTADORES 2018';
    ELSIF p_CLASSIFICACAO BETWEEN 6 AND 9 THEN
        v_RESULTADOS_FINAIS := 'CLASSIFICADO PARA SULAMERICANA 2018';
    ELSIF p_CLASSIFICACAO BETWEEN 10 AND 16 THEN
        v_RESULTADOS_FINAIS := 'PERMANÊNCIA NA SÉRIE A';
    ELSE 
        v_RESULTADOS_FINAIS := 'REBAIXADO PARA SÉRIE B';
    END IF;
    
    RETURN v_RESULTADOS_FINAIS;
END;

Feito isso, já será possível executar a procedure inserir_equipe , Allan!

Espero ter ajudado com a explicação. Caso o problema continue ou surjam novas dúvidas, conte comigo!

Abraços.

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