我刚刚开始使用 Oracle Database XE,代码中存在 2 个错误:
Error(89,5): PLS-00103: Se ha encontrado el símbolo "EXCEPTION" cuando se esperaba uno de los siguientes: ( begin case statements else elsif end exit for goto if loop mod null pragma raise return select update while with << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge standard pipe purge json_object
错误(95):PLS-00103:Se ha encontrado el símbolo“文件结束”cuando se esperaba uno de los siguientes:结束不是杂注最终可实例化持久顺序覆盖静态成员构造函数映射
CREATE OR REPLACE PROCEDURE registrar_devolucion (p_alquilerID IN Alquileres_eco.ID%TYPE, p_fechadev IN DATE)
AS
v_fecha_ini ALQUILERES_ECO.FECHAINI%TYPE;
v_dias_alq NUMBER;
v_precioxdia NUMBER;
v_precio_alq NUMBER;
v_descuento NUMBER;
v_ecopuntos NUMBER;
v_dni_cliente CLIENTES_ECO.DNI%TYPE;
v_nombre_cliente CLIENTES_ECO.NOMBRE%TYPE;
v_matricula MOTOS_ECO.MATRICULA%TYPE;
v_modelo MOTOS_ECO.MODELO%TYPE;
BEGIN
-- Comprobamos que el alquiler existe
SELECT dni, Matricula
INTO v_dni_cliente, v_matricula
FROM Alquileres_eco
WHERE AlquilerID = p_alquilerID;
--Calculamos los dias de alquiler
v_dias_alq := p_fechadev - v_fecha_ini;
--Act DiasAlquiler y confirmar
UPDATE Alquileres_eco
SET FechaFin = p_fechadev,
DiasAlquiler = v_dias_alq
WHERE AlquilerID = p_alquilerID;
--Verificar si la fecha de devolucion es anterior a la de inicio
IF v_fechadev < v_fecha_ini THEN
RAISE_APPLICATION_ERROR(-20002, 'la devolución del Alquiler con ID:' || p_AlquilerID || 'tiene una fecha de devolución: ' || p_fechadev || 'anterior a la fecha de inicio de alquiler.');
--Calc descuento
v_descuento := ALQUILERES_ECO.DESCUENTO;
-- Calcular precio del alquiler
SELECT PrecioPorDia, Descuento
INTO v_precioxdia, v_descuento
FROM Motos_eco
WHERE Matricula = v_matricula;
v_precio_alq := (v_precioxdia * v_dias_alq) * v_descuento/ 100 ;
--Act PrecioAlquiler y confirmar
UPDATE Alquileres_eco
SET PrecioAlquiler = v_precio_alq
WHERE AlquilerID = P_alquilerID;
-- Actualizar disponibilidad y confirmamos
UPDATE Motos_eco
SET Disponible = 'SI'
WHERE Matricula = v_matricula;
SELECT Modelo
INTO v_modelo
FROM motos_eco
WHERE Matricula = v_matricula;
DBMS_OUTPUT.PUT_LINE('La moto de matrícula: ' || v_matricula || ' y modelo: ' || v_modelo || ' ahora está disponible');
--Ecopuntos del cliente y actualizar
v_ecopuntos := TRUNC(v_precio_alq/10);
UPDATE Clientes_eco
SET EcoPuntos = EcoPuntos + v_ecopuntos
WHERE DNI = v_dni_cliente;
--Obtener nombre del cliente y actualizamos sus puntos
SELECT Nombre INTO v_nombre_cliente FROM Clientes_eco WHERE Dni = v_dni_cliente;
DBMS_OUTPUT.PUT_LINE('El cliente con DNI: ' || v_dni_cliente || ' y nombre: ' || v_nombrecliente_ || ' tiene un total de ' || EcoPuntos || ' puntos');
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, 'El Alquiler con ID: ' || p_alquilerID || ' no existe.');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20003, 'Error inesperado al registrar la devolución para el Alquiler con ID: ' || p_alquilerID);
END;
/
我真的不知道哪里出了问题,我检查了一千遍也找不到错误。
您的 IF 语句错过了 END IF。