Ошибка сравнения дат при сохранении с помощью в

Я почти закончил процедуру, которую начал вчера, но на последнем шаге я обнаружил проблему, которая возникает только в том случае, если сравнение выполняется с условием if. Процедура показывает всю информацию о матче, если вы вводите раунд футбольной лиги и название команды. Я сохраняю идентификатор футбольного матча на idp для последующих сравнений, когда команда либо дома, либо в гостях, а дата совпадает с одним из двух доступных раундов (предложение if устанавливает другую дату для переменной с именем FECHA, если она либо один или два). Дело в том, что если я попытаюсь проверить FECHA или дату на испанском языке вручную, это сработает, но если я попытаюсь использовать путь if, появится сообщение об ошибке:Не могли бы вы помочь мне решить эту проблему? Большое спасибо!

      create or replace PROCEDURE COMPROBARPARTIDO(JORNADA IN NUMBER, EQUIPO IN VARCHAR2) AS 
FECHA DATE;
IDLOCAL NUMBER;

IDP NUMBER;
NUMAUX NUMBER;
NUMAUX2 NUMBER;
GOLAUX NUMBER;
GOLOC NUMBER;
GOLVI NUMBER;
BEGIN
NUMAUX:=0;
NUMAUX2:=0;
  IF JORNADA = 1 THEN
FECHA := TO_DATE('2021-03-04','yyyy-mm-dd');
ELSIF JORNADA = 2 THEN
FECHA := TO_DATE('2021-03-13','yyyy-mm-dd');
ELSE
    DBMS_OUTPUT.PUT_LINE('ERROR');
END IF;

SELECT DISTINCT P.ID INTO IDP
FROM PARTIDO P
INNER JOIN EQUIPO EL 
ON P.ID_LOCAL =EL.ID
INNER JOIN EQUIPO EV
ON P.ID_VISITANTE = EV.ID
WHERE P.FECHA = FECHA AND (EV.NOMBRE =EQUIPO OR EL.NOMBRE=EQUIPO);

1 ответ

Решение

Ты делаешь:

      WHERE P.FECHA = FECHA

Из документации :

Если оператор SQL ссылается на имя, которое принадлежит как столбцу, так и локальной переменной или формальному параметру, то имя столбца имеет приоритет.

Это означает, что условие эквивалентно:

      WHERE P.FECHA = P.FECHA

что всегда верно (кроме нуля). Это означает, что вы найдете все строки, в которых (EV.NOMBRE =EQUIPO OR EL.NOMBRE=EQUIPO), независимо от P.FECHAзначение. Это дает вам больше строк, чем вы ожидаете; как вы используете select ... into ... запрос должен возвращать ровно одну строку, и, вероятно, это произойдет, когда вы жестко запрограммируете дату.

Вы должны либо явно префикс имени вашей переменной с именем процедуры, чтобы дать ей контекст:

      WHERE P.FECHA = COMPROBARPARTIDO.FECHA

или переименуйте вашу локальную переменную; довольно часто добавлять L_ префикс к именам локальных переменных и P_ для имен параметров, например, чтобы отличить их от имен столбцов:

      create or replace PROCEDURE COMPROBARPARTIDO(P_JORNADA IN NUMBER, P_EQUIPO IN VARCHAR2) AS 
L_FECHA DATE;
...

и измените все ссылки, чтобы они соответствовали:

      WHERE P.FECHA = L_FECHA
Другие вопросы по тегам