Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Instrução de seleção de consulta PHP Oracle dentro de loop lento


Se eu li seu código corretamente, o que você procura é uma única instrução MERGE que pode ser executada no banco de dados. Eu não conheço PHP, então não posso lhe dar como deve ser chamado, mas posso lhe dar a instrução SQL para executar:
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);

Isso faz a junção que você estava reinventando com seus loops, vincula-a de volta à tabela na qual você está tentando inserir e só insere uma linha se ela ainda não existir na tabela.

Você precisaria escrever o código PHP para executar isso, tendo passado o log_date como uma variável de ligação.

Ao vincular a variável, você permite que o banco de dados pule a análise difícil (ou seja, descobrindo a melhor maneira de executar a consulta), o que economiza tempo.

Ao não buscar dados e fazer um loop manual antes de selecionar mais dados e descobrir se você precisa fazer a inserção, você pula uma grande quantidade de alternância de contexto e puxar/enviar dados pela rede. Deixe o banco de dados fazer o trabalho pesado; é o que foi projetado para fazer!