12.3.GIỚI THIỆU CURSOR

Một phần của tài liệu CNTT Giao trinh Oracle SQL PLSQL co ban (Trang 80 - 82)

Cursor là kiểu biến có cấu trúc, cho phép ta xử lý dữ liệu gồm nhiều dòng. Số dòng phụ thuộc vào câu lệnh truy vấn dữ liệu sau nó. Trong quá trình xử lý, ta thao tác với cursor thông qua từng dòng dữ liệu. Dòng dữ liệu này được định vị bởi một con trỏ. Với việc dịch chuyển con trỏ, ta có thể lấy được toàn bộ dữ liệu trả về. Các bước sử dụng biến cursor:

Khai báo --> mở cursor --> lấy dữ liệu để xử lý --> đóng cursor

Khai báo:

CURSOR Tên cursor( danh sách biến) IS Câu lệnh truy vấn;

Ví dụ1:

CURSOR c_Dept IS SELECT deptno, dname

FROM dept

WHERE deptno>10;

Ví dụ2:

CURSOR c_Dept(p_Deptno NUMBER) IS SELECT deptno, dname

FROM dept

WHERE deptno>10;

Mở cursor:

OPEN Tên cursor | Tên cursor( danh sách biến);

Ví dụ1:

OPEN c_Dept;

Ví dụ2:

OPEN c_Dept(10);

Lấy dữ liệu:

FETCH Tên cursor INTO Tên biến;

Ví dụ:

FETCH c_Dept INTO v_Dept;

Đóng cursor:

CLOSE Tên cursor;

Ví dụ:

CLOSE c_Dept;

Các thuộc tính:

Oracle cơ bản - SQL và PL/SQL

%notfound trả lại giá trị True nếu lệnh fetch hiện thời trả lại không có row

%found trả lại giá tri true cho đến khi fetch không còn row nào

%rowcount trả lại số row đã được thực hiện bằng lệnh fetch

Ví dụ1:

DECLARE

-- Khai báo cursor để truy vấn dữ liệu CURSOR c_Emp IS

SELECT * FROM emp

WHERE dept_id = 10;

-- Khai báo biến cursor tương ứng để chứa dòng dữ liệu v_Emp c_EMP%rowtype;

BEGIN

-- Mở cursor OPEN c_Emp; LOOP

-- Lấy dòng dữ liệu từ cursor FETCH c_Emp INTO v_Emp;

-- Thoát khỏi vòng lặp nếu đã lấy hết dữ liệu trong cursor EXIT WHEN c_Emp%notfound;

-- Bổ sung dữ liệu vào Emp_ext theo dữ liệu lấy được từ cursor

INSERT INTO Emp_ext (empno, ename, job) VALUES (v_Emp.empno, v_Emp.ename, v_Emp.job); END LOOP; -- Đóng cursor CLOSE c_Emp; END; Ví dụ 2: DECLARE

-- Khai báo cursor, có cho phép cập nhật dữ liệu CURSOR c_Dept IS

SELECT dname, loc

FROM dept FOR UPDATE OF loc; -- Khai báo biến lưu trữ dữ liệu

v_Dept c_Dept%ROWTYPE; v_sales_count NUMBER:=0; v_non_sales NUMBER:=0; BEGIN -- Mở cursor OPEN c_Dept; LOOP

-- Lấy từng dòng dữ liệu của cursor để xử lý FETCH c_Dept INTO v_Dept;

-- Thoát khỏi lệnh lặp nếu đã duyệt hết tất cả dữ liệu EXIT WHEN c_Dept %notfound;

IF (v_Dept.dname = 'SALES')AND(v_Dept.loc!='DALLAS') THEN -- Cập nhật dữ liệu trên cursor

Oracle cơ bản - SQL và PL/SQL

UPDATE Dept

SET loc='DALLAS'

WHERE CURRENT OF c_Dept;

-- Đếm số lượng bản ghi được cập nhật v_sales_count := sales_count + 1;

ELSIF (v_dept.dname != 'SALES')AND(v_Dept.loc!='NEWYORK') THEN

-- Cập nhật dữ liệu trên cursor UPDATE Dept

SET loc = 'NEWYORK' WHERE CURRENT OF c_Dept;

-- Đếm số lượng bản ghi được cập nhật v_non_sales := v_non_sales + 1;

END IF; END LOOP; -- Đóng cursor CLOSE c_Dept;

-- Lưu giữ các thông số vừa xác định vào bảng INSERT INTO counts (sales_set, non_sales_set)

VALUES (v_sales_count, v_non_sales); -- Ghi nhận các thay đổi dữ liệu ở trên COMMIT;

END;

Một phần của tài liệu CNTT Giao trinh Oracle SQL PLSQL co ban (Trang 80 - 82)

Tải bản đầy đủ (PDF)

(104 trang)