You are on page 1of 12

HQTCSDL

Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

HƯỚNG DẪN THỰC HÀNH


HỆ QUẢN TRỊ CSDL

Mục đích: ...................................................................................... 1


Hướng dẫn:.................................................................................... 1
1. Stored procedure:.................................................................... 1
Các ví dụ đơn giản : ................................................................. 4
Bắt đầu (khung sp, vài lệnh đơn giản, khai báo tham số) ...... 4
Vòng lặp ............................................................................... 4
Đệ quy .................................................................................. 5
Truy vấn ............................................................................... 5
2. Cursor: .................................................................................. 6
Các lệnh về cursor : .................................................................... 6
Ví dụ một cách sử dụng thông dụng: ............................................. 6
Ví dụ một cách sử dụng hai cursor lồng nhau : ................................ 7
Các ví dụ luyện tập : ................................................................ 7
3. Function :............................................................................... 8
Hàm trả về giá trị vô hướng (scalar value) : .................................... 8
Hàm trả về giá trị là bảng tạm (inline table-valued) : ....................... 9
4. Trigger:................................................................................ 10
¾ Lệnh tạo Trigger:................................................................... 10
¾ Lệnh xóa Trigger: .................................................................. 10
Các ví dụ : ............................................................................. 10
5. Các vấn đề khác: ................................................................... 12

Mục đích:
Xây dựng các stored procedure và trigger để thực hiện các chức năng
của hệ thống.
Sử dụng các lệnh Transact-SQL, Stored procedure, Cursor, Function,
Trigger.
Bài tập thực hành: Quản lý thư viện.

Hướng dẫn:

1. Stored procedure:
Khi chúng ta tạo một ứng dụng có kết nối cơ sở dữ liệu với Microsoft
SQL Server, ngôn ngữ lập trình Transact-SQL, còn gọi là T-SQL, là ngôn ngữ
chính giao tiếp giữa ứng dụng của chúng ta và database của SQL Server.
Khi chúng ta tạo các đoạn chương trình có sử dụng Transact-SQL, hai
phương pháp chính có thể dùng để lưu trữ và thực thi cho các chương trình
là:

1
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

Chúng ta có thể lưu trữ các chương trình cục bộ và tạo các ứng dụng để
gởi các lệnh đến SQL Server và xử lý các kết quả.
Hoặc chúng ta có thể lưu trữ những chương trình như các stored
procedure trong SQL Server và tạo những ứng dụng gọi thực thi các stored
procedure này và xử lý các kết quả.
Stored procedure trong SQL Server cũng giống như các thủ tục trong
các ngôn ngữ lập trình khác. Chúng có các đặc tính sau:
Chấp nhận những tham số vào, trả về những giá trị được chứa trong
các tham số ra, và có giá trị trả về kiểu duy nhất là số nguyên integer.
Chứa các lệnh của chương trình để thực hiện các xử lý, truy vấn trong
cơ sở dữ liệu, bao gồm cả lệnh gọi các thủ tục khác thực thi.
Trả về các giá trị trạng thái cho biết việc thực hiện thành công hay thất
bại, nếu thất bại thì lý do vì sao thất bại.
Chúng ta có thể dùng lệnh Transact–SQL đó là EXCUTE để thực thi các
stored procedure. Stored procedure khác với các hàm xử lý là giá trị trả về
của chúng không chứa trong tên và chúng không được sử dụng trực tiếp
trong biểu thức.
Stored procedure có những thuận lợi so với các chương trình Transact-
SQL lưu trữ cục bộ là:
Chúng cho phép điều chỉnh chương trình cho phù hợp: Stored
procedure có thể được chỉ định do một người nào đó tạo ra và sự thay đổi
của chúng hoàn toàn độc lập với mã nguồn của chương trình. Chúng ta có
chỉ tạo stored procedure một lần và lưu trữ trong database một lần, trong
chương trình chúng ta có thể gọi nó với số lần bất kỳ.
Chúng cho phép thực thi nhanh hơn: nếu việc xử lý yêu cầu một đoạn
mã nguồnTransact – SQL khá lớn hoặc việc thực thi mang tính lặp đi lặp lại
thì stored procedure thực hiện nhanh hơn việc thực hiện hàng loạt các lệnh
Transact-SQL gọi từ chương trình. Chúng được phân tích cú pháp và tối ưu
hóa trong lần thực thi đầu tiên và một phiên bản dịch của chúng trong đó
sẽ được lưu trong bộ nhớ để sử dụng cho lần sau, nghĩa là trong những lần
thực hiện sau chúng không cần phải phân tích cú pháp và tối ưu lại, mà
chúng sẽ sử dụng kết quả đã được biên dịch trong lần đầu tiên.

2
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

