Exception handling trong procedure
Exception section là error contract của procedure: nó quyết định lỗi nào được xử lý, lỗi nào đổi thông điệp và lỗi nào phải truyền tiếp.
Predefined exceptions
Oracle có sẵn NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE, DUP_VAL_ON_INDEX...
Handler cụ thể phải đặt trước WHEN OTHERS.
RAISE_APPLICATION_ERROR
Dùng mã từ -20000 đến -20999 để trả lỗi nghiệp vụ cho application, ví dụ -20002: Không tìm thấy nhân viên.
RAISE
RAISE; trong handler phát lại exception hiện tại và giữ call stack tốt hơn việc tạo lỗi chung chung.
Anti-pattern
WHEN OTHERS THEN NULLnuốt lỗi và làm dữ liệu sai mà caller tưởng thành công.- COMMIT trong exception handler có thể lưu trạng thái dở dang.
- Trả mọi lỗi thành một message giống nhau làm mất khả năng điều tra.
Có thể log SQLCODE, SQLERRM và DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, sau đó RAISE lại.
Chỉ bắt exception khi bạn có hành động cụ thể: phục hồi, chuyển thành domain error, hoặc thêm context rồi phát lại.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Predefined exceptions
Oracle có sẵn NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE, DUP_VAL_ON_INDEX...
Handler cụ thể phải đặt trước WHEN OTHERS.
RAISE_APPLICATION_ERROR
Dùng mã từ -20000 đến -20999 để trả lỗi nghiệp vụ cho application, ví dụ -20002: Không tìm thấy nhân viên.
RAISE
RAISE; trong handler phát lại exception hiện tại và giữ call stack tốt hơn việc tạo lỗi chung chung.
Anti-pattern
WHEN OTHERS THEN NULLnuốt lỗi và làm dữ liệu sai mà caller tưởng thành công.- COMMIT trong exception handler có thể lưu trạng thái dở dang.
- Trả mọi lỗi thành một message giống nhau làm mất khả năng điều tra.
Có thể log SQLCODE, SQLERRM và DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, sau đó RAISE lại.
Chỉ bắt exception khi bạn có hành động cụ thể: phục hồi, chuyển thành domain error, hoặc thêm context rồi phát lại.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Oracle PL/SQL. Browser không có Oracle Server; editor dùng dialect PL/SQL và nút bên dưới chạy mô phỏng trên dữ liệu mẫu.
Đang tải trình soạn thảo…
Thêm EXCEPTION cho get_department_name: khi NO_DATA_FOUND, phát -20010 với message 'Không tìm thấy phòng ban'.
Đang tải trình soạn thảo…
Viết handler cuối cùng WHEN OTHERS ghi SQLCODE, SQLERRM bằng DBMS_OUTPUT rồi RAISE lại. Không được nuốt lỗi.
Đang tải trình soạn thảo…
- Chạy thử truy vấn mẫu
- Hoàn thành bài tập (0/2)