Почему драйвер Oracle PDO не реализует lastInsertId()?

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

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

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

2 ответов


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, потому что всякий раз, когда вы его вызываете, он увеличивает значение до следующего. Вы должны использовать CURRVAL для этой цели. Ниже пример:

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

Debug:print_r($lastInserId);