2013-08-04 44 views
5

Tôi rất mới với chương trình PL/SQL. Tôi đã cố gắng để viết một thủ tục pl/sql với một số báo cáo DML (chèn) bên trong mã. Tôi không thực hiện bất kỳ cam kết rõ ràng nào sau khi thực hiện thao tác chèn trong mã pl/sql. Nhưng giao dịch sẽ được thực hiện sau khi thực hiện thủ tục pl/sql.PL SQL Auto Cam kết thực thi

đây có phải là hành vi mặc định không?

Tôi có thể kiểm soát điều này bằng cách nào?

+1

Tùy thuộc nhiều vào khách hàng bạn đang sử dụng. Cái nào là nó? Sql * Plus? Oracle DB ngày của riêng mình không có cam kết tự động cho DML – Slartibartfast

+0

Tôi đang sử dụng sql * cộng và perl dbi để chạy các thủ tục pl/sql – Mohan

Trả lời

5

Câu lệnh DML (INSERT/DELETE/UPDATE/MERGE) không thực hiện cam kết tự động trong PL/SQL. Tuyên bố DDL thực hiện (ALTER/CREATE v.v.) và điều này sẽ xảy ra ngay cả khi có lỗi. Nếu bạn đang chạy EXECUTE IMMEDIATE như câu lệnh động chạy DDL, điều này cũng sẽ cam kết giao dịch của bạn. Và nó được như vậy [và sẽ vẫn] từ 2000

Giao diện khách hàng như SQL * Plus có tính năng tự động cam kết có thể được tắt/bật, tìm trong tài liệu khách hàng. Một cái gì đó như

SET AUTOCOMMIT OFF 

Bạn có thể thấy tình trạng hiện tại của biến này

SHOW AUTCOMMIT 

và điều đó sẽ cho bạn biết liệu trên nó/tắt.

Đi qua this để biết thêm các biến thể của autocommit

+0

Vì vậy, Nếu chúng tôi có bất kỳ báo cáo DML bên trong pl/sql thủ tục và nếu tôi không cam kết rõ ràng nó bên trong thủ tục pl/sql, các giao dịch sẽ không được cam kết. Và tất cả các giao dịch sẽ được khôi phục sau khi thực hiện thủ tục hoàn tất. Nó có đúng không? – Mohan

+1

Có, nhưng hãy đảm bảo tính năng tự động cam kết của SQL * plus bị tắt. Ngoài ra còn có một vài gói DBMS tự động cam kết. Vì vậy, ví dụ nếu bạn đang thu thập số liệu thống kê bằng cách sử dụng DBMS_STATS sau khi chạy thủ tục thì có một cam kết ngầm định trong gói đó. Ngoài ra google savepoints, autonomous_transaction và xem http://stackoverflow.com/questions/11966020/begin-end-block-atomic-transactions-in-pl-sql để biết thêm về chủ đề này. Nhưng cách tốt nhất là đưa ra các cam kết thông qua một hàm gọi cho proc khi nó thành công và rollback về các ngoại lệ. – Slartibartfast

+6

@mohan - giao dịch sẽ KHÔNG được khôi phục sau khi thực hiện thủ tục hoàn tất. Giao dịch sẽ vẫn mở cho đến khi bạn A) cam kết nó, B) cuộn lại, hoặc C) ngắt kết nối, tại thời điểm đó các giao dịch không cam kết sẽ được khôi phục. Ngoài ra, nếu bạn có một giao dịch mở và thực hiện một câu lệnh DDL (CREATE TABLE, DROP INDEX, vv), giao dịch mở sẽ được thực hiện. Chia sẻ và tận hưởng. –

2

Trong client PL/SQL Developer, bạn kiểm soát các giao dịch autocommit Window SQL qua Preferences.

enter image description here