Почему не реализует Oracle Driver PDO PASTINSERTID ()?
-
27-10-2019 - |
Вопрос
Я получаю эту ошибку в PDO:
Ошибка: Сообщение: PDO :: LastinSertId () [PDO.LastInserTid]: SQLState [IM001]: Driver не поддерживает эту функцию: Driver не поддерживает LastInserTid ()
При попытке получить последний вставленный идентификатор из базы данных Oracle. Я добавил строку последовательности в последнюю функцию идентификатора вставки, но все еще не работал. Google мало говорит об этой ошибке на Oracle с PDO.
Решение
У Oracle нет столбцов автоинскрущения, поэтому LastinSertid не поддерживается так же, как для MySQL. Вы должны реализовать эквивалент «вручную», используя последовательности Oracle.
Создайте последовательность Oracle для каждой таблицы, которая требует этого, и используйте NextVal, чтобы получить ее, когда вам нужно сделать вставку, а затем используйте это значение при вставке в таблицу.
$sh = $conn->prepare('SELECT uid_seq.NEXTVAL AS nextInsertID FROM DUAL');
$sh->execute();
$nextInsertId = $sh->fetchColumn(0);
$sh = $conn->prepare("INSERT INTO table (id, data) VALUES(?, 255)");
$sh->execute(array($nextInsertId));
Другие советы
В Oracle вы должны были создать Oracle -последовательность для таблиц, для которой требуется столбец автоматического приращения.
Если вы хотите вставить, то вы можете сделать это в одно и то же время, а не запросить nextIncrementId
и вставьте, как ниже:
$sh = $conn->prepare("INSERT INTO table (id, data) VALUES(SEQUENCE_NAME.NEXTVAL, ?)");
$sh->execute(array($valueToBeInsertedInDataColumn));
Если вы просто хотите узнать последний идентификатор вставки, тогда Не используйте NextVal, потому что всякий раз, когда вы его называете, он увеличивает значение к следующему. Вы должны использовать Curval для этой цели. Анкет Ниже приведен пример:
$sh = $conn->prepare("SELECT SEQUENCE_NAME.CURRVAL AS lastInsertId FROM DUAL");
$lastInserId = $sh->execute();
Отлаживать: print_r($lastInserId);