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.
[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


0