занимает много времени, чтобы получить данные из оракула и показать на php - PullRequest
0 голосов
/ 01 декабря 2019

Я работаю с php и oracle, чтобы получить данные из базы данных oracle и появиться в таблице php с кодом php, подключившись к базе данных oracle. Проблема в том, что я получаю данные после долгого времени, пока у меня есть цикл for для запуска другого запроса. Сначала я выполнил запрос, который дает мне полную карту, выпущенную до 23/11/2019 (дата, которую я назначил в запросе), и этот запрос также дает все карты, отмененные с 23/11/2019 по 25/11/2019, здесь ниже запроса в php с oci_excecute ()

    $stid = oci_parse($conn, "
                                select
                                (count(till_today_card_issued) - today_total_canceled) as till_today_card_issued,
                                today_total_canceled
                                from
                                (
                                SELECT
                                    eofficeuat.cardprintlog_cpa.empid as till_today_card_issued,
                                    (
                                      select count(eofficeuat.cardprintlog_cpa.empid)
                                      from 
                                      eofficeuat.cardprintlog_cpa
                                      where
                                      eofficeuat.cardprintlog_cpa.cardstatus='DISCARDED'
                                      and eofficeuat.cardprintlog_cpa.dateofissue BETWEEN TO_DATE('23/11/2019', 'dd/mm/yyyy') AND TO_DATE('25/11/2019', 'dd/mm/yyyy')
                                    ) as today_total_canceled

                                FROM
                                    eofficeuat.cardprintlog_cpa

                                )
                                group by today_total_canceled

                            "
                        );
                      oci_execute($stid);

и здесь ниже код для выборки данных

           $TILL_TODAY_CARD_ISSUED = 0;
                                  $TODAY_TOTAL_CANCELED = 0;
                                while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS))
                                {
                                    $TILL_TODAY_CARD_ISSUED = $row['TILL_TODAY_CARD_ISSUED'];
                                    $TODAY_TOTAL_CANCELED = $row['TODAY_TOTAL_CANCELED'] ;

                                }

Теперь я хотел написать еще один запрос, который может дать общее количество карточек перевыпуска, но условие состоит в том, что сотрудник ранее отменил карточку и снова выполнил ее в период с 23/11/2019 по 25/11/2019. для этого я сделал следующий код

         $canceled_query = oci_parse($conn, "
                                      select eofficeuat.cardprintlog_cpa.empid
                                      from 
                                      eofficeuat.cardprintlog_cpa
                                      where
                                      eofficeuat.cardprintlog_cpa.cardstatus='DISCARDED'

                        ");
                     oci_execute($canceled_query);
                     $emp =  array();

                     while ($row = oci_fetch_array($canceled_query, OCI_ASSOC+OCI_RETURN_NULLS))
                     {
                         $emp[] = $row['EMPID'];
                     }

                     $rissue_emp = array();
                    for($i=0; $i<sizeof($emp); $i++){
                    $rquery = oci_parse($conn, "
                                   select eofficeuat.cardprintlog_cpa.empid
                                      from 
                                      eofficeuat.cardprintlog_cpa
                                      where
                                      eofficeuat.cardprintlog_cpa.cardstatus='READY'
                                      and eofficeuat.cardprintlog_cpa.dateofissue BETWEEN 
       TO_DATE('23/11/2019', 'dd/mm/yyyy') AND TO_DATE('25/11/2019', 'dd/mm/yyyy')
                                      and eofficeuat.cardprintlog_cpa.empid='". $emp[$i] ."'
                        ");
                      oci_execute($rquery);



                     while ($row = oci_fetch_array($rquery, OCI_ASSOC+OCI_RETURN_NULLS)){
                             $rissue_emp[] = $row['EMPID'];
                        }
                    }

и, наконец, отобразил данные в таблице php

      echo "<tr>";
                                    echo "<td>Port Staff</td>";
                                    echo "<td>". $TILL_TODAY_CARD_ISSUED ."</td>";
                                    echo "<td>". $TODAY_TOTAL_CANCELED ."</td>";
                                    echo "<td>". sizeof($rissue_emp) ."</td>";

                                  echo "</tr>";

Теперь проблема в том, что есть цикл for, выполняющий запрос до размера массива, который принимаетмного времени и я получаю результат после долгого времени. Подскажите, пожалуйста, как я могу сделать это быстро, чтобы получить результат? Спасибо

1 Ответ

0 голосов
/ 04 декабря 2019

После того, как вы разберетесь с SQL, как предлагали другие ответы, рассмотрите следующие советы по производительности:

  • Используйте переменные связывания вместо синтаксиса синтаксиса строк, например:

    and eofficeuat.cardprintlog_cpa.empid='". $emp[$i] ."'

    Конкатенация строк представляет собой угрозу безопасности SQL-инъекций,

  • Настройка oci8.default_prefetch или oci_set_prefetch() для сокращения «обходов» между PHP и базой данных приполучение результатов запроса.

...