39863236 StoredProc Cursor Function Trigger

12
HQTCSDL Vũ Giang Nam, HTTT, CNTT, ĐHKHTN 1 HƯỚNG DN THC HÀNH HQUN TRCSDL Mc đích: ...................................................................................... 1 Hướng dn: .................................................................................... 1 1. Stored procedure: .................................................................... 1 Các ví dđơn gin : ................................................................. 4 Bt đầu (khung sp, vài lnh đơn gin, khai báo tham s) ...... 4 Vòng lp ............................................................................... 4 Đệ quy .................................................................................. 5 Truy vn ............................................................................... 5 2. Cursor: .................................................................................. 6 Các lnh vcursor : .................................................................... 6 Ví dmt cách sdng thông dng: ............................................. 6 Ví dmt cách sdng hai cursor lng nhau : ................................ 7 Các ví dluyn tp : ................................................................ 7 3. Function : ............................................................................... 8 Hàm trvgiá trvô hướng (scalar value) : .................................... 8 Hàm trvgiá trlà bng tm (inline table-valued) : ....................... 9 4. Trigger:................................................................................ 10 Lnh to Trigger: ................................................................... 10 Lnh xóa Trigger: .................................................................. 10 Các ví d: ............................................................................. 10 5. Các vn đề khác: ................................................................... 12 Mc đích: Xây dng các stored procedure và trigger để thc hin các chc năng ca hthng. Sdng các lnh Transact-SQL, Stored procedure, Cursor, Function, Trigger. Bài tp thc hành: Qun lý thư vin. Hướng dn: 1. Stored procedure: Khi chúng ta to mt ng dng có kết ni cơ sdliu vi Microsoft SQL Server, ngôn nglp trình Transact-SQL, còn gi là T-SQL, là ngôn ngchính giao tiếp gia ng dng ca chúng ta và database ca SQL Server. Khi chúng ta to các đon chương trình có sdng Transact-SQL, hai phương pháp chính có thdùng để lưu trvà thc thi cho các chương trình là:

Transcript of 39863236 StoredProc Cursor Function Trigger

Page 1: 39863236 StoredProc Cursor Function Trigger

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

1

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à:

Page 2: 39863236 StoredProc Cursor Function Trigger

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

2

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.

Page 3: 39863236 StoredProc Cursor Function Trigger

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

3

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

Page 4: 39863236 StoredProc Cursor Function Trigger

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

4

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

Page 5: 39863236 StoredProc Cursor Function Trigger

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

5

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

Page 6: 39863236 StoredProc Cursor Function Trigger

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

6

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 ;

Page 7: 39863236 StoredProc Cursor Function Trigger

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

7

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ả.

Page 8: 39863236 StoredProc Cursor Function Trigger

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

8

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

Page 9: 39863236 StoredProc Cursor Function Trigger

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

9

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

[ ) ]

Page 10: 39863236 StoredProc Cursor Function Trigger

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

10

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 :

Page 11: 39863236 StoredProc Cursor Function Trigger

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

11

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

Page 12: 39863236 StoredProc Cursor Function Trigger

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

12

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.