Symfony SQL иногда нет результатов - PullRequest
0 голосов
/ 28 мая 2019

У меня есть sql, который должен дать мне список, но иногда результат будет пустым. Это происходит случайно. Там нет никаких изменений в пользователя, версии или что-нибудь. Просто еще один запрос, который иногда будет пустым.

Существует таблица базы данных, в которой есть триггер для архивации значений. Если новая строка вставлена, то в таблице истории создается новая строка. Для новой таблицы есть столбцы «validFrom», которые будут установлены на sysdate. Если обновлено, старая строка будет установлена ​​с «validUntil», и новая строка будет вставлена. Эта таблица имеет индекс SUB_ID.

Таблица не является материализованным представлением или представлением. Просто простой стол.

SQL

SELECT h.ID, h.SUB_ID
FROM history h
WHERE 1=1
AND h.SUB_ID = :subId
                    AND (
                        1=1
                        AND ( 
                            TO_DATE(:startDate, 'YYYY-MM-DD HH24:MI:SS') >= h.VALIDFROM
                            AND TO_DATE(:startDate, 'YYYY-MM-DD HH24:MI:SS') <= NVL(h.VALIDUNTIL,sysdate)
                        ) OR ( 
                            TO_DATE(:startDate, 'YYYY-MM-DD HH24:MI:SS') <= h.VALIDFROM
                            AND TO_DATE(:endDate, 'YYYY-MM-DD HH24:MI:SS') >= NVL(h.VALIDUNTIL,sysdate)
                        ) OR ( 
                            TO_DATE(:endDate, 'YYYY-MM-DD HH24:MI:SS') >= h.VALIDFROM
                            AND TO_DATE(:endDate, 'YYYY-MM-DD HH24:MI:SS') <= NVL(h.VALIDUNTIL,sysdate)
                        )
                    )

PHP

$validFrom = new Datetime();
$validUntil = new Datetime();
$query = $this->db->prepare($query);
$query->bindValue('subId', 20180101123456789, PDO::PARAM_STR);
$query->bindValue('startDate', $validFrom->format('Y-m-d H:i:s'), PDO::PARAM_STR);
$query->bindValue('endDate', $validUntil->format('Y-m-d H:i:s'), PDO::PARAM_STR);
$query->execute();
$result = $query->fetchAll();

$ результат иногда будет пустым, а иногда будут результаты. Мой единственный обходной путь - пробовать до 500 раз, тогда я получу результат. Я тоже пробовал с помощью сна (1), но все равно случайно, когда результат будет нулевым. Только сценарий займет больше времени.

Если я попробую блок plsql с 500 попытками, то получу результат 500 раз.

У кого-то есть идея, почему это происходит?

1 Ответ

1 голос
/ 05 июня 2019

После многих часов тестирования различных сценариев я нашел причину. Это вызвано тем, что sysdate oracle может быть старше, чем php datetime.

Можно было бы ожидать:

php new Datetime()->format('Y-m-d H:i:s') = 2019-06-05 12:55:00
oracle to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') >= 2019-06-05 12:55:00

Но если серверу оракула не хватает времени на сервер, то это может быть

php new Datetime()->format('Y-m-d H:i:s') = 2019-06-05 12:55:00
oracle to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') <=> 2019-06-05 12:55:00

Поскольку системный оракул может быть не только больше, но и меньше, могут произойти некоторые странные вещи. Поэтому я изменил сравнение sysdate на "sysdate + 1", например:

NVL(h.VALIDUNTIL,sysdate+1)

Так как это замена для NULL-значения, возможно быть в будущем и при этом привести к желаемым результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...