You are on page 1of 7

10/15/2010

Trường ðại học Sư phạm thành phố Hồ Chí Minh Mục tiêu
Khoa Công ngh
thông tin

CÁC HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU ● Hiểu ñược ý nghĩa của việc sử dụng cursor

● Vận dụng cursor trong khai thác CSDL

Bài 5 : LẬP TRÌNH VỚI CURSOR


Ts. Nguyễn An Tế
Nguyễn Tiến Dũng
Nguyễn Thúy Ngọc

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 2

Tài liệu tham khảo Nội dung

[1] Ramez Elmasri, Shamkant B. Navathe, 1. Giới thiệu cursor

Fundamentals of Database Systems (ch. 9), 4th 2. Khai thác cursor


Edition, 2003.

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 3 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 4

1
10/15/2010

1. Giới thiệu cursor 1. Giới thiệu cursor (tt.)

Yêu cầu: viết câu truy vấn bằng ðSQH, SQL

masv tensv phai dantoc khuvuc hocbong


SV01 Nguyễn Duy Anh Nam Kinh 3
SV02 Lê Ngọc Bích Nữ Tày 1
SV03 Trần Văn Bình Nam Kinh 3
SV04 Lê Thị Cúc Nữ Thái 2
SV05 Phạm Minh Cường Nam Tày 1

●Sinh viên nữ, dân tộc Tày, khu vực 1  học bổng 150.000
●Sinh viên nam, dân tộc Tày, khu vực 1  học bổng 120.000
●Sinh viên thuộc khu vực 2 học bổng 100.000

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 5 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 6

1. Giới thiệu cursor (tt.) 1. Giới thiệu cursor (tt.)

> 1 lần duyệt

UPDATE SINHVIEN SELECT maddh, sum(soluong*dongia)


SET hocbong= 150.000 FROM CTDDH
WHERE ñk (1) GROUP BY maddh
1 lần duyệt
???
UPDATE SINHVIEN SELECT makh, sum(soluong*dongia)
SET hocbong= 120.000 FROM CTDDH INNER JOIN DDH…
WHERE ñk (2) GROUP BY makh

UPDATE SINHVIEN SELECT makv, sum(soluong*dongia)


SET hocbong= 100.000 FROM CTDDH INNER JOIN DDH…
WHERE ñk (3) GROUP BY makv

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 7 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 8

2
10/15/2010

Giới thiệu cursor (tt.) 1. Giới thiệu cursor (tt.)

while ( i !=EOF)
● Cursor: (con trỏ) chỉ tới 1 dòng ñơn trong tập kết quả Ví dụ 1
{
của câu truy vấn mà trả về nhiều mẩu tin doc_dong_du_lieu(); // ñọc từng dòng dữ liệu
if ((phai[i]==‘Nữ’) && (dantoc[i]==‘Tay’) && (khuvuc[i]==1))
● Sử dụng cursor khi muốn làm việc trên từng dòng dữ
hocbong=150.000
liệu tại thời ñiểm hiện hành if ((phai[i]==‘Nam’) && (dantoc[i]==‘Tay’) && (khuvuc[i]==1))
hocbong=150.000
masv tensv phai dantoc khuvuc hocbong
if (khuvuc[i]==2)
Cursor SV01 Nguyễn Duy Anh Nam Kinh 3
hocbong=100.000
SV02 Lê Ngọc Bích Nữ Tày 1
i=next(i);
SV03 Trần Văn Bình Nam Kinh 3
SV04 Lê Thị Cúc Nữ Thái 2 }
SV05 Phạm Minh Cường Nam Tày 1

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 9 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 10

1. Giới thiệu cursor (tt.)

DDH01 Ví dụ 2
Khách hàng 01
∑ thanhtien
∑ thanhtien
Khu vực MN DDH02
∑ thanhtien ∑ thanhtien

Khách hàng 02

∑ thanhtien

Khu vực MB
∑ thanhtien

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 11 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 12

3
10/15/2010

Nội dung 2. Khai thác cursor

1. Giới thiệu cursor

2. Khai thác cursor ðịnh nghĩa biến kiểu cursor bằng lệnh DECLARE

Sử dụng lệnh OPEN ñể mở cursor ñã ñịnh nghĩa

ðọc và xử lý trên từng dòng dữ liệu bên trong cursor

ðóng cursor bằng lệnh CLOSE và DEALLOCATE

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 13 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 14

Nội dung 2.1 ðịnh nghĩa biến kiểu cursor

1. Giới thiệu cursor


DECLARE <tên cursor> CURSOR
FOR <câu lệnh truy vấn>
2. Khai thác cursor [FOR UPDATE [OF <danh sách cột cập nhật>]]
2.1 ðịnh nghĩa biến kiểu cursor
2.2 Mở cursor ●Tên cursor: tên của biến kiểu cursor
2.3 ðọc và xử lý dữ liệu trong cursor ●Câu lệnh truy vấn: lấy các cột cần ñọc dữ liệu trong bảng

2.4 ðóng cursor ● Danh sách cột cập nhật: danh sách tên các cột sẽ ñược
phép thay ñổi giá trị trong cursor

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 15 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 16

4
10/15/2010

2.1 ðịnh nghĩa biến kiểu cursor (tt.) Nội dung

● Ví dụ: ñịnh nghĩa một biến cursor chứa toàn bộ dòng 1. Giới thiệu cursor
dữ liệu trong bảng SINHVIEN

2. Khai thác cursor


2.1 ðịnh nghĩa biến kiểu cursor
DECLARE cur_SV CURSOR
2.2 Mở cursor
FOR SELECT * FROM SINHVIEN
2.3 ðọc và xử lý dữ liệu trong cursor
2.4 ðóng cursor

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 17 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 18

2.2 Mở cursor Nội dung

OPEN <tên cursor> 1. Giới thiệu cursor

●Tên cursor: tên của biến kiểu cursor ñã ñịnh nghĩa bằng lệnh
DECLARE 2. Khai thác cursor
2.1 ðịnh nghĩa biến kiểu cursor
● Ví dụ: ñể mở cursor cur_SV 2.2 Mở cursor
2.3 ðọc và xử lý dữ liệu trong cursor
OPEN cur_SV
2.4 ðóng cursor

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 19 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 20

5
10/15/2010

2.3 ðọc và xử lý dữ liệu trong cursor 2.3 ðọc và xử lý dữ liệu trong cursor (tt.)

FETCH [hướng] FROM <tên cursor> R1

[INTO <danh sách biến>] R2

R3

R4

●Hướng: NEXT (mặc ñịnh), PRIOR, FIRST, LAST R5


● Danh sách biến: tên các biến cục bộ ñã ñịnh nghĩa trước ñó.
Các biến này sẽ lưu trữ các giá trị dữ liệu ñược ñọc từ lệnh FETCH
PRIOR
FIRST
NEXT
LAST

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 21 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 22

2.3 ðọc và xử lý dữ liệu trong cursor (tt.) 2.3 ðọc và xử lý dữ liệu trong cursor (tt.)

● @@FETCH_STATUS: dùng kiểm tra tình trạng ñọc ● Ví dụ: ñọc dữ liệu cursor trong bảng SINHVIEN
dữ liệu có thành công hay không
FETCH NEXT FROM cur_SV
– @@FETCH_STATUS=0: ñọc dữ liệu thành công
– @@FETCH_STATUS≠0: ñọc dữ liệu không thành công
WHILE @@FETCH_STATUS = 0
BEGIN
--ðọc các dòng kế tiếp
FETCH NEXT FROM cur_SV
END

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 23 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 24

6
10/15/2010

Nội dung 2.4 ðóng cursor

1. Giới thiệu cursor


CLOSE <tên cursor>
DEALLOCATE <tên cursor>
2. Khai thác cursor
2.1 ðịnh nghĩa biến kiểu cursor
2.2 Mở cursor
2.3 ðọc và xử lý dữ liệu trong cursor CLOSE cur_SV
2.4 ðóng cursor DEALLOCATE cur_SV

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 25 Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 26

Ts. Nguyễn An Tế - Nguyễn Tiến Dũng - Nguyễn Thúy Ngọc [HQTCSDL-Bài 5: Lập trình với cursor] 27

You might also like