Ver Mensaje Individual
  #4 (permalink)  
Antiguo 24/06/2015, 09:18
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Migrar Procedimiento Almacenado desde SQLServer a Oracle

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 original
  1. CREATE OR REPLACE PROCEDURE xxxxx AS
  2. --Aca va la declaracion de variables
  3. BEGIN
  4. --Aca inicia las labores de programación del procedimiento
  5. EXCEPTION WHEN XXXXX THEN
  6. --Aca se manejan las excepciones. Sin embargo, esta clausula es opcional
  7. 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
Código SQL:
Ver original
  1. BEGIN
  2.   BEGIN
  3.   --Codigo
  4.   END;
  5. END;

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 original
  1. OPEN v_cursorULTIMA_EJECUCION_JOB;
  2.         FETCH v_cursorULTIMA_EJECUCION_JOB INTO v_vJOB_FEC_LECT_INI, v_vJOB_FEC_LECT_FIN;
  3.        
  4.         WHILE (v_cursorULTIMA_EJECUCION_JOB%FOUND IS NULL)
  5.         LOOP
  6.             BEGIN
  7.                 --> Avanza a proximo registro del cursor
  8.                 FETCH v_cursorULTIMA_EJECUCION_JOB INTO v_vJOB_FEC_LECT_INI, v_vJOB_FEC_LECT_FIN;
  9.             END;
  10.         END LOOP;
  11.     CLOSE v_cursorULTIMA_EJECUCION_JOB;
Lo reemplazas por:
Código SQL:
Ver original
  1. SELECT  JOB_FEC_LECT_INI INTO v_vJOB_FEC_LECT_INI,
  2.                 JOB_FEC_LECT_FIN INTO  v_vJOB_FEC_LECT_FIN
  3.         FROM MII_000_JOB_EXECUTION
  4.         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
__________________
Without data, You are another person with an opinion.
W. Edwads Deming