Ошибка сравнения дат при сохранении с помощью в
Я почти закончил процедуру, которую начал вчера, но на последнем шаге я обнаружил проблему, которая возникает только в том случае, если сравнение выполняется с условием 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