Hàm do người dùng định nghĩa (User Defined Function UDF)

Một phần của tài liệu giao_trinh_sql_server_2005__nhieu_tac_gia (Trang 72 - 77)

5 Thủ tục lưu trữ, hàm và trigger

5.2 Hàm do người dùng định nghĩa (User Defined Function UDF)

Hàm do người dùng định nghĩa được chia làm 3 loại: (1) scalar (hàm vô hướng), (2) inline table-valued (hàm nội tuyến, giá trị trả về dạng bảng), (3) multi-statement table-valued (hàm bao gồm nhiều câu lệnh SQL bên trong, trả về giá trị dạng bảng)

Scalar UDF: được sử dụng để trả về một duy nhất một giá trị dựa trên một các tham số truyền vào. Ví dụ: ta có thể tạo ra một UDF vô h ướng nhận Customerid là tham số và trả về CustomerName.

Inline table-valued: trả về một bảng dựa trên một câu lệnh SQL duy nhất định nghĩa các dòng và các cột trả về.

Multi-statement table-value: cũng trả về kết quả là một tập hợp nhưng có thể dựa trên nhiều câu lệnh SQL.

5.2.1 Hàm vô hướng - Scalar UDF

Scarlar UDF đượctạo ra bằng câu lệnh CREATE FUNCTION có cấu trúc nh ư sau;

CREATE FUNCTION tên_hàm

([danh_sách_tham_số]) RETURNS (kiểu_trả_về_của_hàm) AS BEGIN

các_câu_lệnh_của_hàm END

Ví dụ:

Câu lệnh dưới đây định nghĩa hàm tính ngày trong tuần (thứ trong tuần) của một giá trị kiểu ngày

create function f_ thu(@ngay datetime) returns nvarchar(10)

as begin

declare @st nvarchar(10)

select @st=case datepart(dw,@ngay) when 1 then N'chủ nhật'

when 2 then N'thứ hai' when 3 then N 'thứ ba' when 4 then N 'thứ tư' when 5 then N 'thứ năm' when 6 then N 'thứ sáu' else N 'thứ bảy'

end

return (@st) /* trị trả về của hàm */ end

Sau khi chạy thành công, hàm trở thành một đối tượng trong CSDL và có thể được truy xuất như các hàm được xây dựng sẵn trong SQL Server 2005 Express Edition.

Ví dụ:

select CUSTOMERNAME, dbo.f_thu(BIRTHDAY) from customers

5.2.2 Hàm nội tuyến - Inline UDF

Hàm nội tuyến được định nghĩa bằng lệnh CREATE FUNCTION.

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:

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. Ngồ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ụ: Ví dụ dưới đây lấy ra các khách hàng tùy thuộc vào giá trị mã khách hàng truyền vào cho tham số.

create function f_SelectCustomer (@customerid int)

returns table as

return (select * from customers

where customerid > @customerid)

Việc gọi các hàm nội tuyến cũng tương tự như việc gọi các hàm vơ hướng. Ví dụ:

select tmp.CUSTOMERNAME, o.ORDERDATE

from orders o inner join dbo.f_SelectCustomer(3) as tmp on o.customerid = tmp.customerid

5.2.3 Hàm bao gồm nhiều câu lệnh bên trong – Multi statement UDF

Hàm này cũng được định nghĩa bằng lệnh CREATE FUNCTION

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

Lưu ý: sau từ khóa RETURNS là một biến bảng được định nghĩa. Và sau từ khóa RETURN ở cuối hàm khơng có tham số nào đi kèm.

Ví dụ:

create function f_SelectCustomer (@customerid int) returns @myCustomers table

(

customername nvarchar(50), orderdate datetime ) as begin if @customerid = 0

insert into @myCustomers

select c.customerid, c.customername, o.orderdate

from customers c inner join orders o on o.customerid = c.customerid else

insert into @myCustomers

select c.customerid, c.customername, o.orderdate

from customers c inner join orders o on c.customerid = o.customerid where c.customerid = @customerid

return end

Việc gọi hàm multi statement UDF cũng tương tự các loại hàm khác

select * from f_SelectCustome r(0)

select * from f_SelectCustomer(3)

5.2.4 Thay đổi hàm

Dùng lệnh ALTER FUNCTION để thay đổi định nghĩa hàm. Cấu trúc của câu lệnh ALTER FUNCTION tương t ự như CREATE FUNCTION

Ví dụ:

alter function f_SelectCustomer (@customerid int)

returns table as

where customerid > @customerid)

5.2.5 Xóa hàm

Dùng lệnh DROP FUNCTION để xóa hàm. Cấutrúc lệnh DROP FUNCTION nh ư sau

DROP FUNCTION tên_hàm Ví dụ:

drop function f_thu

Tương tự như thủ tục lưu trữ, khi hàm bị xóa các quyền cấp cho ng ười dùng trên hàm đó cũng bị xóa. Do đó khi định nghĩa lại hàm này, ta phải cấp lại quyền cho các ng ười dùng.

5.3 Trigger

Trigger là một dạng đặc biệt của thủ tục l ưu trữ, được thực thi một cách tự động khi có sự thay đổi dữ liệu (do tác động của câu lệnh INSERT, UPDATE, DELETE) trên một bảng nào đó.

Một phần của tài liệu giao_trinh_sql_server_2005__nhieu_tac_gia (Trang 72 - 77)

Tải bản đầy đủ (PDF)

(101 trang)