Tải bản đầy đủ (.ppt) (23 trang)

Bài giảng Client/Server - Chương 9: Hàm người dùng định nghĩa ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (232.61 KB, 23 trang )

1
Bài 9: Hàm người dùng định nghĩa
-
Hàm trả về giá trị đơn - Scalar Functions
-
Hàm UDF trả về bảng:

Inline Table-valued Functions

Multistatement Table-valued Functions
2
Hàm trả về giá trị đơn - Scalar Functions
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ][ type_schema_name. ]
parameter_data_type
[ = default ] } [ , n ] ])
RETURNS return_data_type
[ WITH <function_option> [ , n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END [ ; ]
3
Hàm trả về giá trị vô hướng
CREATE TABLE [dbo].[tmpHoaDon]( [Ngay_hd] [datetime] NULL,
[KhachHang] [nvarchar](50) NULL, [Ma_hd] [nvarchar](50) NULL,
[GhiChu] [nvarchar](100) NULL ) ON [PRIMARY]
- Ta thấy dữ liệu trong Ngay_HD gồm có cả ngày tháng năm và giờ phút giây
Select Ngay_hd, KhachHang from tmpHoaDon where Ngay_HD=getDate() order by
Ngay_HD


-Sẽ không được bản ghi nào vì có so sánh cả giớ phút giây
Xuất phát từ lý do này ta tạo thủ tục ngày tháng năm
Use KhoHang CAST and CONVERT trong BOL

Create Function dbo.GetDay (@Date datetime)

Returns varchar(12)

As

Begin

Return convert(varchar(12),@date,105)

End
- Lệnh sau đây sẽ cho các hóa đơn trong ngày hiện thời:
Select Ngay_hd, KhachHang from tmpHoaDon where
dbo.GetDay(Ngay_HD)=dbo.GetDay(getDate()) order by Ngay_HD
4
Đệ qui (tính số fibonaci)
Create function dbo.fibonaci(@n int)
returns int as
Begin
if @n>1
return dbo.fibonaci(@n-1) +dbo.fibonaci(@n-2)
return 1
End
declare @i int
set @i=dbo.fibonaci(5)
print @i

5
Hàm UDF trả về bảng
Inline Table-valued Functions
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ]
parameter_data_type
[ = default ] }
[ , n ] ])
RETURNS TABLE
[ WITH <function_option> [ , n ] ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ][ ; ]
6
Hàm UDF trả về bảng (2)
Use khohang
Create Function dbo.danhSachHoaDon(@currentDay as Datetime)
Returns table
As return
(select * from tmpHoaDon where
dbo.getDay(ngay_hd)=dbo.getDay(@currentDay))
Sử dụng:
declare @d datetime
set @d=getdate()
select * from dbo.danhSachHoadon(@d)
Như vậy ta thấy có thể sử dụng hàm giống như view, tuy nhiên ta có
thể sử dụng các tham số của hàm để cho view linh họat hơn.
7
Hàm trả về bảng
Multistatement Table-valued Functions
CREATE FUNCTION [ schema_name. ] function_name

( [ { @parameter_name [ AS ] [ type_schema_name. ]
parameter_data_type
[ = default ] }
[ , n ] ])
RETURNS @return_variable TABLE < table_type_definition >
[ WITH <function_option> [ , n ] ]
[ AS ]
BEGIN
function_body
RETURN
END [ ; ]
8
Function Options
<function_option>::=
{ [ ENCRYPTION ]
| [ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL
INPUT ]
| [ EXECUTE_AS_Clause ] }
SCHEMABINDING – chỉ định rằng hàm có tham chiếu đến các đối
tượng được gọi trong thân hàm (ví dụ các bảng). Khi đó chúng ta
không thể xóa các đối tượng này nếu như bảng đang tồn tại.
EXECUTE_AS_Clause – Sử dụng giống như trong thủ tục.
(Tự thực hành hàm với các tham số EXECUTE_AS Caller,…)
9
Ví dụ
Use test
CREATE TABLE dbo.employees (empid nchar(5) PRIMARY KEY,
empname nvarchar(50), mgrid nchar(5) NULL REFERENCES
employees(empid), title nvarchar(30) )

Viết hàm fn_FindReports xác định (hiển thị) tất cả các nhân viên thuộc
quyền quản lý của @InputEmpID
CREATE FUNCTION dbo.fn_FindReports
( @InputEmpId nchar(5) )
RETURNS @retFindReports TABLE
(empid nchar(5) primary key, empname nvarchar(50) NOT NULL,
mgrid nchar(5), title nvarchar(30))
10
Xác định đường dẫn đầy đủ của thư mục
create table Directory (ID int identity, FolderName varchar(128),
Parent_ID int)
CREATE FUNCTION dbo.Path (@ID int)
RETURNS varchar(1000) AS
BEGIN
if @ID is null return ''
declare @s varchar(1000), @Parent_ID int
select @s=FolderName, @Parent_ID=Parent_ID
from Directory where ID=@ID
return dbo.Path(@Parent_ID)+@s+'/'
END
declare @st varchar(40)
set @st= dbo.Path(4) print @st
11
Xác định đường dẫn đầy đủ của thư mục (2)
CREATE FUNCTION dbo.Path_while (@ID int)
RETURNS varchar(8000) AS
BEGIN
declare @s varchar(8000), @Parent_ID int
select @s=FolderName, @Parent_ID=Parent_ID from Directory where
ID=@ID

