Cơ sở dữ liệu Lab8 Stored Procedure va Function - Trường Cao đẳng Quốc tế KENT

Cơ sở dữ liệu Lab8 Stored Procedure va Function/Trường Cao đẳng Quốc tế KENT. Tài liệu được biên soạn dưới dạng file PDF gồm 8 trang, giúp bạn tham khảo, ôn tập và đạt kết quả cao trong kì thi sắp tới. Mời bạn đọc đón xem!

lOMoARcPSD|41967345
STORED PROCEDURE VÀ FUNCTION 1. Stored Procedure (Đc là Stored
Procedure hoc Procedure)
1.1 Gii thiu
Khi chúng ta to mt ng dng vi Microsoft SQL Server, ngôn ng lp trình
Transact-SQL ngôn ng chính giao tiếp gia ng dng database ca SQL Server. Khi
chúng ta tạo các chương trình bng Transact-SQL, hai phương pháp chính thể dùng để
lưu trữ và thực thi cho các chương trình là:
- Chúng ta th lưu trữ các chương trình cục b to các ng dụng để gi
các lệnh đến SQL Server và x lý các kết qu,
- Chúng ta th lưu trữ những chương trình như các stored procedure trong
SQL Server và to ng dụng để gi thc thi các stored procedure và x lý các kết qu.
Đặc tính ca Stored‐procedure trong SQL Server :
- Chp nhn nhng tham s vào tr v nhng giá tr đưc cha trong các
tham s ra đ gi nhng th tc hoc x lý theo lô.
- Cha các lnh của chương trình để thc hin các x trong database, bao
gm c lnh gi các th tc khác thc thi.
- Tr v các trng thái giá tr để gi nhng th tc hoc thc hin các x theo
lô để cho biết vic thc hin thành công hay tht bi, nếu tht bi thì lý do vì sao tht bi.
Ta th dùng TransactSQL EXCUTE để thc thi các stored procedure. Stored
procedure khác vi các hàm xgiá tr tr v ca chúng không cha trong tên và chúng
không được s dng trc tiếp trong biu thc.
Stored procedure có nhng thun li so vi các chương trình Transact-SQL lưu tr
cc b là:
Stored procedure cho phép điều chỉnh chương trình cho phù hp: Chúng ta
có ch to stored procedure mt lần và lưu trữ trong database mt lần, trong chương trình
chúng ta có th gi nó vi s ln bt k. Stored procedure có th đưc ch rõ do một người
nào đó tạo ra s thay đổi của chúng hoàn toàn độc lp vi source code của chương trình.
‐ Stored procedure cho phép thực thi nhanh hơn: nếu s x lý yêu cu một đoạn
source code Transact SQL khá ln hoc vic thc thi mang tính lặp đi lp li tstored
procedure thc hiện nhanh hơn việc thc hin hàng lot các lnh Transact-SQL. 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à mt phiên bn dch ca
chúng trong đó sẽ được lưu trong bộ nh để s dng cho ln sau, nghĩa là trong những ln
thc hin sau chúng không cn phi phân tích pháp và tối ưu lại, chúng s s dng
kết qu đã được biên dch trong lần đầu tiên.
‐ Stored procedure có thm gim bt vấn đề kẹt đường truyn mng: gi s
mt x s dụng hàng trăm lnh ca Transact-SQL vic thc hin thông qua
tng dòng lệnh đơn, như vậy vic thc thông qua stored procedure s tốt hơn, nếu không
khi thc hin chúng ta phi gởi hàng trăm lệnh đó lên mạng điều này s dn đến tình
trng kt mng.
lOMoARcPSD|41967345
Stored procedure th s dng trong vấn đề bo mt ca máy: người s
dng th đưc phân cp nhng quyền để s dng các stored procedure này, thm chí
h không được phép thc thi trc tiếp nhng stored procedure này.
1.2 Cú pháp
Mt Stored procedure được định nghĩa gồm nhng thành phn chính sau:
- Tên ca stored procedure
- Các tham s
- Thân ca stored procedure: bao gm các lnh ca Transact-SQL dùng
để thc thi procedure.
Một stored procedure được to bng lnh Create Procedure, và có th thay đổi bng
cách dùng lnh Alter Procedure, th xóa bng cách dùng lnh Drop Procedure trong
lp lnh ca Transact SQL To procedure:
CREATE PROCEDURE procedure_name
{@parameter data_type input/output }/*các biến tham s vào ra*/
AS
[khai báo c biến cho x lý]
{Các câu lnh
transact---sql}
RETURN value ------ Stored procedure th tr v giá tr hoc không
Mt s lưu ý khi viết stored procedure:
------ 1. Ghi chú 1, mt dòng
/* 2. Ghi chú 2
Nhiu dòng */
/*3. Khai báo biến*/
DECLARE @parameter_name data_type
/*4. Gán giá tr cho biến*/
SET @parameter_name=value
SELECT @parameter_name=column FROM
lOMoARcPSD|41967345
/*5. In thông báo ra màn hình*/
print N‘Chuỗi thông báo unicode’
/*6. Thông báo li */
raiserror (N‘Nội dung thông báo lỗi ’, 16, 1)
/*7. Lnh r nhánh */
IF (điu kin---có th s dng câu truy vn con và t khoá EXISTS)
BEGIN
{Các lnh nếu tho điu kin / nếu ch có 1 lnh thì không cần BEGIN … END}
END
/*8. Lnh r nhánh có ELSE */
IF (điu kin---có th s dng câu truy vn con và t khoá EXISTS)
BEGIN
{Các lnh nếu tho điu kin / nếu ch có 1 lnh thì không cần BEGIN … END}
END
ELSE
BEGIN
{Các lnh nếu không tho điu kin / nếu ch có 1 lnh thì không cần BEGIN … END}
END
/*9. Vòng lặp WHILE (Lưu ý: Không có vòng lặp FOR) */
WHILE ( điu kin )
BEGIN
{Các lnh nếu tho điu kin / nếu ch có 1 lnh thì không cần BEGIN … END} END
Biên dch: Chn đúng đon mã lnh To stored-procedure F5 Thc
thi procedure:
EXEC procedure_name ------Stored---proc không tham s
EXEC procedure_name Para1_value, Para2_value, ... ------Stored---proc có tham s
lOMoARcPSD|41967345
Ly giá tr tr v ca stored procedure:
EXEC @bien = procedure_name ------Stored---proc không tham s
1.3EXEC Ví d @bien = procedure_name Para1_value, Para2_value, ... ------Stored---proc có
tham s Ví d 1: Viết stored procedure tính tng 2 s:
------
To
CREATE PROCEDURE sp_Tong @So1 int, @So2 int, @Tong int out
AS
SET @Tong = @So1 + @So2;
------Biên dch stored---procedure→F5
------Kim tra
Declare @Sum int
Exec sp_Tong 1, -2, @Sum out
Print @Sum
Ví d 2: Viết stored procedure tính tng các s chn t m đến n:
------To
CREATE PROCEDURE sp_TongChanMN @m int, @n int AS Declare @tong int
Declare @i int
Set @tong = 0
Set
@i = @m
While (@i < @n)
BEGIN
IF (@i % 2 = 0)
SET @tong = @tong +
@i
SET @i = @i + 1
END Print @tong
------Biên dch stored---procedure→F5
------Kim tra
Exec sp_TongChanMN 1, 20
Ví d 3: Viết stored procedure kim tra s tn ti ca giáo viên theo mã:
------To
lOMoARcPSD|41967345
CREATE PROCEDURE sp_KiemTraGVTonTai @MaGV char(9)
AS
IF ( EXISTS (SELECT * FROM GIAOVIEN WHERE MAGV=@MAGV) )
Print N‘Giáo viên tồn ti’
ELSE
Print N‘Không tồn tại giáo viên ! ’ + @MaGV
------Biên dch stored---procedure→F5
------Kim tra
Exec sp_KiemTraGVTonTai ‘001’
Ví d 4: Viết stored procedure xut ra danh sách giáo viên ca mt b môn:
------To
CREATE PROCEDURE sp_DanhSachGiaoVien @MaBM char(9)
AS
SELECT * FROM GIAOVIEN WHERE MABM=@MaBM
------Biên dch stored---procedure→F5
------Kim tra
Exec sp_DanhSachGiaoVien HTTT’
2. Function
2.1 Gii thiu
Trong SQL Server ta có th viết hàm và ly giá tr tr v. Các dng hàm có th viết như
sau :
- Hàm tr v giá tr vô hướng (scalar value) : varchar, int, ....
- Hàm tr v giá tr là bng tm (inline table valued) : table
2.2 Cú pháp
To hàm:
CREATE FUNTION function_name ( [@parameter_name parameter_data_type] )
RETURNS [return Data---type] /*Returns có ‘s’ */
lOMoARcPSD|41967345
AS Begin
return ([scalar value])
End
To hàm tr v bng (table):
CREATE FUNTION function_name ( [@parameter_name parameter_data_type] )
RETURNS table AS return [select
command]
2.3 Ví d
Ví d 5: Viết hàm tính tui da vào ngày sinh
------ To hàm
CREATE FUNTION fTinhTuoi ( @ngaysinh datetime )
RETURNS int AS
BEGIN return year(getdate())
year(@ngaysinh)
END
------ Biên dch: F5
------ Kim
tra
print dbo.fTinhTuoi(‘1/1/2000’)
------
ho
c
SELECT MAGV, dbo. fTinhTuoi (NgaySinh)
FROM GIAOVIEN
Ví d 6: Viết hàm ly danh sách giáo viên b môn HTTT
------ To hàm
CREATE FUNTION fDSGV_HTTT ( )
RETURNS table
AS return (SELECT * FROM GIAO VIEN WHERE MABM=’HTTT’)
lOMoARcPSD|41967345
------ Biên dch: F5
------ Kim tra
SELECT * FROM dbo.fDSGV_HTTT ( )
3. Bài tp ti lp
Yêu cu: Viết các stored procedure sau: a.
In ra câu chào “Hello World !!!”.
b. In ra tng 2 s.
c. Tính tng 2 s (s dng biến output để lưu kết qu tr v).
d. In ra tng 3 s (S dng li stored procedure Tính tng 2 s).
e. In ra tng các s nguyên t m đến n.
f. Kim tra 1 s nguyên có phi là s nguyên t hay không.
g. In ra tng các s nguyên t trong đoạn m, n.
h. Tính ước chung ln nht ca 2 s nguyên.
i. Tính bi chung nh nht ca 2 s nguyên.
Viết các stored procedure sau:
j. Xut ra toàn b danh sách giáo viên.
k. Tính s ợng đề tài mà một giáo viên đang thc hin.
l. In thông tin chi tiết ca mt giáo viên(s dng lnh print): Thông tin
nhân, S
ợng đề tài tham gia, S ng thân nhân của giáo viên đó.
m. Kim tra xem mt giáo viên có tn ti hay không (da vào MAGV).
n. Kiểm tra quy đnh ca mt giáo viên: Ch đưc thc hiện các đ tài mà
b môn
của giáo viên đó làm ch nhim.
o. Thc hin thêm mt phân công cho giáo viên thc hin mt công vic
ca đ tài:
Kiểm tra thông tin đầu vào hp l: giáo viên phi tn ti, công vic phi tn ti,
thi gian tham gia phi >0 Kiểm tra quy định câu n.
p. Thc hin xoá mt giáo viên theo mã. Nếu giáo viên thông tin liên
quan (Có
thân nhân, có làm đ tài, …) thì báo lỗi.
lOMoARcPSD|41967345
q. In ra danh sách giáo viên ca một phòng ban nào đó cùng vi s ng
đề
tài mà giáo viên tham gia, s thân nhân, s giáo viên mà giáo viên đó qun lý nếu có, …
r. Kiểm tra quy định ca 2 giáo viên a, b: Nếu a là trưng b môn c ca b
thì lương
ca a phải cao hơn lương của b. (a, b: mã giáo viên)
s. Thêm mt giáo viên: Kiểm tra các quy định: Không trùng tên, tui > 18,
lương > 0
t. giáo viên được c định t động theo quy tc: Nếu đã giáo viên
001, 002, 003 tMAGV ca giáo viên mi s 004. Nếu đã giáo viên 001, 002,
005 thì MAGV ca giáo viên mi là 003.
| 1/8

