У меня есть 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 раз.
У кого-то есть идея, почему это происходит?