while @Parent_ID is not null begin
select @s=FolderName+'/'+@s, @Parent_ID=Parent_ID from Directory
where ID=@Parent_ID
end
return @s
END
declare @st varchar(20)
set @st=dbo.path_while(4)
print @st
12
Bài tập
- Sua bang Directory: them truong Path
-
Them Trigger (For Insert, Update): Tự động cap nhat du lieu cho
truong Path
-
Giả sử có bảng: Department(Dep_ID, Dep_name, Sup_ID)
-
Viết hàm xác định danh sách các phòng ban thuộc quyền quản lý
của Input_DepID
-
Xác định các phòng ban cấp trên của Input_DepID
13
Tạo hàm đảo ngược chuỗi
Alter Function dbo.fn_DaonguocHoDemTen(@InputSt nvarchar(255))
returns nvarchar(255) as
Begin declare @Ho nvarchar(30), @Temp nvarchar(255), @vt int
set @InputSt=Rtrim(Ltrim(@InputSt))
set @vt = charindex(' ',@InputSt); set @Ho = '‘
Cat lay phan Ho

if @vt>0 set @Ho =Left(@InputSt, @vt-1)
set @InputSt = LTrim(Right(@InputSt, Len(@InputSt) - @vt))
set @vt = charindex(' ',@InputSt)
Vi tri cua dau cach cuoi cung
declare @vtcuoi int, @Dem nvarchar(30);
set @vtcuoi=0; set @Dem=''
While @vt <> 0
Begin set @vtcuoi=@vt;
set @Dem =@Dem +' '+ Left(@InputSt, @vt-1)
set @InputSt = LTrim(Right(@InputSt, Len(@InputSt) - @vt))
set @vt = charindex(' ',@InputSt)
End
return @InputSt + ' ' + Rtrim(LTrim(@Dem))+' '+ Rtrim(LTrim(@Ho))
End
go
select dbo.fn_DaonguocHoDemTen('Tran Nguyen Vu Hoa')
14
Mã unicode của các ký tự tiếng Việt
use test
go
drop table dbo.BangMaUnicode
go
CREATE TABLE [dbo].BangMaUnicode (
[ID] [int] NULL ,Kitu [nvarchar] (50) COLLATE
SQL_Latin1_General_CP1_CI_AS ,
MaHoa [varchar] (50) COLLATE
SQL_Latin1_General_CP1_CI_AS
) ON [PRIMARY]
GO
15

Mã unicode của các ký tự tiếng Việt (2)
declare @InputSt nvarchar(255)
set @InputSt
=N'AaÀàẢảÃãÁáẠạĂăẰằẲẳẴẵẮắẶặÂâẦầẨẩẪẫẤấẬậBbCcDdĐđEeÈèẺẻẼẽÉéẸẹÊêỀềỂể
ỄễẾ'
set @InputSt=
@InputSt+N'ếỆệFfGgHhIiÌìỈỉĨĩÍíỊịJjKkLlMmNnOoÒòỎỏÕõÓóỌọÔôỒồỔổỖỗỐốỘộƠơỜờ
ỞởỠỡỚớỢợPp'
set
@InputSt=@InputSt+N'QqRrSsTtUuÙùỦủŨũÚúỤụƯưỪừỬửỮữỨứỰựVvWwXxYyỲỳỶỷ
ỸỹÝýỴỵZz'
declare @i int,@dodai int
set @dodai=len(@InputSt)
set @i=1
declare @c nvarchar(1)
while (@i<=@dodai)
begin
set @c=substring(@InputSt,@i,1)
insert into BangMaUnicode(id,Kitu) values(unicode(@c),@c)
Set @i=@i+1
end
select * from BangMaUnicode order by Kitu
16
Tạo hàm sắp xếp tiếng Việt
- Kiểm tra với collation Vietnamese_CS_AI
USE [Test] GO
CREATE TABLE [dbo].[TestCollation](ID int,
[Kitu] [nvarchar](1) COLLATE Vietnamese_CS_AI NULL ) ON [PRIMARY]
declare @InputSt nvarchar(255)
set @InputSt =N'AaÀàẢảÃãÁáẠạĂăẰằẲẳẴẵẮắẶặÂâẦầẨẩẪẫẤấẬậBbCcDdĐđEeÈèẺẻẼẽÉéẸẹÊêỀềỂểỄễẾ'

