2012-02-17 30 views
6

Ben PDO'daki bu hatayı alıyorum:Neden PDO'nun Oracle sürücüsü lastInsertId() uygulamıyor?

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

bir kahin veritabanından son eklenen kimliği almaya çalışırken. Dizi dizgisini son insert id işlevine ekledim, ancak hala çalışmıyor. Google, Oracle'daki bu hatayla ilgili olarak PDO ile ilgili fazla bir şey söylemiyor.

+0

Bunun yerine bir sorgudan getirmeyi denediniz mi? (Oracle'ın bunun için bir işlevi olduğunu varsayarsak) –

cevap

10

Oracle, otomatik noktalama sütunlarına sahip değil, dolayısıyla lastInsertId, MySQL ile aynı şekilde desteklenmiyor. Oracle dizilerini kullanarak "elle" eşdeğerini uygulamanız gerekir.

Bunu gerektiren her tablo için bir Oracle dizisi oluşturun ve ekleme yapmak istediğinizde onu almak için NEXTVAL kullanın ve sonra tabloya eklerken bu değeri kullanın.

$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

Bu yarış durumu güvenli midir? (Oracle hakkında hiçbir fikrim yok, sadece merak ediyorum) –

+0

@Pekka - nope, sıra numaraları Oracle sunucusu tarafından yarış koşulları riski olmadan verilir, NEXTVAL için her istekte artırılır ve verilir ... MySQLs otoincrement gibi, seviye hariç bir tablo seviyesinden ziyade dizinin Bence birileri onlarla problemlerle karşılaşırdı ve bu kadar temeldeki bir konu Oracle'ı bir veritabanı olarak kırdı. Şimdilik, kullanıcıların bu sütunu kullanarak id sütununda "herhangi bir eski değeri" depolamasını önlemek için hiçbir şey yoktur. –

+0

Sıradaki bir sonraki değeri alma zorunluluğunu bulup, çirkin olmak için eki yayınla. Oracle Postgres'in ['curval' /' nextval'/'lastval'] (http://www.postgresql.org/docs/current/static/functions-sequence.html) işlevleri, satır içi kullanılabilir gibi bir şey var mı? (Merakından vazgeçme.) – Charles

İlgili konular