Preview text:

lOMoARcPSD| 41967345
STORED PROCEDURE VÀ FUNCTION 1. Stored Procedure (Đọc là Stored
Procedure hoặc Procedure)
1.1 Giới thiệu
Khi chúng ta tạo một ứng dụng với Microsoft SQL Server, ngôn ngữ lập trình
Transact-SQL là ngôn ngữ chính giao tiếp giữa ứng dụng và database của SQL Server. Khi
chúng ta tạo các chương trình bằ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à: -
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ả, -
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 ứng dụng để gọi thực thi các stored procedure và xử lý các kết quả.
Đặc tính của Stored‐procedure trong SQL Server : -
Chấp nhận những tham số vào và trả về những giá trị được chứa trong các
tham số ra để gọi những thủ tục hoặc xử lý theo lô. -
Chứa các lệnh của chương trình để thực hiện các xử lý trong database, bao
gồm cả lệnh gọi các thủ tục khác thực thi. -
Trả về các trạng thái giá trị để gọi những thủ tục hoặc thực hiện các xử lý theo
lô để 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.
Ta có thể dùng Transact–SQL 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à:
‐ Stored procedure cho phép điều chỉnh chương trình cho phù hợp: 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ỳ. Stored procedure có thể được chỉ rõ 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 source code của chương trình.
‐ Stored procedure cho phép thực thi nhanh hơn: nếu sự xử lý yêu cầu một đoạn
source code Transact – 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. 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.
‐ Stored procedure có thể làm giảm bớt vấn đề kẹt đườ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 kẹt mạng. lOMoARcPSD| 41967345
‐ Stored procedure có thể sử dụng trong vấn đề bảo mật của máy: vì người sử
dụng có thể được phân 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. 1.2 Cú pháp
Một Stored procedure được định nghĩa gồm những thành phần chính sau: - Tên của stored procedure - Các tham số -
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 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 Tạo procedure:
CREATE PROCEDURE procedure_name
{@parameter data_type input/output }/*các biến tham số vào ra*/ AS
[khai báo các biến cho xử lý] {Các câu lệnh transact---sql}
RETURN value ------ Stored procedure có thể trả về giá trị hoặc không
Một số lưu ý khi viết stored procedure:
------ 1. Ghi chú 1, một dòng /* 2. Ghi chú 2 Nhiều dòng */ /*3. Khai báo biến*/
DECLARE @parameter_name data_type
/*4. Gán giá trị cho biến*/ SET @parameter_name=value
SELECT @parameter_name=column FROM … lOMoARcPSD| 41967345
/*5. In thông báo ra màn hình*/
print N‘Chuỗi thông báo unicode’ /*6. Thông báo lỗi */
raiserror (N‘Nội dung thông báo lỗi ’, 16, 1) /*7. Lệnh rẽ nhánh */
IF (điều kiện---có thể sử dụng câu truy vấn con và từ khoá EXISTS) BEGIN
{Các lệnh nếu thoả điều kiện / nếu chỉ có 1 lệnh thì không cần BEGIN … END} END
/*8. Lệnh rẽ nhánh có ELSE */
IF (điều kiện---có thể sử dụng câu truy vấn con và từ khoá EXISTS) BEGIN
{Các lệnh nếu thoả điều kiện / nếu chỉ có 1 lệnh thì không cần BEGIN … END} END ELSE BEGIN
{Các lệnh nếu không thoả điều kiện / nếu chỉ có 1 lệnh thì không cần BEGIN … END} END
/*9. Vòng lặp WHILE (Lưu ý: Không có vòng lặp FOR) */
WHILE ( điều kiện ) BEGIN
{Các lệnh nếu thoả điều kiện / nếu chỉ có 1 lệnh thì không cần BEGIN … END} END
Biên dịch: Chọn đúng đoạn mã lệnh Tạo stored-procedure F5 Thực thi procedure:
EXEC procedure_name ------Stored---proc không tham số
EXEC procedure_name Para1_value, Para2_value, ... ------Stored---proc có tham số lOMoARcPSD| 41967345
Lấy giá trị trả về của stored procedure:
EXEC @bien = procedure_name ------Stored---proc không tham số
1.3EXEC Ví dụ @bien = procedure_name Para1_value, Para2_value, ... ------Stored---proc có
tham số Ví dụ 1: Viết stored procedure tính tổng 2 số: ------ Tạo
CREATE PROCEDURE sp_Tong @So1 int, @So2 int, @Tong int out AS SET @Tong = @So1 + @So2;
------Biên dịch stored---procedure→F5 ------Kiểm tra Declare @Sum int
Exec sp_Tong 1, -2, @Sum out Print @Sum
Ví dụ 2: Viết stored procedure tính tổng các số chẳn từ m đến n: ------Tạo
CREATE PROCEDURE sp_TongChanMN @m int, @n int AS Declare @tong int Declare @i int Set @tong = 0 Set @i = @m While (@i < @n) BEGIN IF (@i % 2 = 0) SET @tong = @tong + @i SET @i = @i + 1 END Print @tong
------Biên dịch stored---procedure→F5 ------Kiểm tra
Exec sp_TongChanMN 1, 20
Ví dụ 3: Viết stored procedure kiểm tra sự tồn tại của giáo viên theo mã: ------Tạo lOMoARcPSD| 41967345
CREATE PROCEDURE sp_KiemTraGVTonTai @MaGV char(9) AS
IF ( EXISTS (SELECT * FROM GIAOVIEN WHERE MAGV=@MAGV) )
Print N‘Giáo viên tồn tại’ ELSE
Print N‘Không tồn tại giáo viên ! ’ + @MaGV
------Biên dịch stored---procedure→F5 ------Kiểm tra
Exec sp_KiemTraGVTonTai ‘001’
Ví dụ 4: Viết stored procedure xuất ra danh sách giáo viên của một bộ môn: ------Tạo
CREATE PROCEDURE sp_DanhSachGiaoVien @MaBM char(9) AS
SELECT * FROM GIAOVIEN WHERE MABM=@MaBM
------Biên dịch stored---procedure→F5 ------Kiểm tra
Exec sp_DanhSachGiaoVien ‘HTTT’ 2. Function 2.1 Giới thiệu
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) : varchar, int, ....
- Hàm trả về giá trị là bảng tạm (inline table valued) : table 2.2 Cú pháp Tạo hàm:
CREATE FUNTION function_name ( [@parameter_name parameter_data_type] )
RETURNS [return Data---type] /*Returns có ‘s’ */ lOMoARcPSD| 41967345 AS Begin return ([scalar value]) End
Tạo hàm trả về bảng (table):
CREATE FUNTION function_name ( [@parameter_name parameter_data_type] )
RETURNS table AS return [select command] 2.3 Ví dụ
Ví dụ 5:
Viết hàm tính tuổi dựa vào ngày sinh ------ Tạo hàm
CREATE FUNTION fTinhTuoi ( @ngaysinh datetime ) RETURNS int AS BEGIN return year(getdate()) – year(@ngaysinh) END ------ Biên dịch: F5 ------ Kiểm tra
print dbo.fTinhTuoi(‘1/1/2000’) ------ ho ặc
SELECT MAGV, dbo. fTinhTuoi (NgaySinh) FROM GIAOVIEN
Ví dụ 6: Viết hàm lấy danh sách giáo viên bộ môn HTTT ------ Tạo hàm
CREATE FUNTION fDSGV_HTTT ( ) RETURNS table
AS return (SELECT * FROM GIAO VIEN WHERE MABM=’HTTT’) lOMoARcPSD| 41967345 ------ Biên dịch: F5 ------ Kiểm tra
SELECT * FROM dbo.fDSGV_HTTT ( )
3. Bài tập tại lớp
Yêu cầu: Viết các stored procedure sau: a.
In ra câu chào “Hello World !!!”. b. In ra tổng 2 số. c.
Tính tổng 2 số (sử dụng biến output để lưu kết quả trả về). d.
In ra tổng 3 số (Sử dụng lại stored procedure Tính tổng 2 số). e.
In ra tổng các số nguyên từ m đến n. f.
Kiểm tra 1 số nguyên có phải là số nguyên tố hay không. g.
In ra tổng các số nguyên tố trong đoạn m, n. h.
Tính ước chung lớn nhất của 2 số nguyên. i.
Tính bội chung nhỏ nhất của 2 số nguyên.
Viết các stored procedure sau: j.
Xuất ra toàn bộ danh sách giáo viên. k.
Tính số lượng đề tài mà một giáo viên đang thực hiện. l.
In thông tin chi tiết của một giáo viên(sử dụng lệnh print): Thông tin cá nhân, Số
lượng đề tài tham gia, Số lượng thân nhân của giáo viên đó. m.
Kiểm tra xem một giáo viên có tồn tại hay không (dựa vào MAGV). n.
Kiểm tra quy định của một giáo viên: Chỉ được thực hiện các đề tài mà bộ môn
của giáo viên đó làm chủ nhiệm. o.
Thực hiện thêm một phân công cho giáo viên thực hiện một công việc của đề tài:
 Kiểm tra thông tin đầu vào hợp lệ: giáo viên phải tồn tại, công việc phải tồn tại,
thời gian tham gia phải >0  Kiểm tra quy định ở câu n. p.
Thực hiện xoá một giáo viên theo mã. Nếu giáo viên có thông tin liên quan (Có
thân nhân, có làm đề tài, …) thì báo lỗi. lOMoARcPSD| 41967345 q.
In ra danh sách giáo viên của một phòng ban nào đó cùng với số lượng đề
tài mà giáo viên tham gia, số thân nhân, số giáo viên mà giáo viên đó quản lý nếu có, … r.
Kiểm tra quy định của 2 giáo viên a, b: Nếu a là trưởng bộ môn c của b thì lương
của a phải cao hơn lương của b. (a, b: mã giáo viên) s.
Thêm một giáo viên: Kiểm tra các quy định: Không trùng tên, tuổi > 18, lương > 0 t.
Mã giáo viên được xác định tự động theo quy tắc: Nếu đã có giáo viên
001, 002, 003 thì MAGV của giáo viên mới sẽ là 004. Nếu đã có giáo viên 001, 002,
005 thì MAGV của giáo viên mới là 003.