sql >> Base de Datos >  >> RDS >> Oracle

Declaración de selección de consulta de PHP Oracle dentro del bucle lento

Si he leído su código correctamente, lo que busca es una sola instrucción MERGE que pueda ejecutar en la base de datos. No sé PHP, así que no puedo darte cómo se debe llamar, pero puedo darte la instrucción SQL para ejecutar:

MERGE INTO mep_tbl_output_details tgt
  USING (SELECT mtm.modelid,
                mtm.model_name,
                mtmc.configurationid,
                mtmc.date_code,
                mtmc.read_row_after,
                mtmc.create_from_format,
                mtmc.ip_address,
                mtmc.status,
                mtmc.ts_code
         FROM   mep_tbl_model mtm
                INNER JOIN mep_tbl_model_configuration mtmc ON mtm.modelid = mtmc.modelid_fk
         WHERE  mtm.active = 'Y'
         AND    mtm.location = 'PCBA') src
    ON (tgt.modelid_fk = src.modelid
        AND tgt.ts_code = src.ts_code
        AND tgt.configurationid_fk = src.configurationid
        AND tgt.runningdate = :log_date
        AND tgt.shift = 'Morning'
        AND tgt.quantity_status = 'OK')
WHEN NOT MATCHED THEN
  INSERT (tgt.modelid_fk, tgt.running_date, tgt.quantity_status, tgt.ts_code, tgt.shift, tgt.configuration_fk)
  VALUES (src.modelid, :log_date, 'OK', src.ts_code, 'Morning', src.configurationid);

Esto hace la combinación que estabas reinventando con tus bucles, la vincula de nuevo a la tabla en la que intentas insertarla y solo inserta una fila si aún no existe en la tabla.

Necesitará escribir el código PHP para ejecutar esto, después de haber pasado log_date como una variable de vinculación.

Al vincular la variable, permite que la base de datos omita el análisis duro (es decir, encontrar la mejor manera de ejecutar la consulta), lo que ahorra tiempo.

Al no obtener datos y realizar un bucle manual antes de seleccionar más datos y averiguar si necesita hacer la inserción, se salta una gran cantidad de cambios de contexto y extracción/empuje de datos a través de la red. Deje que la base de datos haga el trabajo pesado; ¡es para lo que está diseñado!