2012-02-17 47 views
6

我得到了PDO此錯誤:爲什麼PDO的Oracle驅動程序不實現lastInsertId()?

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

試圖從Oracle數據庫中獲取最後插入的ID時。我將序列字符串添加到最後一個插入ID功能,但仍然無法工作。谷歌並沒有多說關於Oracle與PDO的這個錯誤。

+0

您是否試圖通過查詢取而代之? (假設Oracle有這個功能) – 2012-02-17 13:39:23

回答

10

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)); 
+0

雖然這種競爭條件安全嗎? (我對Oracle毫無頭緒,只是好奇) – 2012-02-17 16:31:39

+0

@Pekka - 不會,Oracle服務器發出的序列號沒有競爭條件的風險,每增加一個NEXTVAL請求就會發出一個序列號,就像MySQL自動增量一樣,除了級別的序列而不是表級。否則,我認爲有人會遇到與他們有關的問題,而如此重要的問題會使Oracle成爲數據庫。但是,沒有什麼能夠阻止用戶使用這種方法在id列中存儲「任何舊值」。 – 2012-02-17 16:55:46

+0

我發現需要獲取序列中的下一個值,然後發出插入有點醜。 Oracle是否有類似於Postgres的['curval' /'nextval' /'lastval'](http://www.postgresql.org/docs/current/static/functions-sequence.html)函數,可以在線使用? (詢問出於好奇) – Charles 2012-02-17 17:41:39