2012-02-17 23 views
6

ottengo questo errore nel PDO:Perché il driver Oracle di PDO non implementa lastInsertId()?

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

quando si cerca di ottenere ultimo ID inserito da un database Oracle. Ho aggiunto la stringa di sequenza all'ultima funzione di inserimento ID ma ancora non funziona. Google non dice molto riguardo a questo errore su Oracle con PDO.

+0

Hai provato a recuperarlo tramite una query? (Supponendo che Oracle abbia una funzione per questo) –

risposta

10

Oracle non ha colonne di incremento automatico, quindi lastInsertId non è supportato nello stesso modo di MySQL. Devi implementare l'equivalente "a mano" usando le sequenze Oracle.

Creare una sequenza di oracle per ogni tabella che lo richiede e utilizzare NEXTVAL per recuperarlo ogni volta che è necessario eseguire un inserimento, quindi utilizzare tale valore quando si inserisce nella tabella.

$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

Questa condizione di competizione è sicura? (Non ho idea di Oracle, solo curioso) –

+0

@Pekka - No, i numeri di sequenza vengono emessi senza rischio di condizioni di gara dal server Oracle, incrementati ed emessi su ogni richiesta di NEXTVAL ... come l'autoincremento di MySQL, tranne che a livello della sequenza piuttosto che un livello di tabella. Penso che qualcuno avrebbe incontrato problemi con loro altrimenti, e un problema in qualcosa di così fondamentale avrebbe rotto Oracle come database. TUTTAVIA, non c'è nulla che impedisca agli utenti di memorizzare "qualsiasi vecchio valore" nella colonna id usando questo metodo. –

+0

Trovo il requisito per recuperare il valore successivo nella sequenza, quindi emettere l'inserto per essere un po 'brutto. Oracle ha qualcosa come le funzioni ['curval' /' nextval'/Postval'] di Postgres (http://www.postgresql.org/docs/current/static/functions-sequence.html), utilizzabili in linea? (Chiedendo per curiosità.) – Charles

Problemi correlati