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?

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!