PowerPoint Template LOGO Chương 4Chương 4 T SQL PROGRAMINGT SQL PROGRAMING KHOA CÔNG NGHỆ THÔNG TIN I KHAI BÁO VÀ SỬ DỤNG BIẾN Có 2 loại biến Cục bộ và toàn cục 1 Biến cục bộ Định nghĩa là biến chỉ[.]
Trang 1Chương 4 T-SQL PROGRAMING
KHOA CÔNG NGHỆ THÔNG TIN
Trang 2I KHAI BÁO VÀ SỬ DỤNG BIẾN
Có 2 loại biến: Cục bộ và toàn cục
1 Biến cục bộ:
Định nghĩa: là biến chỉ sử dụng trong đoạn chương
trình khai báo nó như Query Batch, stored procedure/ function , chứa giá trị thuộc một kiểu nhất định
Biến cục bộ được bắt đầu bằng 1 ký hiệu @
Khai báo:
Declare <@tên_biến> <Kiểu_dữ_liệu >, …
Ví dụ:
Declare @MaSinhVien char(10)
Declare @Gioitinh bit, @Ngaysinh SmallDateTime
Trang 3 Gán giá trị cho biến
Cú pháp
Set @tên_biến = {giá_trị | biến |
biểu_thức | Cấu trúc Select }
Ví dụ
Set @MaLop = ‘TH2001’
Set @SoSV = (select count (*) from SinhVien) Set @MaLop = ‘TH’+Year(@NgayTuyenSinh)
Chú ý: Kết quả lệnh Select chỉ cho một giá trị
(không thể nhiều bộ giá trị)
Trang 4 Gán giá trị của cột tại dòng hiện tại hoặc dòng chỉ định
trong Table cho biến.
Cú pháp:
Select <@tên biến1>=<Tên cột 1>,
<@tên biến2>=<Tên cột 2>,
…
[Where <Điều kiện>]
Nếu kết quả của Select cho nhiều dòng thì sẽ gán giá trị của dòng có STT vật lý đầu tiên cho biến
Hiển thị kết quả của biến:
Print <@tên biến>
Ví dụ: Hiển thị dòng ‘Xin chào’ họ tên của sinh viên đầu tiên trong bảng SINHVIEN
Declare @ht nVarchar(30)
Select @ht=HotenFrom SINHVIEN
Print 'Xin chào'+ @ht
Trang 52 Biến toàn cục:
Định nghĩa: là biến được sử dụng bất kỳ đâu trong hệ thống
Trong SQL biến toàn cục Là các biến hệ thống do SQL
Server cung cấp
SQL tự cập nhật giá trị cho các biến này, Người sử dụng
không thể gán giá trị trực tiếp cho biến này
Bản chất là 1 hàm (function) và bắt đầu bằng ký tự @@
Trang 6 Một số biến toàn cục trong SQL
@@ERROR Mã số lỗi của câu lệnh T-SQL cuối cùng bị lỗi
@@FETCH_STATUS Trạng thái truy nhập con trỏ:
0 nếu trạng thái truy nhật cuối cùng thành công -1 nếu có lỗi
@@IDENTITY Giá trị xác định (identity) cuối cùng được thêm
vào
@@ROWCOUNT Số lượng dòng của kết quả câu lệnh SQL gần
đây nhất.
@@SERVERNAME Tên của Server địa phương
@@TRANSCOUNT Số lượng những giao dịch đang được mở
@@VERSION Thông tin về phiên bản SQL Server đang dùng
@@CURSOR_ROWS Số lượng các dòng dữ liệu của con trỏ mới được
mở gần đây nhất
Trang 8 Ví dụ:
Viết lệnh để thêm dữ liệu mới (001,Hồ Thị ,Lan, CT11) vào bảng SINHVIEN Qui định rằng mỗi lớp chỉ được tối đa 50 sinh viên.
Declare @SiSo int
Select @SiSo = Count(MaSV) From SINHVIEN
Trang 9 2 Cấu trúc Case
Cú pháp: Có hai dạng
–Dạng 1 (simple case):
Case Biểu_thức
When Giá_trị 1 Then kết_quả 1
[When Giá_trị 2 Then Kết_quả 2
[ Else kết_quả_khác]
End
Trang 10Có thể thêm Break và Continue trong khối lệnh của while
Break: thoát khỏi vòng While hiện hành
Continue : trở lại đầu vòng While, bỏ qua các lệnh sau đó Giải thích:
Trang 11Ví dụ: Viết đoạn chương trình tách tên của sinh viên có mã ‘0001’ trong bảng SINHVIEN
Declare @ht varchar(30),@ten varchar(10), @L int, @i int,@j int,@kt varchar(10)
set @ht=(select hoten from SINHVIEN Where MaSV='0001')
Trang 12III- CURSOR (CON TRỎ)
1 Khái niệm:
Là một cấu trúc dữ liệu ánh xạ đến một tập các dòng dữ liệu là kết quả của một câu truy vấn (select), cho phép duyệt tuần tự các dòng dữ liệu và đọc giá trị từng dòng trong tập kết quả
Sử dụng con trỏ có thể đến vị trí một dòng nhất định trong tập kết quả.
Truy cập đến 1 dòng hoặc 1 tập hợp những dòng từ vị trí hiện tại của con trỏ trong tập kết quả
Hỗ trợ sửa chữa dữ liệu ở 1 dòng nào đó
Ví dụ: Chúng ta có một danh sách sinh viên (Select), trong lập trình ta muốn có một con trỏ đến vị trí từng dòng để có
những truy cập cần thiết.
Trang 13[ Static| Dynamic]
[ Read_only]
For select_statement
Những tham số gạch chân là mặc định
Trang 14Read only: chỉ có thể đọc từ cursor, không thể sử dụng
cursor để update dữ liệu trong các bảng liên quan (ngược lại với
“for update…” )
Trang 152 Duyệt tuần tự mẫu tin trong kết quả
Cú pháp lệnh
Fetch [ [Next| Prior| First| Last| Absolute n| Relative n] From Tên_cursor
[Into Tên_biến [,…n] ]
FETCH FIRST: Truy cập đến dòng đầu tiên
FETCH NEXT: Truy cập đến dòng tiếp theo Mặc định
FETCH PRIOR: Truy cập đến dòng trước dòng hiện tại của con trỏ FETCH LAST: Truy cập đến dòng cuối cùng.
FETCH ABSOLUTE n: Nếu n là số nguyên dương, nó truy cập đến
dòng thứ n Nếu n là số nguyên âm, nó truy cập đến dòng thứ n
trước dòng cuối cùng của con trỏ Nếu n=0 nó truy cập tới chính
dòng hiện tại.
FETCH RELATIVE n: Nếu n là số dương, truy cập đến dòng thứ n sau dòng hiện tại của con trỏ Nếu n là số âm, truy cập đến dòng thứ n, truy cập đến dòng thứ n trước vị trí hiện tại của con trỏ Nếu bằng 0, truy nhập đến dòng hiện tại một lần nữa.
Trang 16Biến hệ thống @@fetch_status:
Cho biết lệnh fetch vừa thực hiện có thành công hay không
Là cơ sở để biết đã duyệt đến cuối cursor hay chưa
Nếu @@fetch_status =0 thì thành công con trỏ đang ở vị trí mẫu thỏa mãn điều kiện
Nếu @@fetch_status <>0 thì KHÔNG thành công con trỏ đang ở vị trí vượt qua mẫu tin cuối cùng của bảng kết quả
Trang 17Declare cur_Masv cursor
For Select MaSV, Malop From SINHVIEN
Open cur_Masv
declare @Masv varchar(5), @Malop varchar(5)
Fetch Next From cur_Masv into @MaSV,@Malop
Update SINHVIEN Set MaSV = @Malop+@MaSV
Where MaSV = @MaSV
Ví du: Cập nhật lại giá trị MaSV = MaLop + MaSV hiện tại cho
tất cả sinh viên
Trang 18Ví dụ: Cập nhật lại Masv thứ n là aaa
Declare cur_DSSV cursor scroll
For select MaSV From SINHVIEN
Open cur_DSSV
Declare @masv varchar(10)
Fetch Absolute 5 From cur_DSSV into @Masv
If (@@fetch_status = 0)
update SINHVIEN set masv ='aaa' where current of cur_DSSV Deallocate cur_DSSV
Trang 19Tóm lại các bước sử dụng biến con trỏ trong lập trình
B1 Định nghĩa Cursor từ một kết quả Select
Declare Cursor_name Cursor For select_statement
B4 Kểm tra có thành công không:
Nếu @fetch_status = 0 thì xử lý lệnh, quay lại B3
Nếu @fetch_status <> 0 thì sang B5
B5 Đóng Cursor:
CLOSE <Cursor_name>
B6 Xoá tham chiếu của Cursor:
DEALLOCATE <Cursor_name>
Trang 203 Viết đoạn chương trình phân lớp ‘CT11’ ra thành 2 lớp CT11A, CT11B có số lượng nam nữ như nhau.
Trang 21Declare cur_SBD cursor
For Select MaSV From SINHVIEN order by Malop Open cur_SBD
Where Current Of cur_SBD
Fetch Next From cur_SBD
set @i=@i+1
End
Close cur_SBD
Deallocate cur_SDB
Trang 22Declare cur_phanlop cursor for
select masv,Gioitinh,Malop from SINHVIEN where malop='ct11‘ order by gioitinh
open cur_phanlop
declare @malop varchar(10),@masv varchar(10),@i int
fetch next from cur_phanlop
Trang 23IV Stored procedure (Thủ tục)
Trang 24Danh sách tham số vào (ra)
<Tên tham số> <kiểu> [=default] [output]
Output: Chỉ định tham số ra (muốn biết giá trị của nó)
- Tên tham số đặt theo qui tắc như tên biến cục bộ
- Lệnh RETURN được sử dụng để kết thức stored procedure và trả về giá trị là một số, có thể là một biến Giá trị mặc định là Return 0
- Mỗi lệnh SELECT đặt trong stored procedure sẽ trả về 1 bảng
Trang 25Declare @SiSo int
Select @SiSo = Count(MaSV) From SINHVIEN
Else Print N’Lớp đã đủ số sinh viên’
CREATE PROCEDURE usp_Sinhvien
@Masv varchar(10),@Ho nvarchar(30),@Ten varchar(10),
@Malop varchar(10),@Siso int =NULL Output
AS
Go
(@Masv,@Ho,@Ten,@Malop)
@Malop
Trang 264 Lời gọi thủ tục
EXECUTE tên_thủ_tục [danh_sách_các_đối_số]
Số lượng các đối số cũng như thứ tự của chúng phải phù hợp với số lượng và thứ tự của các tham số khi định nghĩa thủ tục
Nếu không xác định được thứ tự của danh sách đối thì ta viết thêm tên tham số @tên_tham_số = giá_trị
Trang 27Declare @ss int,@Ketqua
EXEC @Ketqua=usp_sinhvien
@masv=‘012’,@ho=N’PhanThanh’, @ten=N’Thúy’,
@Malop=’CT11’,@ss output Print @ss
Print @Ketqua
Trang 282 Viết thủ tục usp_GET_ALL_SinhvienLop: hiển thi danh sách sinh viên
gồm Masv, Malop, Ho, Ten, Gioitinh(Nam,Nữ), Ngay sinh
(dd/mm/yyyy) của lớp được chỉ định.
3 Viết thủ tục usp_Phanlop để phân lớp được chỉ định
4 Viết thủ tục usp_TinhdiemTBC; xuất dữ liệu ra bảng được chỉ định
5 Viết thủ tục usp_DSNgungtiendo: đưa ra danh sách sinh viên ngừng
tiến độ học tập (có tổng số đơn vị học trình của môn học thiếu
điểm >25)
Trang 29Alter PROC usp_Inserrt_SinhVien
@masv varchar(10), @HoTen nvarchar(30),
@Dienthoai varchar(7),@maLop varchar(10) ,Ngaysinh Date
@tbloi varchar(30)=null output
INSERT INTO SINHVIEN(Masv, HoTen, Dienthoai, MaLop)
VALUES(@Masv, @HoTen, @Dienthoai, @MaLop)
RETURN 0 /* procedure tự trả về 0 nếu không RETURN */
END
GO
Trang 30DECLARE @kq varchar(30)
EXEC usp_Inserrt_SinhVien '002', N'Nguyễn Văn A', '7654343', 'CT11',’09/09/1987’@kq output
PRINT @kq
Trang 31/*procedure luôn trả về 0 nếu không RETURN*/
END
GO
Trang 32Thêm từ khóa WITH ENCRYPTION Trong lệnh Alter thủ tục
Trang 33V Hàm (Function)
Hàm là đối tượng cơ sở dữ liệu tương tự như thủ tục Điểm khác biệt giữa hàm và thủ tục là hàm trả về một giá trị Giá trị trả về có thể là một bảng có được từ một câu truy vấn
Trang 34Bài tập
1 Viết hàm Xeploai theo quy định.
2 Viết hàm hiển thị giới tính Nam, Nữ.
3 Viết hàm đọc điểm
4 Viết hàm đọc số có ba chữ số.
5 Viết hàm đọc số có nhiều chữ số.
6 Viết hàm tách tên
Trang 35Bài tập 1: Biến vào: DIEM; Biến ra: XL
Create Function Xeploai
(@Diem numeric(4,1))Returns nvarchar(10) as
Begin
declare @xl nvarchar(10)
set @xl=case
when @Diem>=8 then N'Giỏi'
when @Diem>=7 then N'Khá'
When @Diem>=5 then N'Trung binh'
Trang 37Function Tachten(@ht nvarchar(30)) returns nvarchar(10)
Trang 38VI MỘT SỐ HÀM CƠ BẢN
1 Các hàm toán học:
1 ABS(x) : Trị tuyệt đối của x
2 SQRT(x) : Căn bậc hai của x
3 SQUARE( x) : x bình phương
4 POWER( y, x ) : y lũy thừa x
5 LOG(x) : Logarit của x
6 EXP(x) : Hàm mũ cơ số e của x
7 SIGN(x) : Lây dâu của số x (-1: x<0, 0: x=0, +1: x>0)
8 ROUND(x,n) : Làm tròn tới n sô thập phân.
9 CEILING( x) : Sô nguyên nhỏ nhất nhưng lớn hơn x
10 FLOOR(X) : Sô nguyên lớn nhât nhưng nhỏ hơn x
11 và các hàm lng giác: SIN, COS, TAN, ASIN, ACOS,
ATAN
Trang 392 Các hàm xử lý chuỗi
1 ACSII( ch ) : Mã ASCII của ký tự ch
2 CHAR( n ) : Ký tự có mã ASCII là n
3 LOWER( str ) : Trả vê chuỗi chữ thường
4 UPPER(str) : Trả về chuỗi chữ hoa
5 LTRIM(str) : Trả vê chuỗi không có dấu cách bên trái
6 RTRIM(str) : Trả vê chuoi không có dấu cách bên phải
7 LEFT(str,n): Lấy n ký tự phía trái của dãy str.
8 RIGHT(str,n): Lây n ký tự phía phải của dãy str.
9 SUBSTRING(str, start, n): Lây n ký tự của dãy str kể từ vị trí start trong dãy.
10 REPLACE(str1, str2, str3): thay thế tất cả str2 trong str1 bằng str3.
11 STUFF(str1, start, n, str2 ): Thay thế n ký tự trong str1 từ vị trí start bằng chuỗi str2.
12 STR( x, len [, Dec]): Chuyển sô x thành chuỗi.
Trang 403 Hàm xử lý ngày tháng
1 GETDATE(): Cho ngày tháng năm hiện tại (Oracle: SYSDATE)
2 DAY(dd): Cho sô thứ tự ngày trong tháng của biểu thức ngày
Trang 416 DATEADD(datepart,number, date): Đưa ra một phần trong date
và cộng thêm thêm một số Number
7 DATEDIFF(datepart, date1, date2): Đưa ra một phần trong date2
và cộng thêm một ngày date1
Trang 424 Hàm chuyển đổi kiểu dữ liệu
1 CAST (biểu_thức AS kiểu_dữ_liệu)
Chuyển đổi giá trị của biểu thức sang kiểu được chỉ định
2 CONVERT(kiểu_dữ_liệu, biểu_thức [,kiểu_chuyển_đổi])
Hàm có chức năng chuyển đổi giá trị của biểu thức sang kiểu dữ liệu được chỉ định Tham số kiểu_chuyển_đổi là một giá trị số thường được sử dụng khi chuyển đổi giá trị kiểu ngày sang kiểu chuỗi nhằm qui định khuôn dạng dữ liệu được hiển thị và được qui định như sau: