Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Migrar Procedimiento Almacenado desde SQLServer a Oracle

Estas en el tema de Migrar Procedimiento Almacenado desde SQLServer a Oracle en el foro de Oracle en Foros del Web. Que tal chic@s. Espero me puedan ayudar, les cuento: Me toco migrar como 50 query's de SQLServer a Oracle, cosa que ya hice. Mi problema ...
  #1 (permalink)  
Antiguo 22/06/2015, 15:17
 
Fecha de Ingreso: agosto-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Migrar Procedimiento Almacenado desde SQLServer a Oracle

Que tal chic@s. Espero me puedan ayudar, les cuento:
Me toco migrar como 50 query's de SQLServer a Oracle, cosa que ya hice. Mi problema es que tengo que migrar un procedimiento almacenado y me esta costando demasiado, mas aun teniendo que aprender como se trabaja con ellos.

Yo ya hice ciertas cosas, como cambiar los tipos de datos (por ejemplo VARCHAR a TO_CHAR), entre otros...

Ojala alguien me pueda ayudar. De antemano gracias a tod@s.

Les dejo el código:

Código SQL:
Ver original
  1. USE [MIIFDB]
  2. GO
  3. /****** Object:  StoredProcedure [dbo].[spMII_RegistraProductosBuenos]    Script Date: 06/22/2015 15:04:57 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. ALTER PROCEDURE [dbo].[spMII_RegistraProductosBuenos]
  9. AS
  10. ------------------------------------------------------------
  11. --      DECLARE
  12. ------------------------------------------------------------  
  13.  
  14.  
  15.   DECLARE @ERR_LINE INT
  16.   DECLARE @ERR_DESC VARCHAR(1000)
  17.   DECLARE @vPLN_ID VARCHAR(100)
  18.   DECLARE @vLIN_ID VARCHAR(100)
  19.   DECLARE @vEQU_ID VARCHAR(100)
  20.   DECLARE @vEQU_TEORICO  NUMERIC(6,4)
  21.   DECLARE @vEQU_NOTIF_AUTOM VARCHAR(1)
  22.   DECLARE @vTAG_ID VARCHAR(100)
  23.  
  24.   DECLARE @vCOM_AUFNR VARCHAR(12)
  25.  
  26.  
  27.   DECLARE @vMINUTOS_ES_MICROPARADA INT
  28.   DECLARE @vEQU_ID_ONOFF VARCHAR(100)
  29.  
  30.   DECLARE @vTIEMPO_MICROPARADA INT
  31.   DECLARE @vES_LABORABLE VARCHAR(2)
  32.   DECLARE @vBUF_FECHA_SYS_MII datetime
  33.   DECLARE @vBUF_VALOR VARCHAR(100)
  34.   DECLARE @vFECHA_CORTE VARCHAR(100)
  35.   DECLARE @vFECHA_CORTE_DATE DATETIME
  36.   DECLARE @vTURNO_ACTUAL INT
  37.   DECLARE @vMINUTOS_EVENTO INT
  38.   DECLARE @vMINUTOS_EVENTO_ACTUAL INT
  39.   DECLARE @vCANTIDAD_REGISTROS_PERIODO INT
  40.  
  41.   DECLARE @vULTIMA_FECHA_JOB VARCHAR(100)
  42.  
  43.  
  44.   DECLARE @vULT_TDE_ID VARCHAR(100)
  45.   DECLARE @vULT_OPR_FEC_INI_OCURRENCIA datetime
  46.   DECLARE @vULT_OPR_FEC_FIN_OCURRENCIA datetime
  47.   DECLARE @vULT_OPR_FEC_FIN_OCURRENCIA_PLUS_1_SEC datetime
  48.   DECLARE @vULT_TUR_ID INT
  49.   DECLARE @vULT_TDE_ID_TRADUCIDO VARCHAR(100)
  50.   DECLARE @vULT_OPR_ID NUMERIC(18,0)
  51.  
  52.   DECLARE @vJOB_FEC_LECT_INI datetime
  53.   DECLARE @vJOB_FEC_LECT_FIN datetime
  54.  
  55.   DECLARE @vJOB_FEC_LECT_INI_STR VARCHAR(100)
  56.   DECLARE @vJOB_FEC_LECT_FIN_STR VARCHAR(100)
  57.  
  58.   DECLARE @vULT_NOBUFFER_TDE_ID VARCHAR(100)
  59.   DECLARE @vULT_NOBUFFER_OPR_FEC_INI_OCURRENCIA datetime
  60.   DECLARE @vULT_NOBUFFER_OPR_FEC_FIN_OCURRENCIA datetime
  61.   DECLARE @vULT_NOBUFFER_TUR_ID INT
  62.   DECLARE @vULT_NOBUFFER_TDE_ID_TRADUCIDO VARCHAR(100)
  63.   DECLARE @vULT_NOBUFFER_OPR_ID NUMERIC(18,0)
  64.   DECLARE @vULT_NOBUFFER_TURNO_ACTUAL INT
  65.   DECLARE @vULT_NOBUFFER_MINUTOS_EVENTO INT
  66.  
  67.   DECLARE @vTURNO_ACTUAL_FECHA_INICIO datetime
  68.  
  69.   DECLARE @vCORRELATIVO_LOTE NUMERIC(30,0)
  70.  
  71.  
  72.   -----------------------------------------------------------
  73.   -->       CURSOR  ULTIMA EJECUCION JOB
  74.   ------------------------------------------------------------
  75.     DECLARE @cursorULTIMA_EJECUCION_JOB cursor  
  76.  
  77.     SET @cursorULTIMA_EJECUCION_JOB = CURSOR FOR
  78.         SELECT JOB_FEC_LECT_INI,
  79.                JOB_FEC_LECT_FIN
  80.           FROM MII_000_JOB_EXECUTION
  81.         WHERE JOB_NAME = 'REGISTRA_PRODUCTOS_BUENOS'
  82.  
  83.     OPEN @cursorULTIMA_EJECUCION_JOB
  84.     FETCH NEXT FROM @cursorULTIMA_EJECUCION_JOB INTO @vJOB_FEC_LECT_INI, @vJOB_FEC_LECT_FIN
  85.  
  86.     WHILE (@@FETCH_STATUS = 0)
  87.     BEGIN  
  88.         --> Avanza a proximo registro del cursor
  89.         FETCH NEXT FROM @cursorULTIMA_EJECUCION_JOB INTO @vJOB_FEC_LECT_INI, @vJOB_FEC_LECT_FIN
  90.     END
  91.     CLOSE @cursorULTIMA_EJECUCION_JOB
  92.     DEALLOCATE @cursorULTIMA_EJECUCION_JOB 
  93.     --> Cierra y Libera Los cursores
  94.    
  95.     --> Convierte y asigna fechas en formato varchar
  96.     SET @vJOB_FEC_LECT_INI_STR = TO_CHAR(@vJOB_FEC_LECT_INI, 'DD/MM/YYYY HH24:MI:SS')
  97.     SET @vJOB_FEC_LECT_FIN_STR = TO_CHAR(@vJOB_FEC_LECT_FIN, 'DD/MM/YYYY HH24:MI:SS')
  98.  
  99.  
  100.  
  101.     PRINT N'Fecha Proceso: ' + @vJOB_FEC_LECT_INI_STR + ' ' + @vJOB_FEC_LECT_FIN_STR
  102.  
  103.  ------------------------------------------------------------
  104.  --     CURSOR   LINEAS
  105.  ------------------------------------------------------------
  106.   DECLARE @cursorPLN_LIN cursor
  107.  
  108.   SET @cursorPLN_LIN = CURSOR FOR
  109.         SELECT p.PLN_ID,
  110.                l.LIN_ID,
  111.                e.EQU_ID,
  112.                e.EQU_TEORICO,
  113.                e.EQU_NOTIF_AUTOM,
  114.                v.TAG_ID
  115.           FROM MII_PLANTA p,
  116.                MII_LINEA l,
  117.                MII_VARIABLE_PLC v,
  118.                MII_EQUIPO e
  119.          WHERE p.PLN_ID = l.PLN_ID
  120.            AND p.PLN_ID = v.PLN_ID
  121.            AND l.LIN_ID = v.LIN_ID
  122.            AND v.EQU_ID = e.EQU_ID
  123.            AND v.PLN_ID = p.PLN_ID
  124.            AND v.LIN_ID = l.LIN_ID
  125.            AND p.PLN_VIGENTE = 1
  126.            AND l.LIN_VIGENTE = 1
  127.            AND v.TVA_ID = 'CAN'
  128.            AND EQU_NOTIF = 1
  129.  
  130.   ------------------------------------------------------------
  131.   --        BEGIN
  132.   ------------------------------------------------------------
  133.   SET @ERR_LINE = 10
  134.   SET @ERR_DESC = '[' + TO_CHAR(@ERR_LINE) + '] ' + 'Abre cursor Planta - Linea'
  135.   PRINT @ERR_DESC
  136.  
  137.   ---------------------------------------------------------------------------------------------
  138.   --  Transforma Fecha sys en Formato Fecha '01/07/2013 16:00:02' --> '07/01/2013 16:00:02'
  139.   ---------------------------------------------------------------------------------------------
  140.   SET @vFECHA_CORTE = TO_CHAR(sysdate, 'DD/MM/YYYY HH24:MI:SS')
  141.   SET @vFECHA_CORTE_DATE = TO_DATE(@vFECHA_CORTE, 'DD/MM/YYYY HH24:MI:SS')
  142.  
  143.  
  144.   BEGIN TRY
  145.   OPEN @cursorPLN_LIN
  146.  
  147.     --> Avanza a proximo registro del cursor
  148.     FETCH NEXT FROM @cursorPLN_LIN INTO @vPLN_ID, @vLIN_ID, @vEQU_ID, @vEQU_TEORICO, @vEQU_NOTIF_AUTOM, @vTAG_ID
  149.  
  150.     WHILE (@@FETCH_STATUS = 0)
  151.     BEGIN  
  152.  
  153.         SET @ERR_LINE = 20
  154.         SET @ERR_DESC = '[' + TO_CHAR(@ERR_LINE) + '] Planta: ' + TO_CHAR(@vPLN_ID) + ' Linea: ' + TO_CHAR(@vLIN_ID)+ ' Equipo: ' + TO_CHAR(@vEQU_ID)+ ' Teórico: ' + TO_CHAR(@vEQU_TEORICO)+ ' TAG_ID: ' + TO_CHAR(@vTAG_ID)
  155.         PRINT @ERR_DESC
  156.  
  157.         --> OBTIENE LA CANTIDAD DE REGISTROS
  158.         SELECT @vCANTIDAD_REGISTROS_PERIODO = COUNT(*)
  159.           FROM MII_BUFFER_PLC b
  160.          WHERE b.TAG_ID = @vTAG_ID
  161.            AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') > TO_DATE(@vJOB_FEC_LECT_FIN, 'DD/MM/YYYY HH24:MI:SS') AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') <= TO_DATE(@vFECHA_CORTE_DATE, 'DD/MM/YYYY HH24:MI:SS')
  162.  
  163.         IF @vCANTIDAD_REGISTROS_PERIODO <= 0
  164.             BEGIN
  165.                 SET @ERR_LINE = 1000
  166.                 SET @ERR_DESC = '[' + TO_CHAR(@ERR_LINE) + '] Registros (TAG_ID): ' + TO_CHAR(@vCANTIDAD_REGISTROS_PERIODO)
  167.                 PRINT @ERR_DESC
  168.             END
  169.         ELSE
  170.             BEGIN
  171.                 SET @ERR_LINE = 2000
  172.                 SET @ERR_DESC = '[' + TO_CHAR(@ERR_LINE) + '] Registros (TAG_ID): ' + TO_CHAR(@vCANTIDAD_REGISTROS_PERIODO)
  173.                 PRINT @ERR_DESC
  174.  
  175.                 --> Reserva Proximo Correlativo de Proceso / Lote
  176.                 SELECT @vCORRELATIVO_LOTE = dbo.fnObtieneCorrelativo('LOTE_CONTEO_BUENOS_BUFFER')
  177.                 UPDATE MII_000_CORRELATIVO_MANUAL
  178.                    SET CORRELATIVO_ID = @vCORRELATIVO_LOTE
  179.                  WHERE CORRELATIVO_NAME = 'LOTE_CONTEO_BUENOS_BUFFER'
  180.                 -- Reserva Proximo Correlativo de Proceso / Lote <--
  181.  
  182.  
  183.                 --> Asigna Numero de Lote a registros de Buffer
  184.                 UPDATE MII_BUFFER_PLC
  185.                    SET BUF_LOTE_ID = @vCORRELATIVO_LOTE
  186.                  WHERE TAG_ID = @vTAG_ID
  187.                    AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') > TO_DATE(@vJOB_FEC_LECT_FIN, 'DD/MM/YYYY HH24:MI:SS') AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') <= TO_DATE(@vFECHA_CORTE_DATE, 'DD/MM/YYYY HH24:MI:SS')
  188.  
  189.  
  190.                 SELECT @vCANTIDAD_REGISTROS_PERIODO = COUNT(*)
  191.                   FROM MII_BUFFER_PLC
  192.                  WHERE BUF_LOTE_ID = @vCORRELATIVO_LOTE
  193.                    AND TAG_ID = @vTAG_ID
  194.  
  195.  
  196.                 --> Obtiene Orden Activa del Equipo
  197.                 SELECT @vCOM_AUFNR = NVL(COM_AUFNR,NULL)
  198.                   FROM MII_PROD_ORDEN_ACTIVA
  199.                 WHERE EQU_ID = @vEQU_ID
  200.  
  201.  
  202.                 --> Persiste la cantidad de Registros
  203.                 EXECUTE dbo.spMII_PUT_ProductosBuenos @vPLN_ID, @vLIN_ID, @vEQU_ID, @vCANTIDAD_REGISTROS_PERIODO, @vCOM_AUFNR, @vCANTIDAD_REGISTROS_PERIODO
  204.  
  205.             END
  206.  
  207.  
  208.         PRINT N'------------------------ CORTE PLN_LIN_EQU_TAG ---------------------------------------'
  209.         --> Avanza a proximo registro del cursor
  210.         FETCH NEXT FROM @cursorPLN_LIN INTO @vPLN_ID, @vLIN_ID, @vEQU_ID, @vEQU_TEORICO, @vEQU_NOTIF_AUTOM, @vTAG_ID
  211.     END
  212.  
  213.  
  214.     --------------------------------------------------------------------
  215.     --  FIN Recorre Planta Linea (a)
  216.     --------------------------------------------------------------------
  217.  
  218.  
  219.  
  220.     SET @ERR_LINE = 90000
  221.     SET @ERR_DESC = '[' + TO_CHAR(@ERR_LINE) + '] ' + 'Actualizacion Fechas Ejecucion JOB REGISTRA_TIEMPO_OPERACION '
  222.     PRINT @ERR_DESC
  223.  
  224.  
  225.      UPDATE MII_000_JOB_EXECUTION
  226.         SET JOB_FEC_UPD = sysdate,
  227.             JOB_FEC_LECT_INI = @vJOB_FEC_LECT_FIN,
  228.             JOB_FEC_LECT_FIN = @vFECHA_CORTE_DATE
  229.       WHERE JOB_NAME = 'REGISTRA_PRODUCTOS_BUENOS'
  230.  
  231.  
  232.     SET @ERR_LINE = 1000000
  233.     SET @ERR_DESC = '[' + TO_CHAR(@ERR_LINE) + '] ' + 'Proceso Finalizado con Exito'
  234.     PRINT @ERR_DESC
  235.  
  236.     SELECT @ERR_LINE LINEA, @ERR_DESC DESCRIPCION, NVL(ERROR_NUMBER(),0) ERR_NUMBER, NVL(ERROR_MESSAGE(),'Exito') ERR_MESSAGE, NVL(ERROR_LINE(),0) ERR_LINE
  237.   END TRY
  238.   BEGIN CATCH
  239.     SELECT @ERR_LINE LINEA, @ERR_DESC DESCRIPCION, NVL(ERROR_NUMBER(),0) ERR_NUMBER, NVL(ERROR_MESSAGE(),'Exito') ERR_MESSAGE, NVL(ERROR_LINE(),0) ERR_LINE
  240.   END CATCH;
  241.   ------------------------------------------------------------
  242.   --        END
  243.   ------------------------------------------------------------
  244.  
  245. --> Cierra y Libera Los cursores
  246. CLOSE @cursorPLN_LIN
  247. DEALLOCATE @cursorPLN_LIN

Última edición por gnzsoloyo; 23/06/2015 a las 08:01
  #2 (permalink)  
Antiguo 23/06/2015, 11:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Migrar Procedimiento Almacenado desde SQLServer a Oracle

La verdad es que es dificil explicarte todo lo que debes corregir, porque es mucho. Migrar rutinas almacenadas entre DBMS es siempre una tarea de galeotes, porque al no existir un lenguaje procedural estándar la mejor solución suele ser reescribir completamente todo el codigo.

- No existe el GO.
- Las variables se declaran en el SP.
- No se usan "@" para las variables ni para los parámetros.
- No puedes crear un cursor de ese modo. En Oracle se hacen de otra forma.
- Las columnas de tipo VARCHAR son obsoletas. Se debe usar VARCHAR2.
- El PRINT no funciona en Oracle.
- El FETCH lleva otra sintaxis.
- El cierre de sentencias es con ";", no con saltos de linea.
- El control de errores se hace con EXCEPTION.
- No conviene usar ALTER PROCEDURE, sino CREATE OR REPLACE.
- Muchas, muchas otras cosas...

La verdad, ,yo te recomendaría comenzar por crear algunos Sp de prueba, basados en el manual de referencia, y recién cuando entiendas como se crean en Oracle, ponerse a migrar la logica base de lo que tienes al PL/SQL.
No intentes pensar como SQL Server. No te servirá.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/06/2015, 07:08
 
Fecha de Ingreso: agosto-2009
Mensajes: 12
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Migrar Procedimiento Almacenado desde SQLServer a Oracle

Que tal "gnzsoloyo" y garcias por responder. Mira mas abajo dejo el codigo de lo que he hecho ahsta el momento.
Al ejecutarlo el unico error que me tira es este, ojala me puedas ayudar con eso: "PLS-00103: Encountered the symbol 'Cursor' ". (Dejare marcada la parte del codigo donde aparece el error)

Y este es el codigo. Saludos y gracias
Código SQL:
Ver original
  1. CREATE OR REPLACE PROCEDURE spMII_RegistraProductosBuenos AS
  2.    ------------------------------------------------------------
  3.    --       DECLARE
  4.    ------------------------------------------------------------
  5.    
  6.    v_ERR_LINE NUMBER(10,0);
  7.    v_ERR_DESC VARCHAR2(1000);
  8.    v_vPLN_ID VARCHAR2(100);
  9.    v_vLIN_ID VARCHAR2(100);
  10.    v_vEQU_ID VARCHAR2(100);
  11.    v_vEQU_TEORICO NUMBER(6,4);
  12.    v_vEQU_NOTIF_AUTOM VARCHAR2(1);
  13.    v_vTAG_ID VARCHAR2(100);
  14.    v_vCOM_AUFNR VARCHAR2(12);
  15.    v_vMINUTOS_ES_MICROPARADA NUMBER(10,0);
  16.    v_vEQU_ID_ONOFF VARCHAR2(100);
  17.    v_vTIEMPO_MICROPARADA NUMBER(10,0);
  18.    v_vES_LABORABLE VARCHAR2(2);
  19.    v_vBUF_FECHA_SYS_MII DATE;
  20.    v_vBUF_VALOR VARCHAR2(100);
  21.    v_vFECHA_CORTE VARCHAR2(100);
  22.    v_vFECHA_CORTE_DATE DATE;
  23.    v_vTURNO_ACTUAL NUMBER(10,0);
  24.    v_vMINUTOS_EVENTO NUMBER(10,0);
  25.    v_vMINUTOS_EVENTO_ACTUAL NUMBER(10,0);
  26.    v_vCANTIDAD_REGISTROS_PERIODO NUMBER(10,0);
  27.    v_vULTIMA_FECHA_JOB VARCHAR2(100);
  28.    v_vULT_TDE_ID VARCHAR2(100);
  29.    v_vULT_OPR_FEC_INI_OCURRENCIA DATE;
  30.    v_vULT_OPR_FEC_FIN_OCURRENCIA DATE;
  31.    v_vULT_OPR_FEC_FIN_OCURRENCIA_ DATE;
  32.    v_vULT_TUR_ID NUMBER(10,0);
  33.    v_vULT_TDE_ID_TRADUCIDO VARCHAR2(100);
  34.    v_vULT_OPR_ID NUMBER(18,0);
  35.    v_vJOB_FEC_LECT_INI DATE;
  36.    v_vJOB_FEC_LECT_FIN DATE;
  37.    v_vJOB_FEC_LECT_INI_STR VARCHAR2(100);
  38.    v_vJOB_FEC_LECT_FIN_STR VARCHAR2(100);
  39.    v_vULT_NOBUFFER_TDE_ID VARCHAR2(100);
  40.    v_vULT_NOBUFFER_OPR_FEC_INI_OC DATE;
  41.    v_vULT_NOBUFFER_OPR_FEC_FIN_OC DATE;
  42.    v_vULT_NOBUFFER_TUR_ID NUMBER(10,0);
  43.    v_vULT_NOBUFFER_TDE_ID_TRADUCI VARCHAR2(100);
  44.    v_vULT_NOBUFFER_OPR_ID NUMBER(18,0);
  45.    v_vULT_NOBUFFER_TURNO_ACTUAL NUMBER(10,0);
  46.    v_vULT_NOBUFFER_MINUTOS_EVENTO NUMBER(10,0);
  47.    v_vTURNO_ACTUAL_FECHA_INICIO DATE;
  48.    v_vCORRELATIVO_LOTE NUMBER(30,0);
  49.    
  50.    -----------------------------------------------------------
  51.    -->      CURSOR  ULTIMA EJECUCION JOB
  52.    ------------------------------------------------------------
  53.     CURSOR v_cursorULTIMA_EJECUCION_JOB IS
  54.         SELECT  JOB_FEC_LECT_INI,
  55.                 JOB_FEC_LECT_FIN
  56.         FROM MII_000_JOB_EXECUTION
  57.         WHERE JOB_NAME = 'REGISTRA_PRODUCTOS_BUENOS';
  58.  
  59.     BEGIN
  60.         OPEN v_cursorULTIMA_EJECUCION_JOB;
  61.         FETCH v_cursorULTIMA_EJECUCION_JOB INTO v_vJOB_FEC_LECT_INI, v_vJOB_FEC_LECT_FIN;
  62.        
  63.         WHILE (v_cursorULTIMA_EJECUCION_JOB%FOUND IS NULL)
  64.         LOOP
  65.             BEGIN
  66.                 --> Avanza a proximo registro del cursor
  67.                 FETCH v_cursorULTIMA_EJECUCION_JOB INTO v_vJOB_FEC_LECT_INI, v_vJOB_FEC_LECT_FIN;
  68.             END;
  69.         END LOOP;
  70.     CLOSE v_cursorULTIMA_EJECUCION_JOB;
  71.         --> Cierra y Libera Los cursores
  72.        
  73.         --> Convierte y asigna fechas en formato varchar
  74.         v_vJOB_FEC_LECT_INI_STR := TO_CHAR(v_vJOB_FEC_LECT_INI, 'DD/MM/YYYY HH24:MI:SS');
  75.         v_vJOB_FEC_LECT_FIN_STR := TO_CHAR(v_vJOB_FEC_LECT_FIN, 'DD/MM/YYYY HH24:MI:SS');
  76.         DBMS_OUTPUT.PUT_LINE(N'Fecha Proceso: ' || v_vJOB_FEC_LECT_INI_STR || ' ' || v_vJOB_FEC_LECT_FIN_STR);
  77.     END;
  78.  
  79.    ------------------------------------------------------------
  80.    --       CURSOR   LINEAS
  81.    ------------------------------------------------------------
  82.     CURSOR v_cursorPLN_LIN IS            -------->>>>>>> EN ESTA LINEA ME APARECE EL ERROR
  83.         SELECT
  84.             p.PLN_ID,
  85.             l.LIN_ID,
  86.             e.EQU_ID,
  87.             e.EQU_TEORICO,
  88.             e.EQU_NOTIF_AUTOM,
  89.             v.TAG_ID
  90.         FROM MII_PLANTA p,
  91.             MII_LINEA l,
  92.             MII_VARIABLE_PLC v,
  93.             MII_EQUIPO e
  94.         WHERE
  95.             p.PLN_ID = l.PLN_ID AND
  96.             p.PLN_ID = v.PLN_ID AND
  97.             l.LIN_ID = v.LIN_ID AND
  98.             v.EQU_ID = e.EQU_ID AND
  99.             v.PLN_ID = p.PLN_ID AND
  100.             v.LIN_ID = l.LIN_ID AND
  101.             p.PLN_VIGENTE = 1 AND
  102.             l.LIN_VIGENTE = 1 AND
  103.             v.TVA_ID = 'CAN' AND
  104.             EQU_NOTIF = 1;
  105.      
  106.         ------------------------------------------------------------
  107.         --      BEGIN
  108.         ------------------------------------------------------------
  109.         v_ERR_LINE := 10;
  110.         v_ERR_DESC := '[' || TO_CHAR(v_ERR_DESC) || '] ' || 'Abre cursor Planta - Linea';
  111.         DBMS_OUTPUT.PUT_LINE(v_ERR_DESC);
  112.    
  113.         ---------------------------------------------------------------------------------------------
  114.         --  Transforma Fecha sys en Formato Fecha '01/07/2013 16:00:02' --> '07/01/2013 16:00:02'
  115.         ---------------------------------------------------------------------------------------------
  116.         v_vFECHA_CORTE := TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
  117.         v_vFECHA_CORTE_DATE := TO_DATE(v_vFECHA_CORTE, 'DD/MM/YYYY HH24:MI:SS');
  118.    
  119.         BEGIN
  120.             OPEN v_cursorPLN_LIN;
  121.                 --> Avanza a proximo registro del cursor
  122.                 FETCH V_CURSORPLN_LIN INTO V_VPLN_ID, V_VLIN_ID, V_VEQU_ID, V_VEQU_TEORICO, V_VEQU_NOTIF_AUTOM, V_VTAG_ID;
  123.                 WHILE (v_cursorPLN_LIN%FOUND IS NULL)
  124.                 LOOP
  125.                    
  126.                     BEGIN
  127.                         V_ERR_LINE := 20 ;
  128.                         v_ERR_DESC := '[' || TO_CHAR(v_ERR_LINE) || '] Planta: ' || TO_CHAR(v_vPLN_ID) || ' Linea: ' || TO_CHAR(v_vLIN_ID) || ' Equipo: ' || TO_CHAR(v_vEQU_ID) || ' Te?rico: ' || TO_CHAR(v_vEQU_TEORICO) || ' TAG_ID: ' || TO_CHAR(v_vTAG_ID) ;
  129.                         DBMS_OUTPUT.PUT_LINE(V_ERR_DESC);
  130.                        
  131.                         --> OBTIENE LA CANTIDAD DE REGISTROS
  132.                         SELECT COUNT(*) INTO v_vCANTIDAD_REGISTROS_PERIODO
  133.                         FROM MII_BUFFER_PLC B
  134.                         WHERE B.TAG_ID = V_VTAG_ID
  135.                             AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') > TO_DATE(V_VJOB_FEC_LECT_FIN, 'DD/MM/YYYY HH24:MI:SS');
  136.                             AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') <= TO_DATE(v_vFECHA_CORTE_DATE, 'DD/MM/YYYY HH24:MI:SS');
  137.                        
  138.                        
  139.                         IF v_vCANTIDAD_REGISTROS_PERIODO <= 0 THEN
  140.                             BEGIN
  141.                                 V_ERR_LINE := 1000 ;
  142.                                 v_ERR_DESC := '[' || TO_CHAR(v_ERR_LINE) || '] Registros (TAG_ID): ' || TO_CHAR(v_vCANTIDAD_REGISTROS_PERIODO) ;
  143.                                 DBMS_OUTPUT.PUT_LINE(v_ERR_DESC);
  144.                             END;
  145.                         ELSE
  146.                    
  147.                             BEGIN
  148.                                 v_ERR_LINE := 2000;
  149.                                 v_ERR_DESC := '[' || TO_CHAR(v_ERR_LINE) || '] Registros (TAG_ID): ' || TO_CHAR(v_vCANTIDAD_REGISTROS_PERIODO) ;
  150.                                 DBMS_OUTPUT.PUT_LINE(V_ERR_DESC);
  151.  
  152.                                 --> Reserva Proximo Correlativo de Proceso / Lote
  153.                                 SELECT v_vCORRELATIVO_LOTE := fn.ObtieneCorrelativo('LOTE_CONTEO_BUENOS_BUFFER') ;   --VERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
  154.                                 UPDATE MII_000_CORRELATIVO_MANUAL
  155.                                 SET CORRELATIVO_ID = v_vCORRELATIVO_LOTE
  156.                                 WHERE CORRELATIVO_NAME = 'LOTE_CONTEO_BUENOS_BUFFER';
  157.                                 -- Reserva Proximo Correlativo de Proceso / Lote <--
  158.  
  159.  
  160.                                 --> Asigna Numero de Lote a registros de Buffer
  161.                                 UPDATE MII_BUFFER_PLC
  162.                                 SET BUF_LOTE_ID = v_vCORRELATIVO_LOTE
  163.                                 WHERE TAG_ID = V_VTAG_ID
  164.                                     AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') > TO_DATE(V_VJOB_FEC_LECT_FIN, 'DD/MM/YYYY HH24:MI:SS');
  165.                                     AND TO_DATE(BUF_FECHA_SYS_MII, 'DD/MM/YYYY HH24:MI:SS') <= TO_DATE(v_vFECHA_CORTE_DATE, 'DD/MM/YYYY HH24:MI:SS');
  166.                                                
  167.                                 SELECT COUNT(*) INTO v_vCANTIDAD_REGISTROS_PERIODO
  168.                                 FROM MII_BUFFER_PLC
  169.                                 WHERE BUF_LOTE_ID = v_vCORRELATIVO_LOTE
  170.                                     AND TAG_ID = v_vTAG_ID;
  171.                                              
  172.                                    
  173.                                 --> Obtiene Orden Activa del Equipo
  174.                                 SELECT NVL(COM_AUFNR, NULL) INTO v_vCOM_AUFNR
  175.                                 FROM MII_PROD_ORDEN_ACTIVA
  176.                                 WHERE EQU_ID = v_vEQU_ID;
  177.  
  178.                                 --> Persiste la cantidad de Registros
  179.                                 spMII_PUT_ProductosBuenos(v_vPLN_ID,
  180.                                                         v_vLIN_ID,
  181.                                                         v_vEQU_ID,
  182.                                                         v_vCANTIDAD_REGISTROS_PERIODO,
  183.                                                         v_vCOM_AUFNR,
  184.                                                         v_vCANTIDAD_REGISTROS_PERIODO);
  185.                            
  186.                             END;
  187.                         END IF;
  188.                         DBMS_OUTPUT.PUT_LINE(N'------------------------ CORTE PLN_LIN_EQU_TAG ---------------------------------------');
  189.                         --> Avanza a proximo registro del cursor
  190.                         FETCH v_cursorPLN_LIN INTO v_vPLN_ID,v_vLIN_ID,v_vEQU_ID,v_vEQU_TEORICO,v_vEQU_NOTIF_AUTOM,v_vTAG_ID;
  191.                     END;
  192.                 END LOOP;
  193.        
  194.                 --------------------------------------------------------------------
  195.                 --  FIN Recorre Planta Linea (a)
  196.                 --------------------------------------------------------------------
  197.                 v_ERR_LINE := 90000 ;
  198.                 v_ERR_DESC := '[' || TO_CHAR(v_ERR_LINE) || '] ' || 'Actualizacion Fechas Ejecucion JOB REGISTRA_TIEMPO_OPERACION ' ;
  199.                 DBMS_OUTPUT.PUT_LINE(V_ERR_DESC);
  200.                  
  201.                 UPDATE MII_000_JOB_EXECUTION
  202.                 SET JOB_FEC_UPD = SYSDATE,
  203.                     JOB_FEC_LECT_INI = v_vJOB_FEC_LECT_FIN,
  204.                     JOB_FEC_LECT_FIN = v_vFECHA_CORTE_DATE
  205.                 WHERE JOB_NAME = 'REGISTRA_PRODUCTOS_BUENOS';
  206.  
  207.                 V_ERR_LINE := 1000000 ;
  208.                 v_ERR_DESC := '[' || TO_CHAR(v_ERR_LINE) || '] ' || 'Proceso Finalizado con Exito' ;
  209.                 DBMS_OUTPUT.PUT_LINE(v_ERR_DESC);
  210.          
  211.                 OPEN  cv_1 FOR
  212.                     SELECT v_ERR_LINE LINEA  ,
  213.                            v_ERR_DESC DESCRIPCION  ,
  214.                            NVL(SQLCODE, 0) ERR_NUMBER  ,
  215.                            NVL(SQLERRM, 'Exito') ERR_MESSAGE  ,
  216.                            NVL(NULL/*TODO:ERROR_LINE()*/, 0) ERR_LINE  
  217.                       FROM DUAL;
  218.                 END;
  219.             END;
  220.         END;   
  221.    ------------------------------------------------------------
  222.    --       END
  223.    ------------------------------------------------------------
  224.    --> Cierra y Libera Los cursores
  225.             CLOSE v_cursorPLN_LIN;
  226. END;

Última edición por gnzsoloyo; 24/06/2015 a las 07:14 Razón: Usar HIGHLIGHT SQL, por favor.
  #4 (permalink)  
Antiguo 24/06/2015, 09:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 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

Etiquetas: oracle11g, sql, sql-server-2008
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:35.