Pregunta

Recibo este error en PDO:

Error: Mensaje: PDO :: LastInsertid () [PDO.LastInsertid]: SQLState [IM001]: el controlador no admite esta función: el controlador no es compatible con LastInsertid ()

Al intentar obtener la última ID insertada de una base de datos Oracle. Agregué la cadena de secuencia a la última función de ID de inserción pero aún no funciona. Google no dice mucho sobre este error en Oracle con PDO.

¿Fue útil?

Solución

Oracle no tiene columnas de autoincremento, por lo que LastInsertid no es compatible de la misma manera que para MySQL. Debe implementar el equivalente "a mano" utilizando secuencias Oracle.

Cree una secuencia Oracle para cada tabla que lo requiera, y use NextVal para recuperarla siempre que necesite hacer un inserto, luego use ese valor al insertar en la tabla.

$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));

Otros consejos

En Oracle, debería haber creado una secuencia de Oracle para tablas que requiere una columna de incremento automático.

Si desea insertar, puede hacerlo al mismo tiempo en lugar de una consulta nextIncrementId e inserte como se muestra:

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

Si solo quieres saber la última ID de inserción, entonces No use NextVal porque cada vez que lo llama, incrementa el valor al siguiente. Debe usar Currval para ese propósito. A continuación se muestra un ejemplo:

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

Depurar: print_r($lastInserId);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top