Oracle
 sql >> Database >  >> RDS >> Oracle

Istruzione PHP Oracle query select all'interno del ciclo lento

Se ho letto correttamente il tuo codice, quello che stai cercando è una singola istruzione MERGE che puoi eseguire sul database. Non conosco PHP, quindi non posso darti come dovrebbe essere chiamato, ma posso darti l'istruzione SQL da eseguire:

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);

Questo fa il join che stavi reinventando con i tuoi loop, lo ricollega alla tabella in cui stai cercando di inserire e inserisce una riga solo se non esiste già nella tabella.

Dovresti scrivere il codice PHP per eseguirlo, dopo aver passato log_date come variabile di collegamento.

Associando la variabile, consenti al database di saltare l'analisi hard (ovvero trovare il modo migliore per eseguire la query), risparmiando tempo.

Non recuperando i dati e scorrendo manualmente prima di selezionare più dati e capire se è necessario eseguire l'inserimento, si salta un sacco di cambio di contesto e di estrazione/spingimento di dati attraverso la rete. Lascia che il database faccia il lavoro pesante; è ciò per cui è progettato!