Почему драйвер Oracle PDO не реализует lastInsertId ()? - PullRequest
6 голосов
/ 17 февраля 2012

Я получаю эту ошибку в PDO:

ошибка: Сообщение: PDO :: lastInsertId () [pdo.lastinsertid]: SQLSTATE [IM001]: Драйвер не поддерживает эту функцию: драйвер неподдержка lastInsertId ()

при попытке получить последний вставленный идентификатор из базы данных оракула.Я добавил строку последовательности в последнюю функцию вставки идентификатора, но все еще не работает.Google мало говорит об этой ошибке в Oracle с PDO.

Ответы [ 2 ]

10 голосов
/ 17 февраля 2012

Oracle не имеет автоинкрементных столбцов, поэтому lastInsertId не поддерживается так же, как и для MySQL. Вы должны реализовать эквивалент "вручную", используя последовательности 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));
0 голосов
/ 13 июля 2018

В Oracle вы должны были создать последовательность оракулов для таблиц, для которых требуется столбец с автоинкрементом.

Если вы хотите вставить, то вы можете сделать это одновременно, а не запросить nextIncrementId ивставьте как показано ниже:

$sh = $conn->prepare("INSERT INTO table (id, data) VALUES(SEQUENCE_NAME.NEXTVAL, ?)");
$sh->execute(array($valueToBeInsertedInDataColumn));

Если вы просто хотите узнать последний идентификатор вставки, тогда не использует nextval, потому что всякий раз, когда вы его вызываете, оно увеличивает значение до следующего.Вы должны использовать CURRVAL для этой цели .Ниже приведен пример:

$sh = $conn->prepare("SELECT SEQUENCE_NAME.CURRVAL AS lastInsertId FROM DUAL");
$lastInserId = $sh->execute();

Отладка: print_r($lastInserId);

...