2012-02-17 11 views
6

me sale este error en PDO:¿Por qué el controlador Oracle de PDO no implementa lastInsertId()?

error: Message: PDO::lastInsertId() [pdo.lastinsertid]: SQLSTATE[IM001]: Driver does not support this function: driver does not support lastInsertId()

al intentar conseguir la última ID insertado desde una base de datos Oracle. Agregué la cadena de secuencia a la última función de identificación de inserción, pero aún no funcionaba. Google no dice mucho sobre este error en Oracle con PDO.

+0

¿Has intentado buscarlo a través de una consulta en su lugar? (Suponiendo que Oracle tiene una función para eso) –

Respuesta

10

Oracle no tiene columnas de autoincrement, por lo que lastInsertId no se admite de la misma manera que para MySQL. Tienes que implementar el equivalente "a mano" usando secuencias de Oracle.

Cree una secuencia de oráculo para cada tabla que lo requiera, y use NEXTVAL para recuperarla cada vez que necesite hacer una inserción, luego use ese valor cuando inserte 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)); 
+0

¿Es esta condición de carrera segura? (No tengo ni idea de Oracle, solo curiosidad) –

+0

@Pekka - no, los números de secuencia se emiten sin riesgo de condiciones de carrera por el servidor Oracle, se incrementan y se emiten en cada solicitud de NEXTVAL ... como la autoincrementación de MySQL, excepto en el nivel de la secuencia en lugar de un nivel de tabla. Creo que alguien habría tenido problemas con ellos de lo contrario, y un problema en algo tan fundamental habría roto Oracle como una base de datos. SIN EMBARGO, no hay nada que evite que los usuarios almacenen "cualquier valor anterior" en la columna de ID con este método. –

+0

Encuentro el requisito de buscar el siguiente valor en la secuencia, luego publico el inserto para que sea feo. ¿Oracle tiene algo así como las funciones de Postgres ['curval' /' nextval'/'lastval'] (http://www.postgresql.org/docs/current/static/functions-sequence.html), utilizables en línea? (Preguntando por curiosidad.) – Charles

Cuestiones relacionadas