Oracle
 sql >> Base de données >  >> RDS >> Oracle

Instruction de sélection de requête PHP Oracle à l'intérieur de la boucle lente

Si j'ai bien lu votre code, ce que vous recherchez est une seule instruction MERGE que vous pouvez exécuter sur la base de données. Je ne connais pas PHP, donc je ne peux pas vous dire comment l'appeler, mais je peux vous donner l'instruction SQL à exécuter :

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

Cela fait la jointure que vous étiez en train de réinventer avec vos boucles, la relie à la table dans laquelle vous essayez d'insérer et n'insère une ligne que si elle n'existe pas déjà dans la table.

Vous auriez besoin d'écrire le code PHP pour l'exécuter, après avoir passé le log_date en tant que variable de liaison.

En liant la variable, vous permettez à la base de données d'ignorer l'analyse difficile (c'est-à-dire de trouver la meilleure façon d'exécuter la requête), ce qui fait gagner du temps.

En ne récupérant pas les données et en bouclant manuellement avant de sélectionner plus de données et de déterminer si vous devez faire l'insertion, vous évitez beaucoup de changements de contexte et de transfert/extraction de données sur le réseau. Laissez la base de données faire le gros du travail; c'est ce pour quoi il a été conçu !