Hàm với giỏ trị trả về là “dữ liệu kiểu bảng”

Một phần của tài liệu giao trinh SQL (Trang 116 - 120)

Ta đó biết được chức năng cũng như sự tiện lợi của việc sử dụng cỏc khung nhỡn trong cơ sở dữ liệu. Tuy nhiờn, nếu cần phải sử dụng cỏc tham số trong khung nhỡn (chẳng hạn cỏc tham số trong mệnh đề WHERE của cõu lệnh SELECT) thỡ ta lại khụng

thể thực hiện được. Điều này phần nào đú làm giảm tớnh linh hoạt trong việc sử dụng khung nhỡn.

Vớ dụ 5.9: Xột khung nhỡn được định nghĩa như sau:

CREATE VIEW sinhvien_k25 AS

SELECT masv,hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop

ON sinhvien.malop=lop.malop WHERE khoa=25

với khung nhỡn trờn, thụng qua cõu lệnh:

SELECT * FROM sinhvien_K25

ta cú thể biết được danh sỏch cỏc sinh viờn khoỏ 25 một cỏch dễ dàng nhưng rừ ràng khụng thể thụng qua khung nhỡn này để biết được danh sỏch sinh viờn cỏc khoỏ khỏc do khụng thể sử dụng điều kiện cú dạng KHOA = @thamso trong mệnh đề WHERE của cõu lệnh SELECT được.

Nhược điểm trờn của khung nhỡn cú thể khắc phục bằng cỏch sử dụng hàm với giỏ trị trả về dưới dạng bảng và được gọi là hàm nội tuyến (inline function). Việc sử dụng hàm loại này cung cấp khả năng như khung nhỡn nhưng cho phộp chỳng ta sử dụng được cỏc tham số và nhờ đú tớnh linh hoạt sẽ cao hơn.

Một hàm nội tuyến được định nghĩa bởi cõu lệnh CREATE TABLE với cỳ phỏp như sau:

CREATE FUNCTION tờn_hàm ([danh_sỏch_tham_số]) RETURNS TABLE

AS

RETURN (cõu_lệnh_select)

Cỳ phỏp của hàm nội tuyến phải tuõn theo cỏc qui tắc sau:

• Kiểu trả về của hàm phải được chỉ định bởi mệnh đề RETURNS TABLE.

• Trong phần thõn của hàm chỉ cú duy nhất một cõu lệnh RETURN xỏc định giỏ trị trả về của hàm thụng qua duy nhất một cõu lệnh SELECT. Ngoài ra, khụng sử dụng bất kỳ cõu lệnh nào khỏc trong phần thõn của hàm.

Vớ dụ 5.10: Ta định nghĩa hàm func_XemSV như sau:

RETURNS TABLE AS

RETURN(SELECT masv,hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop

WHERE khoa=@khoa)

hàm trờn nhận tham số đầu vào là khúa của sinh viờn cần xem và giỏ trị trả về của hàm là tập cỏc dũng dữ liệu cho biết thụng tin về cỏc sinh viờn của khoỏ đú. Cỏc hàm trả về giỏ trị dưới dạng bảng được sử dụng như là cỏc bảng hay khung nhỡn trong cỏc cõu lệnh SQL.

Với hàm được định nghĩa như trờn, để biết danh sỏch cỏc sinh viờn khoỏ 25, ta sử dụng cõu lệnh như sau:

SELECT * FROM dbo.func_XemSV(25)

cũn cõu lệnh dưới đõy cho ta biết được danh sỏch sinh viờn khoỏ 26

SELECT * FROM dbo.func_XemSV(26)

Đối với hàm nội tuyến, phần thõn của hàm chỉ cho phộp sự xuất hiện duy nhất của cõu lệnh RETURN. Trong trường hợp cần phải sử dụng đến nhiều cõu lệnh trong phần thõn của hàm, ta sử dụng cỳ phỏp như sau để định nghĩa hàm:

CREATE FUNCTION tờn_hàm([danh_sỏch_tham_số]) RETURNS @biến_bảng TABLE định_nghĩa_bảng

AS

BEGIN

cỏc_cõu_lệnh_trong_thõn_hàm

RETURN END

Khi định nghĩa hàm dạng này cần lưu ý một số điểm sau:

• Cấu trỳc của bảng trả về bởi hàm được xỏc định dựa vào định nghĩa của bảng trong mệnh đề RETURNS. Biến @biến_bảng trong mệnh đề RETURNS cú phạm vi sử dụng trong hàm và được sử dụng như là một tờn bảng.

• Cõu lệnh RETURN trong thõn hàm khụng chỉ định giỏ trị trả về. Giỏ trị trả về của hàm chớnh là cỏc dũng dữ liệu trong bảng cú tờn là @biếnbảng được định nghĩa trong mệnh đề RETURNS

Cũng tương tự như hàm nội tuyến, dạng hàm này cũng được sử dụng trong cỏc cõu lệnh SQL với vai trũ như bảng hay khung nhỡn. Vớ dụ dưới đõy minh hoạ cỏch sử dụng dạng hàm này trong SQL.

Vớ dụ 5.11: Ta định nghĩa hàm func_TongSV như sau:

CREATE FUNCTION Func_Tongsv(@khoa SMALLINT) RETURNS @bangthongke TABLE

( makhoa NVARCHAR(5), tenkhoa NVARCHAR(50), tongsosv INT ) AS BEGIN IF @khoa=0

INSERT INTO @bangthongke

SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN lop

ON khoa.makhoa=lop.makhoa) INNER JOIN sinhvien

on lop.malop=sinhvien.malop GROUP BY khoa.makhoa,tenkhoa

ELSE

INSERT INTO @bangthongke

SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN lop

ON khoa.makhoa=lop.makhoa) INNER JOIN sinhvien

ON lop.malop=sinhvien.malop WHERE khoa=@khoa

GROUP BY khoa.makhoa,tenkhoa RETURN /*Trả kết quả về cho hàm*/ END

Với hàm được định nghĩa như trờn, cõu lệnh:

SELECT * FROM dbo.func_TongSV(25)

Cũn cõu lệnh:

SELECT * FROM dbo.func_TongSV(0)

Cho ta biết tổng số sinh viờn hiện cú (tất cả cỏc khoỏ) của mỗi khoa:

Một phần của tài liệu giao trinh SQL (Trang 116 - 120)