Oracle 数据库错误:PLS-00103:在预期出现以下情况之一时遇到符号“异常”/“文件结束”

问题描述 投票:0回答:1

我刚刚开始使用 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;
/

我真的不知道哪里出了问题,我检查了一千遍也找不到错误。

oracle exception plsql eof pls-00103
1个回答
0
投票

您的 IF 语句错过了 END IF。

© www.soinside.com 2019 - 2024. All rights reserved.