Hola worel001
En PL/SQL se manejan 3 bloques principales tanto en funciones como en procedimientos. Estas son:
Zona de declaración de variables.
Inicio del procedimiento o función
Manejo de excepciones.
El marco general sería:
Código SQL:
Ver originalCREATE OR REPLACE PROCEDURE xxxxx AS
--Aca va la declaracion de variables
BEGIN
--Aca inicia las labores de programación del procedimiento
EXCEPTION WHEN XXXXX THEN
--Aca se manejan las excepciones. Sin embargo, esta clausula es opcional
END;
Donde te salta el error, si te fijas, con la clausula BEGIN estas iniciando labores del procedimiento y posterior a eso tratas de declarar un nuevo cursor. La declaración de este, debe ser al inicio en la zona de declaración.
Al interior del BEGIN, puedes tener subbloques internos tal cual lo estas manejando.
Por el estilo
Tengo también una recomendación para que tengas un codigo mas limpio, haciendo uso de cursores implicitos, que evitan estar abriendo, recorriendo y cerrando cursores.
Por ejemplo, donde tienes:
Código SQL:
Ver originalOPEN v_cursorULTIMA_EJECUCION_JOB;
FETCH v_cursorULTIMA_EJECUCION_JOB INTO v_vJOB_FEC_LECT_INI, v_vJOB_FEC_LECT_FIN;
WHILE (v_cursorULTIMA_EJECUCION_JOB%FOUND IS NULL)
LOOP
BEGIN
--> Avanza a proximo registro del cursor
FETCH v_cursorULTIMA_EJECUCION_JOB INTO v_vJOB_FEC_LECT_INI, v_vJOB_FEC_LECT_FIN;
END;
END LOOP;
CLOSE v_cursorULTIMA_EJECUCION_JOB;
Lo reemplazas por:
Código SQL:
Ver originalSELECT JOB_FEC_LECT_INI INTO v_vJOB_FEC_LECT_INI,
JOB_FEC_LECT_FIN INTO v_vJOB_FEC_LECT_FIN
FROM MII_000_JOB_EXECUTION
WHERE JOB_NAME = 'REGISTRA_PRODUCTOS_BUENOS';
Con esto se cumple la asignación de la consulta a las variables definidas. Donde asumo devuelve siempre un unico registro. De lo contrario, hacer el fetch y llenarlo como lo estas haciendo, no tiene ningún sentido.
Nos cuentas