Chúng có thể làm giảm bớt vấn đề nghẽn mạch đường truyền mạng :
giả sử một xử lý mà có sử dụng hàng trăm lệnh của Transact-SQL và việc
thực hiện thông qua từng dòng lệnh đơn, như vậy việc thực thông qua
stored procedure sẽ tốt hơn, vì nếu không khi thực hiện chúng ta phải gởi
hàng trăm lệnh đó lên mạng và điều này sẽ dẫn đến tình trạng nghẽn mạng.
Chúng có thể sử dụng trong vấn đề bảo mật của máy : người sử dụng
có thể được cấp những quyền để sử dụng các stored procedure này, thậm
chí họ không được phép thực thi trực tiếp những stored procedure này.

Một Stored procedure được định nghĩa gồm các thành phần chính sau:
Tên của stored procedure
Các tham số vào và ra
Thân của stored procedure: bao gồm các lệnh của Transact-SQL dùng
để thực thi procedure.
Một stored procedure được tạo bằng lệnh Create Procedure, và có thể
thay đổi nội dung thân của nó bằng cách dùng lệnh Alter Procedure, và có
thể xóa bằng cách dùng lệnh Drop Procedure trong lập lệnh của Transact –
SQL.
Cú pháp của lệnh Create Procedure
create procedure procedure_name
--các biến tham số vào ra
[@parameter data_type input/in/output/out]
as begin
-- khai báo các biến cho xử lý
-- các câu lệnh transact-sql
end

Cú pháp của lệnh Alter Procedure (giống lệnh Create Procedure)


alter procedure procedure_name
--các biến tham số vào ra
[@parameter data_type input/in/output/out]
as begin
-- khai báo các biến cho xử lý
-- các câu lệnh transact-sql
end

Cú pháp của lệnh Drop Procedure

3
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

drop procedure procedure_name

Các ví dụ đơn giản :


Viết stored procedure có nội dung như sau :
Bắt đầu (khung sp, vài lệnh đơn giản, khai báo tham số)
1. In ra dòng ‘Hello’
2. In ra dòng ‘Xin chào’.
3. In ra dòng ‘Xin chào’ + @ten với @ten là tham số đầu vào là tên của
bạn.
4. In ra dòng ‘Xin chào’ + @ten với @ten là tham số đầu vào là tên
Tiếng Việt có dấu của bạn.
Gợi ý :
♦ sử dụng UniKey để gõ Tiếng Việt
♦ chuỗi unicode phải bắt đầu bởi N
(vd: N’Tiếng Việt’)
♦ dùng hàm cast (<biểuThức> as
<kiểu>) để đổi thành kiểu <kiểu>
của <biểuThức>

5. Nhập vào 2 số @s1,@s2. In ra tổng @s1+@s2.


6. Nhập vào 2 số @s1,@s2. In ra câu ‘Tổng là : @tg ‘ với @tg
=@s1+@s2.
7. Nhập vào 2 số @s1,@s2. Xuất tổng @s1+@s2 ra tham số @tong.
Cho thực thi và in giá trị của tham số này để kiểm tra.
8. Nhập vào 2 số @s1,@s2. Xuất tổng @s1+@s2 ra tham số @tong.
Cho thực thi và in giá trị của tham số này để kiểm tra dưới dạng
‘Tổng là : @tg ‘ với @tg =@s1+@s2.

9. Nhập vào 2 số @s1,@s2. In ra max của chúng.


10. Nhập vào 2 số @s1,@s2. In ra câu ‘Số lớn nhất của @s1 và @s2 là
@max’ với @s1,@s2,max là các giá trị tương ứng.
11. Nhập vào 2 số @s1,@s2. Xuất min và max của chúng ra tham số
@max. Cho thực thi và in giá trị của các tham số này để kiểm tra.

Vòng lặp
12. Nhập vào số nguyên @n. In ra các số từ 1 đến @n.
13. Nhập vào số nguyên @n. In ra tổng các số chẵn từ 1 đến @n
14. Nhập vào số nguyên @n. In ra tổng, và số lượng các số chẵn từ 1
đến @n
15. Nhập vào 2 số. In ra ước chung lớn nhất của chúng theo gợi ý dưới
đây.
b1. không mất tính tổng quát giả sử
a <= A
b2. nếu A chia hết cho a thì : (a,A) = a
ngược lại :
(a,A) = (A%a,a)
hoặc
(a,A) = (a,A-a)
b3. lặp lại b1,b2 cho đến khi điều kiện trong b2 được thỏa

4
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

16. Nhập vào 2 số nguyên @s1,@s2. Xuất ước chung lớn nhất của @s1
và @s2 ra tham số @gcd. Cho thực thi và in bằng lệnh select giá trị
của tham số này để kiểm tra dưới dạng ”Kết quả : ucln(@s1,@s2) = @gcd
“ trong đó thay thế @s1,@s2,@gcd bởi các giá trị tương ứng.

