Ver Mensaje Individual
  #6 (permalink)  
Antiguo 11/05/2012, 19:06
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: lectura, actualización e inserción usado BULK COLLECT en PL/SQL

Es cierto que el bulk es más eficiente que los cursores convencionales, pero también tiene sus desventajas, la principal es que sube los registros a un array de memoria en la PGA, y por esto pueden pasar dos cosas, que el tamaño de la PGA sea insuficiente y el proceso termine con error, o que el proceso consuma la mayoría de la PGA y no deje lugar para los demás usuarios, si bien esto se puede controlar con el LIMIT, la solución es relativa porque no todas las PGA's son iguales y un proceso puede funcionar bien en desarrollo y mal en producción.

Si entendí bien la lógica del proceso, puedes evitar el bulk con la consulta:

Código:
PROCEDURE APPAnual
 
INSERT INTO 
 APLICA( AP.id, AP.numero, AP.cont, AP.n_serial, AP.c_serv, AP.u_alta, AP.f_alta, AP.u_baja,AP.f_baja)
SELECT app_seq.NEXTVAL, AP.numero, AP.cont, AP.n_serial, AP.c_serv, AP.u_alta, sysdate, null
 FROM APLICA AP
    WHERE 
     TO_CHAR(AP.F_ALTA,'YYYY') = TO_CHAR(SYSDATE,'YYYY')-1
      AND AP.U_BAJA IS NULL
      AND AP.F_BAJA IS NULL;

        UPDATE aplica A
           SET
              A.u_baja = A.u_baja,
              A.f_baja = SYSDATE
        WHERE
            TO_CHAR(A.F_ALTA,'YYYY') = TO_CHAR(SYSDATE,'YYYY')-1
            AND AP.U_BAJA IS NULL
            AND AP.F_BAJA IS NULL;
 END;
Saludos