Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Ví dụ về giao dịch tự trị của Oracle

Trong Oracle, một giao dịch tự trị có thể cam kết hoặc khôi phục dữ liệu trong cùng một phiên mà không cần cam kết hoặc quay lại trong giao dịch chính. Câu lệnh PRAGMA (chỉ thị trình biên dịch) được sử dụng để định nghĩa giao dịch tự trị trong Oracle. Sau đây là một ví dụ về giao dịch tự trị của Oracle.

Cú pháp để xác định giao dịch tự động trong Oracle

 PRAGMA AUTONOMOUS_TRANSACTION; / * trong phần khai báo của PL / SQL Block * / 

Ví dụ về thủ tục được lưu trữ của Oracle cho Giao dịch tự động

Quy trình được lưu trữ Oracle sau đây cho giao dịch tự quản là ghi lại các lỗi xảy ra trong bất kỳ chương trình PL / SQL nào (Thủ tục, gói hoặc chức năng, v.v.). Nó sẽ chèn thông tin lỗi vào bảng error_log và sẽ xác nhận dữ liệu mà không ảnh hưởng đến bất kỳ giao dịch chính nào trong bất kỳ chương trình PL / SQL nào. Bạn có thể gọi thủ tục này từ bất kỳ chương trình PL / SQL nào để ghi thông tin lỗi. Dưới đây tôi sẽ cho bạn thấy làm thế nào. Tạo các đối tượng sau để kiểm tra trong hệ thống của bạn:

Tạo bảng Error_Log

 TẠO BẢNG error_log (error_code VARCHAR2 (100), error_msg VARCHAR2 (4000), date_occurred DATE, plsql_program_ref VARCHAR2 (100)) / 

Quy trình được lưu trữ của Oracle dành cho giao dịch tự động đối với lỗi nhật ký

Thủ tục dưới đây có ba tham số mà bạn cần chuyển vào lúc gọi thủ tục từ các thủ tục hoặc hàm được lưu trữ khác tại thời điểm xảy ra lỗi.

 

Bây giờ bạn có thể gọi thủ tục được lưu trữ prc_log_errors từ phần xử lý ngoại lệ của chương trình PL / SQL khác để ghi thông tin lỗi. Đây là một ví dụ:

Tạo bảng test_data

 TẠO BẢNG test_data (some_data VARCHAR2 (100)) / 

Tạo hàm fnc_test

Hàm sau sẽ chèn một số dữ liệu vào test_data và sau đó, nó sẽ tạo ra lỗi vì nó đang chia cho 0 ở dòng tiếp theo. Lỗi, trong phần ngoại lệ, nó đang gọi thủ tục prc_log_errors để ghi lại lỗi. Nếu hàm thực thi mà không có lỗi, thì nó sẽ trả về TRUE, nếu không nó sẽ trả về FALSE. Trong trường hợp dưới đây, nó sẽ trả về FALSE sau khi ghi lại lỗi.

 TẠO HOẶC THAY THẾ CHỨC NĂNG fnc_test RETURN BOOLEANIS n NUMBER; BẮT ĐẦU CHÈN VÀO GIÁ TRỊ dữ liệu test_data ('abc'); / * tạo ra lỗi * / n:=2/0; QUAY LẠI ĐÚNG; NGOẠI LỆ KHI CÓ NGƯỜI KHÁC THÌ prc_log_errors (TO_CHAR (SQLCODE), SQLERRM, 'FNC_TEST'); QUAY LẠI FALSE; KẾT THÚC fnc_test; / 

Kiểm tra

Gọi hàm trên fnc_test .

 BẮT ĐẦU NẾU fnc_test THÌ CAM KẾT; QUAY LĂN KHỬ MÙI; KẾT THÚC NẾU; NGOẠI LỆ KHI NGƯỜI KHÁC THÌ ROLLBACK; HẾT; / 

Ngay cả khi nó đang hoạt động trở lại khi thất bại, nhưng dữ liệu vẫn sẽ được lưu trong bảng error_log, vì quy trình prc_log_errors đang sử dụng PRAGMA AUTONOMOUS_TRANSACTION .

Kiểm tra bảng test_data, không được có bản ghi nào.

 CHỌN * TỪ test_data; 

Đầu ra

 không có hàng nào được chọn. 

Kiểm tra dữ liệu trong bảng error_log

 CHỌN * TỪ error_log; 

Đầu ra

 ERROR_CODE ERROR_MSG DATE_OCCURRED PLSQL_PROGRAM_REF-1476 ORA-01476:số chia bằng 0 27/03/2019 15:43:12 FNC_TEST 

Xem thêm:

  • Thu thập hàng loạt Oracle PL / SQL Ví dụ về Lưu ngoại lệ
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để truy cập cấu trúc và lấy danh sách cột, các kiểu dữ liệu của con trỏ?

  2. Lược đồ kỹ sư đảo ngược (oracle) thành ERD

  3. Sử dụng LogMiner để tìm các thay đổi hiện tại

  4. Agent Decomission trong EM13c

  5. Toán tử Oracle (+)