set @InputSt= @InputSt+N'ếỆệFfGgHhIiÌìỈỉĨĩÍíỊịJjKkLlMmNnOoÒòỎỏÕõÓóỌọÔôỒồỔổỖỗỐốỘộƠơỜờỞởỠỡỚớỢợPp'
set @InputSt=@InputSt+N'QqRrSsTtUuÙùỦủŨũÚúỤụƯưỪừỬửỮữỨứỰựVvWwXxYyỲỳỶỷỸỹÝýỴỵZz'
declare @i int,@dodai int
set @dodai=len(@InputSt)
set @i=1
declare @c nvarchar(1)
while (@i<=@dodai)
begin
set @c=substring(@InputSt,@i,1)
insert into [TestCollation](id,Kitu) values(unicode(@c),@c)
Set @i=@i+1
end
select * from [TestCollation] order by Kitu COLLATE Vietnamese_CS_AI
- Viết hàm sắp xếp theo qui tắc tiếng Việt (Lecture5-SapXepXauKituTiengViet.sql)
17
Hiển thị danh sách tên các sản phẩm
Cho biết một tập hợp các ProductID: '9 12 27 37'
Cần viết một hàm để hiển thị tên của tất cả các sản phẩm này trong
bảng AdventureWorks.Production.Product
VD:
Use AdventureWorks
Get_product_names_iter '9 12 27 37'
18
Hiển thị danh sách tên các sản phẩm (3)
Create PROCEDURE Get_product_names_iter
@ids varchar(50) AS
Chọn các sản phẩm trong
SELECT P.Name, P.ProductID
FROM AdventureWorks.Production.Product P
JOIN int_list_to_table(@ids) i

ON P.ProductID = i.number
go
select * from int_list_to_table ('1 3 327 337' )

exec Get_product_names_iter '1 3 327 337'
19
Đầu vào là một xâu gồm các ID sản phẩm cách nhau bởi một dấu cách, giả thiết xâu
này có kích thước rât lớn
CREATE FUNCTION iter_intlist_to_table (@list ntext)
RETURNS @tbl TABLE (listpos int IDENTITY(1, 1), number int NOT NULL)
AS BEGIN
Ý tưởng: lấy ra từng đoạn có độ dài khoảng 4000 kí tự
SET @textpos = 1;
WHILE @textpos <= datalength(@list) / 2
SET @chunklen = 4000 – 10 – Giả sử 10 là độ dài lớn nhất của một ID
SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @chunklen))
SET @textpos = @textpos + @chunklen
SET @pos = charindex(' ', @tmpstr)
WHILE @pos > 0
BEGIN
Lấy ra từng ID trong vòng lặp này
END
END
END
- Xem mã lệnh trong Lecture5-DanhSach.sql
Hiển thị danh sách tên các sản phẩm (2)
20
Bài tập 1
Cho một xâu kí tự là một tập hợp các phần tử viết cách nhau bởi một
dấu ‘.’

Mỗi phần tử gồm có bảy thành phần, các thành phần viết cách nhau
một dấu ‘;’
Ví dụ:Mã Hóa Đơn, Người Nhập, Ghi Chú, Mã Sản Phẩm; Tên Sản
Phẩm; Số lượng; Đơn giá.
-
Viết thủ tục hoặc hàm phân tích xâu kí tự trên và lấy ra các hóa đơn
sau đó Insert vào bảng NhapHangHoa (MaHD, NguoiNhap,
GhiChu, MaSP, TenSP, Soluong,DonGia)
21
Bài tập 2
-
Cho một file dữ liệu Input.txt gồm các xâu kí tự như trong bài tập 1
-
Giả sử có hai bảng: DMSanPham(MaSP, TenSP) và bảng
NhapHangHoa (MaHD, NguoiNhap, GhiChu, MaSP, Soluong,
DonGia)
-
Hãy viết thủ tục hoặc hàm phân tích từng xâu kí tự trong file:
-
Nếu MaSP chưa có trong DMSanPham(MaSP, TenSP) thì ta
chèn MaSP và TenSP vào bảng này.
-
Chèn các giá trị MaHD, NguoiNhap, GhiChu, MaSP, SoLuong,
DonGia lấy được từ xâu vào bảng NhapHangHoa.
22
Bài tập 3
-
Cho một file dữ liệu Input.txt như trong bài tập 3
-
Giả sử có ba bảng: DMSanPham(MaSP, TenSP), bảng

NhapHangHoa (MaHD, NguoiNhap, GhiChu) và bảng
NhapHangHoaChiTiet (MaHD, MaSP, Soluong,DonGia)
-
Hãy viết thủ tục hoặc hàm phân tích từng xâu kí tự trong file:
-
Nếu MaSP chưa có trong DMSanPham(MaSP, TenSP) thì ta
chèn MaSP và TenSP vào bảng này.
-
Nếu MaHD chưa có trong bảng NhapHangHoa thì chèn giá trị
MaHD, NguoiNhap, GhiChu vào bảng này
-
Chèn các giá trị MaHD,MaSP,SoLuong,DonGia vào bảng
NhapHangHoaChiTiet
23
Giới thiệu ứng dụng App1

Ứng dụng App1 là một minh họa về mô hình ứng dụng nhiều lớp.

Các xử lý phức tạp của ứng dụng được viết dưới dạng các hàm hoặc
thủ tục trên SQL Server.

Minh họa cách triệu gọi các hàm, thủ tục của SQL Server từ phía
ứng dụng.

×