Breaking News
Loading...
10/02/2014

Xử lý lỗi trong Oracle

Bài viết này note lại vài về vấn đề Error Handling trong Oracle Trong ví dụ sau đây, tôi tạo ra 1 stored procedure, chỉ đơn giản lấy biến i_a chia cho i_b. Nếu i_b=0 tôi sẽ cho ngưng chạy stored và quăng ra exception là MyException, exception này sẽ được xử lý tiếp theo bên dưới

CREATE OR REPLACE
PROCEDURE usp_VinhTest(
    i_a IN NUMBER,
    i_b IN NUMBER)
AS
  MyException EXCEPTION;
BEGIN
  IF i_b=0 THEN
    raise MyException;
  END IF;
EXCEPTION
WHEN MyException THEN
  dbms_output.put_line('My Exception');
WHEN OTHERS THEN
  dbms_output.put_line('Generic Exception');
END;

Tiếp theo là vấn đề khi sử dụng Implicit Cursor trong Oracle, nếu không có dòng nào trả về, một Exception có tên là no_data_found sẽ được quăng ra, và ta phải xử lý nó trong code của mình

DECLARE
  l_descr hardware.descr%type;
BEGIN
  SELECT descr INTO l_descr FROM hardware WHERE aisle = 0 AND item = 0;
  dbms_output.put_line('Item was found');
EXCEPTION
WHEN no_data_found THEN
  dbms_output.put_line('Invalid item specified');
END;

Với đoạn code trên, nếu ta chuyển sang bulk mode, một lưu ý rất quan trọng là no_data_found exception sẽ không được quăng ra nếu không có data được tìm thấy, ta phải viết lại như sau:

DECLARE
type t_descr_list
IS
  TABLE OF hardware.descr%type;
  l_descr_list t_descr_list;
BEGIN
  SELECT descr bulk collect
  INTO l_descr_list
  FROM hardware
  WHERE aisle           = 0
  AND item              = 0;
  IF l_descr_list.count = 0 THEN
    raise no_data_found;
  END IF;
  dbms_output.put_line('Item was found');
EXCEPTION
WHEN no_data_found THEN
  dbms_output.put_line('Invalid item specified');
END;

0 comments:

Post a Comment

 
Toggle Footer