Chủ Nhật, 19 tháng 9, 2021

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.

Mục lục

  • 1. Tạo một Cursor trong Oracle
  • 2. Lệnh open và close CURSOR
  • 3. Lặp dữ liệu trả về từ CURSOR
  • 4. Ví dụ CURSOR sử dụng trong Function

1. Tạo một Cursor trong Oracle

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

1
2
3
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.

1
2
3
4
5
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:

1
2
3
4
5
6
7
8
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:

1
2
3
4
5
6
7
8
9
10
11
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, oracle oca, oracle ocp, oracle ocm

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master