如何解决不能写 if 或 select above begin on a procedure
我正在为一个班级项目建立一个程序,我必须在其中发明一些与我的国家足球联赛相关的程序。现在我正在开发一个程序来显示比赛结果,在介绍了联赛回合和球队后,包括教练、球员、卡片和目标。问题是,我无法将回合的日期设置为我用 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;
解决方法
关于我评论的结构:
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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。