0

我几乎完成了昨天开始的程序,但在最后一步,我发现只有在使用 if 子句进行比较时才会出现问题。如果您介绍足球联赛轮次和球队名称,该程序会显示比赛的所有信息。当球队是主队或客队并且日期与可用的两轮比赛之一匹配时,我将足球比赛 ID 存储在 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);
4

1 回答 1

1

你正在做:

WHERE P.FECHA = FECHA

从文档中

如果 SQL 语句引用的名称既属于列又属于局部变量或形参,则列名优先。

所以这意味着条件相当于:

WHERE P.FECHA = P.FECHA

这总是正确的(除非P.FECHA为空)。这意味着您正在查找所有行 where (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
于 2021-06-01T13:02:35.387 回答