Почему эта функция возвращает нулевые значения? - PullRequest
0 голосов
/ 08 мая 2019

Я сделал функцию для расчета лиги. Проблема в том, что функция выдает мне следующую ошибку, когда я пытаюсь увидеть вид. ORA-06503: PL / SQL: функция возвращена без значения ORA-06512: на "project.league", строка 24 06503. 00000 - «PL / SQL: функция возвращена без значения»

Это мой код функции.

create or replace FUNCTION leaguepts(Team preleague.Team1%TYPE)
RETURN NUMBER
AS
cumulpts NUMBER(3):=1;
cumulpts2 NUMBER(3):=2;
cumulpts3 NUMBER(3):=0;
VT matches.Team1%TYPE;
texist EXCEPTION;
BEGIN
SELECT COUNT(Team1) INTO VT FROM matches WHERE Team1=Team; 
IF (VT>0) THEN
    SELECT SUM(PTS) INTO cumulpts FROM preleague WHERE Team2=Team;
    SELECT SUM(PTS2) INTO cumulpts2 FROM preleague WHERE Team2=Team;
    cumulpts3:=(cumulpts+cumulpts2);
ELSE
    RAISE texist;
END IF;
RETURN cumulpts3;
EXCEPTION
    WHEN texist THEN
        DBMS_OUTPUT.PUT_LINE ('The team does not exist');

END;

А это мой код просмотра

CREATE OR REPLACE FORCE EDITIONABLE VIEW "project"."league" ("Team", "PTS")   AS 
  SELECT Name, Leaguepts(team_cod) FROM Teams;

Я хотел сделать функцию, чтобы узнать, сколько очков каждая команда должна рассматривать в качестве лиги как классификацию. Я буду благодарен всем, кто пытается мне помочь.

Ответы [ 2 ]

1 голос
/ 08 мая 2019

@ Boneist - Хорошая точка .
Это не только удаление ненужной переменной, но (что более важно) ненужного запроса. Переключение контекста или переключение между механизмами SQL и PL / SQL влияет на производительность.
Я бы пошел еще дальше, удалив еще две переменные и еще один SQL-запрос:

    CREATE OR REPLACE FUNCTION leaguepts (team preleague.team1%TYPE) RETURN NUMBER AS
      cumulpts  NUMBER(3) := 0;
      texist EXCEPTION;
    BEGIN

    SELECT SUM(NVL(pts, 0) + NVL(pts2, 0))
    INTO cumulpts
    FROM preleague
    WHERE  team2 = team;

    IF cumulpts > 0 THEN
      RETURN cumulpts;
    ELSE
      RAISE texist;
    END IF;

    EXCEPTION
  WHEN texist THEN
    dbms_output.put_line ('The team "'||team||'" does not exist');
    return null;

END leaguepts;
/
0 голосов
/ 08 мая 2019

Я бы переписал вашу функцию как:

CREATE OR REPLACE FUNCTION leaguepts (team preleague.team1%TYPE) RETURN NUMBER AS
  cumulpts  NUMBER(3) := 0;
  cumulpts2 NUMBER(3) := 0;
  vt        matches.team1%TYPE;
  texist EXCEPTION;
BEGIN
  SELECT COUNT(team1)
  INTO   vt
  FROM   matches
  WHERE  team1 = team;

  IF (vt > 0)
  THEN
    SELECT SUM(pts), SUM(pts2)
    INTO   cumulpts, cumulpts2
    FROM   preleague
    WHERE  team2 = team;

  ELSE
    RAISE texist;
  END IF;

  RETURN nvl(cumulpts, 0) + nvl(cumulpts2, 0);

EXCEPTION
  WHEN texist THEN
    dbms_output.put_line ('The team "'||team||'" does not exist');
    return null;

END leaguepts;
/

А вот демонстрация работы

Я изменил вашу функцию для удаления ненужной переменной cumulpts3, а также обновил cumulpts + cumulpts2, чтобы использовать NVL для возврата 0, если любое из значений равно 0 (например, в моем примере команда D существует, но в предварительной лиге строк нет, поэтому возвращается 0, вместо команды B, у которой нет значения team1 в таблице соответствий, поэтому возвращается null.

Вы можете изменить эти значения соответствующим образом (может быть, вы хотите, чтобы оба значения были нулевыми? В этом случае удалите NVL s или, возможно, вы хотите вернуть нулевое значение для присутствующей команды и -1 для отсутствующей команды, и т.д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...