Oracle - Warning PLS-00103 en Procedimiento PL/SQL

 
Vista:

Warning PLS-00103 en Procedimiento PL/SQL

Publicado por Manu (1 intervención) el 20/11/2008 17:57:45
Hola, estaría eternamente agradecido a quien me pudiese echar una mano con lo siguiente: estoy tratando de ejecutar un procedimiento y me sale el siguiente mensaje de aviso:

[1]: (Warning) PLS-00103: Se ha encontrado el símbolo "end-of-file" cuando se esperaba uno de los siguientes: end not pragma final instantiable order overriding static member constructor map

El código es el siguiente, le he dado unas cuantas vueltas y por más que lo intento no veo el fallo ya sea de sintaxis o lo que sea (La query está probada y funciona 100%):

CREATE OR REPLACE PROCEDURE
PROCEDINTEGRAID(IDSENSORENTR IN NUMBER, IDPORTADORENTR IN NUMBER, IDPERFIL OUT NUMBER, CODIGO OUT NUMBER, DNIE OUT NUMBER,
BIOMETRIA OUT NUMBER, EXITO OUT NUMBER) IS

DECLARE
-- variables que almacenan los datos del perfil más permisivo a devolver
IDPERFILSALIDA IDPERFIL;
CODIGOSALIDA CODIGO;
DNIESALIDA DNIE;
BIOMETRIASALIDA BIOMETRIA;

-- variable que controla que la operación se ha realizado con éxito ya que los parametros integra id no eran nulos
EXITOSALIDA EXITO := 0;

-- contadores que se utilizan para almacenar el nº de permisos de cada clase (codigo, dnie ...) del registro
-- actual que estemos mirando al recorrer el cursor.
CONTNECESARIO NUMBER;
CONTBASTA NUMBER;
CONTNOUTILIZADO NUMBER;

-- contadores que se utilizan para almacenar el nº de permisos de cada clase (codigo, dnie ...) del perfil mas permisivo.
CONTNECESARIOORIG NUMBER := 0;
CONTBASTAORIG NUMBER := 0;
CONTNOUTILIZADOORIG NUMBER := 0;

-- contador que indica si es el 1er registro del cursor
CONTADOR NUMBER := 0;

-- cursor con query que nos devuelve un perfil pasándole previamente el idportador y el idsensor
CURSOR C_PERFILES IS
SELECT DISTINCT PE.IDPERFIL, PE.CODIGO, PE.DNIE, PE.BIOMETRIA
FROM SIPPERFILES PE, SIPPORTADORES PO, SIPPERFILSENSOR PS
WHERE PO.IDPORTADOR = IDPORTADORENTR AND PS.IDSENSOR = IDSENSORENTR AND PS.IDPERFIL = PE.IDPERFIL
AND (PE.IDPERFIL = PO.IDPERFIL OR PE.IDPERFIL = PO.IDPERFIL2
OR PE.IDPERFIL = PO.IDPERFIL3 OR PE.IDPERFIL = PO.IDPERFIL4 OR PE.IDPERFIL = PO.IDPERFIL5);

-- variable que utilizaremos para un cusor implicito que saque el horario del dia actual
DIA_HORARIO VARCHAR2(50) := '';
DIAACTUAL VARCHAR2(50);
HORAACTUAL NUMBER;
HORAPERMITIDA NUMBER;

BEGIN
-- SACAMOS EL PERFIL MAS PERMISIVO DE LOS QUE CONTIENE EL CURSOR
FOR PER_REGISTRO IN C_PERFILES LOOP;
-- declaración implicita del registro que recorre el cursor
-- de esta forma no hace falta open, fetch y close del cursor

CONTNECESARIO := 0;
CONTBASTA := 0;
CONTNOUTILIZADO = 0;

IF(PER_REGISTRO.CODIGO != NULL) AND (PER_REGISTRODNIE != NULL) AND (PER_REGISTROBIOMETRIA != NULL) THEN

IF(CONTADOR = 0) THEN

CASE PER_REC.CODIGO
WHEN 0 THEN CONTNOUTILIZADOORIG := CONTNOUTILIZADOORIG + 1;
WHEN 1 THEN CONTNECESARIOORIG := CONTNECESARIOORIG + 1;
WHEN 2 THEN CONTBASTAORIG := CONTBASTAORIG + 1;
ELSE CONTNOUTILIZADOORIG := CONTNOUTILIZADOORIG + 1;
END CASE;

CASE PER_REC.DNIE
WHEN 0 THEN CONTNOUTILIZADOORIG := CONTNOUTILIZADOORIG + 1;
WHEN 1 THEN CONTNECESARIOORIG := CONTNECESARIOORIG + 1;
WHEN 2 THEN CONTBASTAORIG := CONTBASTAORIG + 1;
ELSE CONTNOUTILIZADOORIG := CONTNOUTILIZADOORIG + 1;
END CASE;

CASE PER_REC.BIOMETRIA
WHEN 0 THEN CONTNOUTILIZADOORIG := CONTNOUTILIZADOORIG + 1;
WHEN 1 THEN CONTNECESARIOORIG := CONTNECESARIOORIG + 1;
WHEN 2 THEN CONTBASTAORIG := CONTBASTAORIG + 1;
ELSE CONTNOUTILIZADOORIG := CONTNOUTILIZADOORIG + 1;
END CASE;

