Tìm hiểu Cursor trong Oracle

Trong bài này mình sẽ giới thiệu một chức năng rất hay trong Oracle đó là cách tạo à sử dụng Cursor.

Cursor là một con trỏ đùng để trỏ tới một đoạn mã SQL nào đó, các đoạn mã này thường là các lệnh: SELECT, INSERT, UPDATE, DELETE.

Tạo một CURSOR giống như ta tạo một câu truy vấn và gán tên cho nó để có thể gọi và sử dụng ở nhiều nơi. 

Đọc qua chức năng thì bạn sẽ thấy nó giống như thủ tục phải không nào? Gần như vậy nhưng cú pháp và cách sử dụng đơn giản hơn, tiện lợi hơn cho những đoạn code ngắn.

1. Tạo một Cursor trong Oracle

Trước tiên bạn cần xem cú pháp:

CURSOR cursor_name  
IS  
  SELECT_statement; 

Trình biên dịch sẽ nhận biết bắt đầu CURSOR là IS và kết thúc là đoạn cuối của câu lệnh đầu tiên vì các lệnh SELECT, INSERT, UPDATE, DELETE là lệnh đơn.

Ví dụ: Giả sử ta có bảng course, hãy tạo một CURSOR có chức năng lấy ra course_id của course_name có tên bằng với tham số name_in.

CURSOR c1  
IS  
  SELECT course_id  
  FROM courses  
  WHERE course_name = name_in;

Vì trong CURSOR c1 có tham số name_in nên khi gọi đến CURSOR này bạn phải chắc chắn đã khai báo một biến tên là name_in.

2. Lệnh open và close CURSOR

Lệnh OPEN dùng để khai báo bắt đầu sử dụng một CURSOR, còn lệnh CLOSE dùng khai báo kết thúc không sử dụng CURSOR đó nữa.

Như ở ví dụ trên mình sẽ sử dụng như sau:

DECLARE 
	name_in VARCHAR2;
BEGIN
	name_in := "Cuong";
	OPEN c1;
	/* SOME CODE HERE */	
	CLOSE c1;
END;

3. Lặp dữ liệu trả về từ CURSOR

Kết quả trả về của CURSOR thường là danh sách, vì vậy ta sẽ sử dụng FETCH ... INTO để lặp dữ liệu.

Như ở ví dụ trên mình sẽ lặp dữ liệu như sau:

DECLARE
name_in VARCHAR2;
id_in NUMBER;

BEGIN
    name_in := "Cuong"; 
    OPEN c1;
    FETCH c1 INTO id_in;
         /*SOME CODE HERE*/
    CLOSE c1;
END;

4. Ví dụ CURSOR sử dụng trong Function

Oracle cho ra đời tính năng này giúp xử lý chương trình SQL trở nên gọn gàng hơn.

Sau đây là một ví dụ về sử dụng CURSOR c1 mà mình đã tạo ở phần 1 ở bên  trong một function.

CREATE OR REPLACE FUNCTION FindCourse  
  ( name_in IN varchar2 )  
  RETURN number  
IS  
   cnumber number;  
CURSOR c1  
   IS  
     SELECT course_id  
     FROM courses  
   WHERE course_name = name_in;  
BEGIN  
OPEN c1;  
   FETCH c1 INTO cnumber;  
IF c1%notfound THEN  
      cnumber := 9999;  
 END IF;  
CLOSE c1;  
RETURN cnumber;  
END;  

Ngoài ra bạn có thể sử dụng CURSOR lồng nhau, lấy kết  quả của cái đầu tiên làm dữ liệu cho cái thứ hai, giống như bạn đang lặp dữ liệu.

CREATE OR REPLACE PROCEDURE MULTIPLE_CURSORS_PROC IS  
   v_owner varchar2(40);  
   v_table_name varchar2(40);  
   v_column_name varchar2(100);  
     
   /* First cursor */  
   CURSOR get_tables IS  
     SELECT DISTINCT tbl.owner, tbl.table_name  
     FROM all_tables tbl  
     WHERE tbl.owner = 'SYSTEM';  
       
   /* Second cursor */  
   CURSOR get_columns IS  
     SELECT DISTINCT col.column_name  
     FROM all_tab_columns col  
     WHERE col.owner = v_owner  
     AND col.table_name = v_table_name;  
       
   BEGIN  
     
   -- Open first cursor  
   OPEN get_tables;  
   LOOP  
      FETCH get_tables INTO v_owner, v_table_name;  
        
      -- Open second cursor  
      OPEN get_columns;  
      LOOP  
         FETCH get_columns INTO v_column_name;  
      END LOOP;  
     CLOSE get_columns;  
    END LOOP;  
   CLOSE get_tables;  
  EXCEPTION  
   WHEN OTHERS THEN  
 raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);  
END MULTIPLE_CURSORS_PROC;  

Có một lưu ý là bạn phải dùng lệnh OPEN  và CLOSE đúng chỗ, nếu hkông kết quả sẽ không được như mong đợi.

Như vậy là mình đã giới thiệu xong cách sử dụng CURSOR trong  Oracle, hy vọng bài này sẽ giúp ích cho bạn, hẹn gặp lại các bạn trong bài trigger.

-------------------#####-------------------

Series có tham khảo hoặc dịch lại từ javatpoint.com, tuy nhiên về lời văn thì hoàn toàn của freetuts, chỉ có ví dụ là có thể có dịch lại.

Nguồn: freetuts.net