Đệ quy
17. Cài đặt có dùng đệ quy, thuật toán Euler tìm ước chung lớn nhất
(a,A).
18. Nhập vào 2 số. In ra ước chung lớn nhất của chúng.
Bắt buộc viết bằng đệ quy.
19. Nhập vào số nguyên @n <= 5. In ra tất cả các số nhị phân có @n bit.
Ví dụ : @n=2 thì kết quả in được là
00
01
10
11

Truy vấn
Tạo stored procedure liệt kê những thông tin của đầu sách, thông tin tựa
sách và số lượng sách hiện chưa được mượn của một đầu sách cụ thể
(ISBN).
create procedure sp_thongtindausach
@isbn int
as
begin
select tuasach, tacgia, ngonngu, bia, trangthai
, count(*)
from dausach ds, tuasach ts, cuonsach cs
where
ds.ma_tuasach = ts.ma_tuasach and
ds.isbn = cs.isbn and
ds.isbn = @isbn and
tinhtrang = ‘yes’
group by tuasach, tacgia, ngonngu, bia
, trangthai
end

5
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

2. Cursor:
Cursor dùng để lưu trữ kết quả câu lệnh SELECT trong quá trình lập trình.
Các lệnh về cursor :
Lệnh tạo cursor:
Cách 1:
declare cursor_name cursor for
select_statement ;

Cách 2:
declare @cursor_name cursor ;
set @cursor_name = cursor for
select_statement ;

Lệnh mở cursor:
open cursor_name ;

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


fetch next from cursor_name into @variable --, variable2, ... ;

Điều kiệ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 ;

Ví dụ một cách sử dụng thông dụng:

declare @c cursor ;
set @c = cursor for
Select tt,tt2, ...
From … Where …
open @c ;

fetch next from @c into


@tt, @tt2, ... ;
while @@fetch_status = 0 begin
//su du.ng @tt, @tt2 here
fetch next from @c into
@tt, @tt2, ... ;
end
close @c ;
deallocate @c ;

6
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

Ví dụ một cách sử dụng hai cursor lồng nhau :

declare @c cursor ;
set @c = cursor for
select top 2 ma_docgia from DocGia
open @c ;
declare @madg varchar(66) ;
fetch next from @c into @madg ;
while @@fetch_status =0 begin
print @madg ;

--cursor @c2 dung binh thuong o day


declare @c2 cursor ;
set @c2 = cursor for
select top 4 ma_tuaSach from TuaSach ;
open @c2 ;
declare @mats varchar(66) ;
fetch next from @c2 into @mats ;
while @@fetch_status = 0 begin
print ' ' + @mats ;
fetch next from @c2 into @mats ;
end
close @c2 ;
deallocate @c2 ;

fetch next from @c into @madg ;


end

close @c
deallocate @c

Các ví dụ luyện tập :


20. Dùng lệnh print để in ra danh sách mã các tựa sách.
21. Viết một stored proc có nội dung:
Dùng lệnh print để in ra danh sách mã và họ tên các độc giả.

7
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

3. Function :
Trong SQL Server ta có thể viết hàm và lấy giá trị trả về.
Các dạng hàm có thể viết như sau :

Hàm trả về giá trị vô hướng (scalar value) :


Ví dụ, viết hàm tính tuổi của người có năm sinh là @ns :
Ghi chú :
FN = Scalar function
IF = In-lined table-function

--drop hàm nếu đã có


if object_id('fTuoi','FN') is not null
drop function fTuoi
go
--tạo hàm
create function fTuoi (@ns int) --phải đặt tham số vào dấu ngoặc nhọn
returns int --returns phải có 's'
as begin
return year(getdate()) - @ns
end
go
--test
print dbo.fTuoi(1982) --phải có dbo.

Tổng quát, qua ví dụ này có thể thấy cú pháp để tạo hàm


trả về giá trị vô hướng là :

create function function_name


(
[ @parameter_name parameter_data_type ]
)
returns return_data_type
[ as ] begin
function_body
return scalar_expression
end

8
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

Hàm trả về giá trị là bảng tạm (inline table-valued) :


Ví dụ, viết hàm tạo bảng tạm từ một câu truy vấn :
Ghi chú :
FN = Scalar function
IF = In-lined table-function
--drop hàm nếu đã có
if object_id('fDSach','IF') is not null
drop function fDSach
go
--tạo hàm
--giả sử ta có bảng T(i int)
create function fDSach (@ns int) --phải đặt tham số vào dấu ngoặc nhọn
returns table
as
return (
select *
from T
)
go
--test
select *
from fDSach(1982) –không cần dbo.

