0

我正在为一个班级项目建立一个程序,我必须在其中发明一些与我的国家足球联赛相关的程序。现在我正在开发一个程序来显示比赛结果,在介绍联赛和球队之后,包括教练、球员、卡片和进球。问题是,我无法将回合的日期设置为我用 if 创建的变量,因为 if 结构上预期会出现以下错误之一(我只创建了两轮,所以这就是只有两个条件的原因),并且我无法将表中的数据选择到我创建的其他变量中,这些变量用于存储由于每场比赛的唯一性、裁判员姓名和教练员姓名而不需要在光标上的数据,但还有另一个“期待”错误。有什么帮助吗?先感谢您!PS:其余代码仍在开发中,因此可能存在一些不完整的部分。Arbitro 代表裁判,entrenador 代表教练或经理,nombre 代表姓名,partido 代表比赛错误:在此处输入图像描述

create or replace PROCEDURE COMPROBARPARTIDO(JORNADA IN NUMBER, EQUIPO IN VARCHAR2) AS 

FECHA DATE;
ELOCAL VARCHAR2(30);
EVISITANTE VARCHAR2(30);
ARBIP VARCHAR2(30);
ASISTENTE VARCHAR2(30);
IF JORNADA = 1 THEN
FECHA:=4-03-2021;
ELSIF JORNADA = 2 THEN
FECHA:=13-03-2021;
ELSE
    DBMS_OUTPUT.PUT_LINE('ERROR');
END IF;

SELECT APR.NOMBRE INTO ARBIP, ASS.NOMBRE INTO ASISTENTE, ENL.NOMBRE INTO ELOCAL, ENV.NOMBRE INTO EVISITANTE
FROM  PARTIDO_JUGADOR PA
INNER JOIN PARTIDO P
ON PA.ID_PARTIDO = P.ID
INNER JOIN EQUIPO EL 
ON P.ID_LOCAL =EL.ID
INNER JOIN EQUIPO EV
ON P.ID_VISITANTE = EV.ID
INNER JOIN ENTRENADOR ENL
ON EL.ID_ENTRENADOR = ENL.ID
INNER JOIN ENTRENADOR ENV
ON EV.ID_ENTRENADOR = ENV.ID
INNER JOIN PARTIDO_ARBITRO PAR
ON P.ID = PAR.ID_PARTIDO
INNER JOIN ARBITRO APR
ON PAR.ID_ARBITROC = APR.ID
INNER JOIN ARBITRO ASS
ON PAR.ID_ARBITROA = ASS.ID
WHERE P.FECHA = FECHA AND (EQUIPO =EV.NOMBRE OR EQUIPO = EL.NOMBRE);


CURSOR C1 IS
SELECT J.NOMBRE, J.APELLIDO, EQ.NOMBRE
FROM PARTIDO P
INNER JOIN PARTIDO_JUGADOR PJ
ON P.ID = PARTIDO_JUGADOR.ID_PARTIDO
INNER JOIN JUGADOR J
ON PJ.ID_JUGADOR = J.ID
INNER JOIN EQUIPO EQ
ON J.ID_EQUIPO = EQ.ID
ORDER BY EQ.ID, J.COD_POSICION ;

BEGIN
  NULL;
END COMPROBARPARTIDO;
4

2 回答 2

1

关于我评论过的结构:

create procedure as
  <declaration section>
begin
  <executable section>
end;

你把

  • 可执行语句 ( if) 放入声明部分,然后
  • 下面是select(无效的......应该只有一个into关键字),并且
  • 惊喜!- 游标声明 (?)。顺便说一句,您“声明”它并且从未使用它
  • 将日期称为日期;通过使用to_date适当的格式掩码,或使用日期文字(就像我一样)

可能编译的代码(不知道,没有你的表);看看它是否有帮助。

CREATE OR replace PROCEDURE comprobarpartido(
  jornada  IN  NUMBER,
  equipo   IN  VARCHAR2
)
AS
  fecha       DATE;
  elocal      VARCHAR2(30);
  evisitante  VARCHAR2(30);
  arbip       VARCHAR2(30);
  asistente   VARCHAR2(30);

  CURSOR c1 IS
  SELECT j.nombre,
         j.apellido,
         eq.nombre
  FROM partido p
  INNER JOIN partido_jugador  pj ON p.id = partido_jugador.id_partido
  INNER JOIN jugador          j ON pj.id_jugador = j.id
  INNER JOIN equipo           eq ON j.id_equipo = eq.id
  ORDER BY eq.id,
           j.cod_posicion;

BEGIN 
  IF jornada = 1 THEN
     fecha := DATE '2021-03-04';
  ELSIF jornada = 2 THEN
     fecha := DATE '2021-03-13';
  ELSE
     dbms_output.put_line('ERROR');
  END IF;
  
  SELECT APR.NOMBRE, ASS.NOMBRE, ENL.NOMBRE, ENV.NOMBRE
    INTO ARBIP     , ASISTENTE , ELOCAL    , EVISITANTE
  FROM partido_jugador pa
  INNER JOIN partido          p   ON pa.id_partido = p.id
  INNER JOIN equipo           el  ON p.id_local = el.id
  INNER JOIN equipo           ev  ON p.id_visitante = ev.id
  INNER JOIN entrenador       enl ON el.id_entrenador = enl.id
  INNER JOIN entrenador       env ON ev.id_entrenador = env.id
  INNER JOIN partido_arbitro  par ON p.id = par.id_partido
  INNER JOIN arbitro          apr ON par.id_arbitroc = apr.id
  INNER JOIN arbitro          ass ON par.id_arbitroa = ass.id
  WHERE p.fecha = fecha
    AND (   equipo = ev.nombre
         OR equipo = el.nombre
        ); 
END comprobarpartido;
于 2021-05-31T17:58:52.303 回答
0

要根据条件设置声明值,可以使用case. 例如:

fecha date := 
    case jornada
        when 1 then date '2021-03-04'
        when 2 then date '2021-03-13'
    end;
于 2021-05-31T19:01:13.117 回答