12.3.GIỚI THIỆU CURSOR

Một phần của tài liệu SQL và PL/SQL Cơ bản docx (Trang 82 - 84)

- Thay DEPTNO của câc nhđn viín năy bằng DEPTNO của Boston Thay lương mỗi nhđn viín bằng lương trung bình của bộ phậ n * 1.1 Thay commission c ủ a

12.3.GIỚI THIỆU CURSOR

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:

%isopen trả lại giâ trị True nếu cursor đang mở

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 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; 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 SQL và PL/SQL Cơ bản docx (Trang 82 - 84)

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

(106 trang)