Qua ví dụ này có thể thấy cú pháp để tạo


hàm trả về giá trị là bảng tạm là :
create function function_name
(
[ @parameter_name parameter_data_type ]
)
returns table
[ as ]
return [ ( ]
select_statement
[)]

9
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

4. Trigger:
Trigger là một trường hợp đặc biệt của stored procedure, nó sẽ có hiệu
lực (tự động thực thi) khi chúng ta thay đổi dữ liệu trên một bảng dữ liệu cụ
thể, hoặc các xử lý làm thay đổi dữ liệu của các lệnh: insert, update, delete.
Trigger có thể chứa các lệnh truy vấn từ các bảng khác hoặc bao gồm
những lệnh T-SQL phức tạp giống như stored procedure vậy.
Một số thuận lợi khi sử dụng trigger:
Trigger chạy một cách tự động: chúng được kích hoạt ngay tức thì khi có
sự thay đổi dữ liệu trên bảng dữ liệu.
Trigger có thể thực hiện cascade (lan truyền) khi việc thi hành có ảnh
hưởng đến những bảng liên quan.
Trigger có những hiệu lực ít bị hạn chế hơn so với ràng buộc giá trị
trên một bảng (sử dụng check, rule), nghĩa là có thể ràng buộc tham
chiếu đến những cột khác nhau của những bảng dữ liệu khác nhau.

Cú pháp các lệnh liên quan đến trigger.


Lệnh tạo Trigger:
create trigger trigger_name
on table_name
for [insert,update,delete]
as
begin
[Khai báo các biến xử lý]
[Các lệnh Transact-SQL]
end [;]

Lệnh xóa Trigger:


drop trigger create trigger_Name

Các ví dụ :
Viết trigger có nội dung như sau :
22. Khi :
thêm mới
sửa tên tác giả
thêm/sửa
một tựa sách thì in ra câu thông báo bằng Tiếng Việt ‘Đã thêm mới tựa
sách’.
Gợi ý :
kiểm tra trigger đã tạo bằng khối lệnh
để dữ liệu không bị thay đổi :

10
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

begin tran
--khối lệnh thêm,xóa,sửa
rollback
23. Khi sửa tên tác giả cho một (hoặc nhiều) tựa sách thì in ra:
danh sách mã các tựa sách vừa được sửa.
danh sách mã tựa sách vừa được sửa và tên tác giả mới.
danh sách mã tựa sách vừa được sửa và tên tác giả cũ.
danh sách mã tựa sách vừa được sửa cùng tên tác giả cũ và tác giả
mới.
Gợi ý :
câu lệnh
insert into T
select… from …
cho phép insert cùng lúc nhiều dòng.
dùng bảng Inserted (hoặc/và Deleted).

câu thông báo bằng Tiếng Việt


‘Vừa sửa thông tin của tựa sách có mã số xxx’
với xxx là mã tựa sách vừa được sửa.
Gợi ý :
sử dụng cursor để duyệt qua các tựa
sách được sửa trong bảng Inserted
(hoặc Deleted).
24. Khi thêm mới một tựa sách thì kiểm tra xem đã có tựa sách trùng
tên với tựa sách vừa được thêm hay không.
chỉ thông báo vẫn cho insert
thông báo và không cho insert

11
HQTCSDL
Vũ Giang Nam, HTTT, CNTT, ĐHKHTN

5. Các vấn đề khác:


Drop các đối tượng (là table, stored procedure, trigger, function, v.v..) :
Để drop đối tượng trong SQL Server ta dùng lệnh drop tương ứng với đối
tượng đó. Khi drop, có nhu cầu chỉ drop đối tượng nếu đã tồn tại, ngược
lại thì thôi. Để kiểm tra một đối tượng có tồn tại hay chưa, ta có các
cách sau :
Dùng SysObjects:
if exsits (select * from SysObjects where name='objName' and type='objType')
--lệnh drop

Dùng object_id:
if object_id('objName','objType') is not null
--lệnh drop

Các đối tượng khác loại nhau (bảng, khóa,stored proc, hàm …) thì thuộc
các loại objType khác nhau và ccó thể có cùng tên. Để biết một đối
tượng là loại gì trong SQL Server, ta xem cột xtype của bảng SysObjects
của dòng có name là tên của đối tượng đó. Một ví dụ:

name id xtype Ý nghĩa


fkXEPLOAI_SINHVIEN 482100758 F Foreign key
fn_diagramobjects 658101385 FN Function
spClearTables 2099048 P Stored proc
PK__XEPLOAI__123EB7A3 306100131 PK Primary key
XEPLOAI 290100074 U User table

HẾT.

12

You might also like