不能写 if or select above begin on a procedure
Cannot write if or select above begin on a procedure
我正在为一个 class 项目构建一个程序,我必须在其中发明一些与我的国家足球联赛相关的程序。现在我正在开发一个程序来显示比赛结果,在介绍联赛轮次和球队后,包括教练、球员、卡片和进球。问题是,由于 if 结构上预期出现以下错误之一,我无法将回合日期设置为我用 if 创建的变量(我只创建了两回合,所以这就是只有两个条件的原因), 我不能 select 表中的数据到我创建的其他变量中,这些变量用于存储不需要在光标上的数据,因为每场比赛都是唯一的,裁判姓名和教练姓名,但是也是另一个“预期”错误。有什么帮助吗?先感谢您!
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;
关于我评论的结构:
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;
根据条件设置声明值,可以使用case
。例如:
fecha date :=
case jornada
when 1 then date '2021-03-04'
when 2 then date '2021-03-13'
end;
我正在为一个 class 项目构建一个程序,我必须在其中发明一些与我的国家足球联赛相关的程序。现在我正在开发一个程序来显示比赛结果,在介绍联赛轮次和球队后,包括教练、球员、卡片和进球。问题是,由于 if 结构上预期出现以下错误之一,我无法将回合日期设置为我用 if 创建的变量(我只创建了两回合,所以这就是只有两个条件的原因), 我不能 select 表中的数据到我创建的其他变量中,这些变量用于存储不需要在光标上的数据,因为每场比赛都是唯一的,裁判姓名和教练姓名,但是也是另一个“预期”错误。有什么帮助吗?先感谢您!
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;
关于我评论的结构:
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;
根据条件设置声明值,可以使用case
。例如:
fecha date :=
case jornada
when 1 then date '2021-03-04'
when 2 then date '2021-03-13'
end;