2012-02-17 22 views
6

tôi nhận được lỗi này trong PDO:Tại sao trình điều khiển Oracle của PDO không thực hiện lastInsertId()?

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

khi cố gắng để có được id chèn vào trước từ một cơ sở dữ liệu oracle. Tôi đã thêm chuỗi chuỗi vào hàm chèn id cuối cùng nhưng vẫn không hoạt động. Google không nói nhiều về lỗi này trên Oracle với PDO.

+0

Bạn đã thử tìm nạp thông qua truy vấn thay thế? (Giả sử Oracle có một chức năng cho điều đó) –

Trả lời

10

Oracle không có cột tự động, vì vậy lastInsertId không được hỗ trợ theo cách tương tự như đối với MySQL. Bạn phải thực hiện tương đương "bằng tay" bằng cách sử dụng các chuỗi Oracle.

Tạo một chuỗi oracle cho mỗi bảng yêu cầu và sử dụng NEXTVAL để lấy nó bất cứ khi nào bạn cần chèn, sau đó sử dụng giá trị đó khi chèn vào bảng.

$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

Điều kiện cuộc đua này có an toàn không? (Tôi không biết gì về Oracle, chỉ tò mò) –

+0

@Pekka - không, số thứ tự được phát hành mà không có rủi ro về điều kiện chủng tộc của máy chủ Oracle, được tăng lên và ban hành theo mọi yêu cầu cho NEXTVAL ... như tự động hóa MySQL, ngoại trừ ở cấp độ của trình tự chứ không phải là cấp độ bảng. Tôi nghĩ ai đó sẽ gặp phải vấn đề với họ nếu không, và một vấn đề trong thứ gì đó cơ bản như vậy sẽ làm hỏng Oracle như một cơ sở dữ liệu. BAO GIỜ, không có gì để ngăn chặn người dùng lưu trữ "bất kỳ giá trị cũ" trong cột id bằng cách sử dụng phương pháp này. –

+0

Tôi tìm thấy yêu cầu để tìm nạp giá trị tiếp theo trong chuỗi, sau đó phát hành chèn là loại xấu xí. Oracle có bất cứ thứ gì giống như các hàm ['curval' /' nextval'/'lastval'] của Postgres (http://www.postgresql.org/docs/current/static/functions-sequence.html), có thể sử dụng được không? (Yêu cầu tò mò.) – Charles

Các vấn đề liên quan