IDPERFILSALIDA := PER_REGISTRO.IDPERFIL;
CODIGOSALIDA := PER_REGISTRO.CODIGO;
DNIESALIDA := PER_REGISTRO.DNIE;
BIOMETRIASALIDA := PER_REGISTRO.BIOMETRIA;

CONTADOR := CONTADOR + 1;

ELSE

CASE PER_REC.CODIGO
WHEN 0 THEN CONTNOUTILIZADO := CONTNOUTILIZADO + 1;
WHEN 1 THEN CONTNECESARIO := CONTNECESARIO + 1;
WHEN 2 THEN CONTBASTA := CONTBASTA + 1;
ELSE CONTNOUTILIZADO := CONTNOUTILIZADO + 1;
END CASE;

CASE PER_REC.DNIE
WHEN 0 THEN CONTNOUTILIZADO := CONTNOUTILIZADO + 1;
WHEN 1 THEN CONTNECESARIO := CONTNECESARIO + 1;
WHEN 2 THEN CONTBASTA := CONTBASTA + 1;
ELSE CONTNOUTILIZADO := CONTNOUTILIZADO + 1;
END CASE;

CASE PER_REC.BIOMETRIA
WHEN 0 THEN CONTNOUTILIZADO := CONTNOUTILIZADO + 1;
WHEN 1 THEN CONTNECESARIO := CONTNECESARIO + 1;
WHEN 2 THEN CONTBASTA := CONTBASTA + 1;
ELSE CONTNOUTILIZADO := CONTNOUTILIZADO + 1;
END CASE;

IF(CONTNECESARIO < CONTNECESARIOORIG) THEN

IDPERFILSALIDA := PER_REGISTRO.IDPERFIL;
CODIGOSALIDA := PER_REGISTRO.CODIGO;
DNIESALIDA := PER_REGISTRO.DNIE;
BIOMETRIASALIDA := PER_REGISTRO.BIOMETRIA;

CONTNOUTILIZADOORIG := CONTNOUTILIZADO;
CONTNECESARIOORIG := CONTNECESARIO;
CONTBASTAORIG := CONTBASTA;

ELSE IF(CONTNECESARIO = CONTNECESARIOORIG) AND (CONTBASTA < CONTBASTAORIG) THEN

IDPERFILSALIDA := PER_REGISTRO.IDPERFIL;
CODIGOSALIDA := PER_REGISTRO.CODIGO;
DNIESALIDA := PER_REGISTRO.DNIE;
BIOMETRIASALIDA := PER_REGISTRO.BIOMETRIA;

CONTNOUTILIZADOORIG := CONTNOUTILIZADO;
CONTNECESARIOORIG := CONTNECESARIO;
CONTBASTAORIG := CONTBASTA;

END IF;

END IF;

END IF;

EXIT WHEN PER_REGISTRO%NOTFOUND;

END LOOP; -- fin del recorrido del cursor

-- COMPROBAMOS EL HORARIO DEL PORTADOR
-- sacamos el dia actual y comprobamos si existe un horario definido para el portador en este dia
SELECT TO_CHAR(SYSDATE, 'day') INTO DIAACTUAL FROM DUAL;

CASE DIAACTUAL
WHEN 'LUNES' THEN SELECT LUNES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'MARTES' THEN SELECT MARTES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'MIERCOLES' THEN SELECT MIERCOLES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'JUEVES' THEN SELECT JUEVES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'VIERNES' THEN SELECT VIERNES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'SABADO' THEN SELECT SABADO INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'DOMINGO' THEN SELECT DOMINGO INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'MONDAY' THEN SELECT LUNES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'TUESDAY' THEN SELECT MARTES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'WEDNESDAY' THEN SELECT MIERCOLES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'THURSDAY' THEN SELECT JUEVES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'FRIDAY' THEN SELECT VIERNES INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'SATURDAY' THEN SELECT SABADO INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
WHEN 'SUNDAY' THEN SELECT DOMINGO INTO DIA_HORARIO FROM SIPHORARIOS WHERE IDPORTADOR = IDPORTADORENTR;
ELSE DIA_HORARIO := '';
END CASE;

IF(DIA_HORARIO != '') AND (DIA_HORARIO != NULL) THEN

-- se saca la hora actual y se comprueba si el portador tiene permiso para entrar en esta hora
SELECT TO_NUMBER(TO_CHAR(SYSDATE, 'HH24')) INTO HORAACTUAL FROM DUAL;

HORAPERMITIDA := TO_NUMBER(SUBSTR(DIA_HORARIO, HORAACTUAL, 1));

IF(HORAPERMITIDA = 0) THEN
EXITOSALIDA := 2;
END IF;

END IF;

EXCEPTION
WHEN NO_DATA_FOUND THEN
EXITOSALIDA := 1;
RETURN;
WHEN OTHERS THEN
EXITOSALIDA := 1;
RAISE;

END;

Gracias de antemano a quien se interese por el tema.

Un Saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Warning PLS-00103 en Procedimiento PL/SQL

Publicado por plsql (1 intervención) el 17/09/2009 21:59:47
revisa los bloques que finalicen correctamente, es decir los if then con su respectivo end if.

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar