You are on page 1of 3

BÀI THỰC HÀNH 5.

CÁC CẤU TRÚC ĐIỀU KHIỂN, CURSOR


I. CẤU TRÚC ĐIỀU KHIỂN
1. Cấu trúc IF … ELSE
Viết câu lệnh thực hiện yêu cầu: nếu tổng doanh thu bán được trong năm 2024 lớn
hơn N thì in ra thông báo ‘Đã đạt doanh số’, ngược lại in ra thông báo ‘Chưa đạt
doanh số’

BEGIN
DECLARE @sales INT;
SELECT
@sales = SUM(Dongia * SLXuat)
FROM
tblCTPXUAT ct join tblVATTU vt on ct.MaVTu=vt.MaVTu join tblPXUAT dh on
ct.SoPX = dh.SoPX
WHERE
YEAR(NgayXuat) = 2024;

print N'Doanh số đạt được là: ' + str(@sales)

IF @sales > 10000


BEGIN
PRINT N'Đã đạt doanh số đặt ra';
END
ELSE print N'Doanh số chưa đạt'
END

2. Cấu trúc CASE


Hiển thị ‘giá bán cao’ nếu đơn giá >=1000; ‘giá bán vừa’ nếu 50<=đơn giá <1000,
ngược lại ‘giá bán thấp’
select [Tình trạng] = CASE
When dongia>=100 Then N'Giá bán cao'
When dongia>=50 Then N'Giá bán vừa'
ELSE N'Giá bán thấp'
END, tblVATTU.*
from tblVATTU
3. Cấu trúc WHILE
Tính tổng các số chẵn từ 1 đến 100
declare @i int=0, @s int = 0
while (@i<=100)
begin set @s = @s + @i
set @i=@i+1
end
print @s
II. CURSOR
(tham khảo video: https://youtu.be/72bb1Zs6h1Y?si=NDaM-5JiXVpXOkua)
1. Con trỏ (Cursor) là gì?
- Ta có thể sử dụng các con trỏ CURSOR để duyệt qua dữ liệu.
- CURSOR là một tập hợp kết quả truy vấn (lưu trữ kết quả của câu lệnh SELECT, các
hàng), với CURSOR ta có thể duyệt qua từng hàng kết quả để thi hành những tác vụ
phức tạp.
- Ở một thời điểm, CURSOR có thể truy cập bởi một con trỏ đến một hàng của nó, chỉ
thể dịch chuyển con trỏ từ dòng này sang dòng khác.
2. Các lệnh của con trỏ (Cursor):
 Lệnh tạo cursor:
DECLARE cursor_name CURSOR FOR <câu lệnh select>

 Lệnh mở cursor:
OPEN cursor_name

 Lấy dữ liệu từ trong cursor:


FETCH NEXT FROM cursor_name INTO @tên_biến

 Kiểm tra kết quả lấy dữ liệu từ cursor (kiểm tra ngay sau lệnh FETCH NEXT):
@@FETCH_STATUS = 0: lấy dữ liệu thành công

@@FETCH_STATUS < 0: không lấy được dữ liệu.

 Đóng cursor:
CLOSE cursor_name DEALLOCATE cursor_name

3. Ví dụ
--Khai báo biến @id, @title để lưu nội dung đọc
DECLARE @id int
DECLARE @title nvarchar(200)

DECLARE cursorProduct CURSOR FOR -- khai báo con trỏ cursorProduct


SELECT id, title FROM Product -- dữ liệu trỏ tới

OPEN cursorProduct -- Mở con trỏ

FETCH NEXT FROM cursorProduct -- Đọc dòng đầu tiên


INTO @id, @title

WHILE @@FETCH_STATUS = 0 --vòng lặp WHILE khi đọc Cursor thành công
BEGIN
--In kết quả hoặc thực hiện bất kỳ truy vấn
--nào dựa trên kết quả đọc được
PRINT 'ID:' + CAST(@id as nvarchar)
PRINT 'TITLE:' @title
FETCH NEXT FROM cursorProduct -- Đọc dòng tiếp
INTO @id, @title
END

CLOSE cursorProduct -- Đóng Cursor


DEALLOCATE cursorProduct -- Giải phóng tài nguyên

Ví dụ: --Xem mã vật tư, tên vật tư có mã vật tư bắt đầu là V


--Mã vật tư VT15 Tên vật tư: Tủ lạnh...
--Mã vật tư VL90 Tên vật tư: Laptop...
declare cur_VT cursor
for
select MaVTu,TenVTu from tblVATTU where MaVTu like 'V%'
declare @ma char(5), @ten Nvarchar(50)
open cur_VT
fetch next from cur_VT into @ma, @ten
if (@@FETCH_STATUS <> 0) print N'Không tìm thấy!'
else
while (@@FETCH_STATUS =0 )
begin
print N'Mã vật tư: '+@ma+ N' Tên vật tư: ' + @ten
fetch next from cur_VT into @ma, @ten
end
close cur_VT
deallocate cur_VT
Bài tập: Sử dụng cursor để thực hiện các yêu cầu sau, sử dụng IF ... ELSE,
nếu không có hiện ra thông báo không có
1. Hiện thông tin Nhà cung cấp, số đặt hàng, tên vật tư, số lượng đặt hàng.
2. Hiện thông tin Nhà cung cấp, số đặt hàng, tên vật tư, số lượng đặt hàng có số
lượng đặt hàng >=A.
3. Hiện các phiếu nhập, tên vật tư, số lượng nhập theo ngày nhập hàng tăng dần.
4. Hiện số lượng đặt hàng của các vật tư có đơn đặt hàng là N.
5. Hiện số lượng đặt hàng của các vật tư có số lượng đặt hàng >=N
6. Hiện số lượng xuất hàng của các vật tư có phiếu xuất là N.
7. Hiện số lượng xuất hàng của các vật tư có số lượng xuất hàng >=N
8. Hiện tổng số lượng đặt hàng của các vật tư.
9. Hiện các vật tư có tổng lượng đặt hàng >=N.
10.Hiện tổng số lượng bán hàng của các vật tư.
11.Thống kê số lượng đặt hàng của các vật tư theo Nhà cung cấp.
12.Thống kê số lượng nhập hàng của các vật tư theo Nhà cung cấp.

You might also like