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

Bài giảng điện tử môn tin học: Procedures và Funtions doc

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 (317.04 KB, 23 trang )

1
PROCEDURES và
FUNCTIONS
11
11
2
1. Khái niệm cơ bản về Stored procedure:
1. Khái niệm cơ bản về Stored procedure:

Stored procedure (thủ tục) là một tập các lệnh
Stored procedure (thủ tục) là một tập các lệnh
T-SQL và một số cấu trúc điều kiện
T-SQL và một số cấu trúc điều kiện

Một khi Stored procedure được thiết lập thì
Một khi Stored procedure được thiết lập thì
những ứng dụng cần thiết tương tự chỉ cần
những ứng dụng cần thiết tương tự chỉ cần
thực gọi để thực hiện Store procedure
thực gọi để thực hiện Store procedure

Thủ tục lưu được tối ưu hoá lần đầu tiên khi
Thủ tục lưu được tối ưu hoá lần đầu tiên khi
chúng được biên dịch.
chúng được biên dịch.

Thủ tục nâng cao an toàn thông tin thông qua
Thủ tục nâng cao an toàn thông tin thông qua
việc cô lập hoặc mã hóa
việc cô lập hoặc mã hóa
3



System sp:
System sp:
Được lưu trữ trong CSDL master và
Được lưu trữ trong CSDL master và
được đặt tên với tiếp đầu ngữ là sp. Chúng đóng vai
được đặt tên với tiếp đầu ngữ là sp. Chúng đóng vai
trò khác nhau của các tác vụ được cung cấp trong
trò khác nhau của các tác vụ được cung cấp trong
SQL Server.
SQL Server.
Ví dụ:
Ví dụ:
Sp_help
Sp_help
,
,
Sp_helpConstraint,…
Sp_helpConstraint,…

Local sp:
Local sp:
Được lưu trữ trong các CSDL của người
Được lưu trữ trong các CSDL của người
dùng, nó thực thi các tác vụ (Task) trong Database
dùng, nó thực thi các tác vụ (Task) trong Database
chứa nó.
chứa nó.

Khi thực thi thủ tục, cần cung cấp các giá trị của

Khi thực thi thủ tục, cần cung cấp các giá trị của
tham số của các thủ tục nếu có. Một thủ tục có thể
tham số của các thủ tục nếu có. Một thủ tục có thể
được gọi thực thi hoặc tự động thực thi khi SQL
được gọi thực thi hoặc tự động thực thi khi SQL
Server khởi động. Gọi thực thi bằng từ khóa
Server khởi động. Gọi thực thi bằng từ khóa
EXCUTE
EXCUTE
.
.
4
2. Tạo Store Procedure:
2. Tạo Store Procedure:
CREATE PROC
CREATE PROC
[
[
EDURE
EDURE
] procedure_name
] procedure_name


[
[
{ @parameter data_type }
{ @parameter data_type }



[
[
VARYING
VARYING
] [ = default ] [
] [ = default ] [
OUTPUT
OUTPUT
]
]
]
]


[ , n ]
[ , n ]
[
[


WITH
WITH
{
{
RECOMPILE
RECOMPILE
|
|
ENCRYPTION
ENCRYPTION

}
}
]
]




[
[
FOR REPLICATION
FOR REPLICATION
]
]
AS
AS
sql_statement [ n ]
sql_statement [ n ]
5
Procedure_name
Procedure_name


Tên phải tuân theo qui tắc định danh
Tên phải tuân theo qui tắc định danh
RECOMPILE
RECOMPILE
Thông thường, thủ tục sẽ được phân
Thông thường, thủ tục sẽ được phân
tích, tối ưu và dịch sẵn ở lần gọi đầu

tích, tối ưu và dịch sẵn ở lần gọi đầu
tiên. Nếu tuỳ chọn
tiên. Nếu tuỳ chọn
With Recompile
With Recompile


được chỉ định, thủ tục sẽ được dịch lại
được chỉ định, thủ tục sẽ được dịch lại
mỗi khi được gọi.
mỗi khi được gọi.
ENCRYPTION
ENCRYPTION
Thủ tục sẽ được mã hoá nếu tuỳ chọn
Thủ tục sẽ được mã hoá nếu tuỳ chọn
With Encryption
With Encryption
được chỉ định. Nếu
được chỉ định. Nếu
thủ tục đã được mã hoá, ta không thể
thủ tục đã được mã hoá, ta không thể
xem được nội dung của thủ tục, do đó
xem được nội dung của thủ tục, do đó
nên lưu lại bản gốc
nên lưu lại bản gốc
VARYING
VARYING
Chỉ dùng với biến
Chỉ dùng với biến
Cursor

Cursor
6
VD
VD
:
:
Create Procedure
Create Procedure
sp_SinhVien
sp_SinhVien
@NamSinh
@NamSinh
int
int
AS
AS
Select
Select
*
*
From
From
tbl_SinhVien
tbl_SinhVien
Where
Where
Year
Year
(NgaySinh) = @NamSinh
(NgaySinh) = @NamSinh



3. Thực thi Store Procedure:
3. Thực thi Store Procedure:
EXEC
EXEC
[
[
ute
ute
]
]


procedure_name
procedure_name
[[@parameter =]{value |@variable [
[[@parameter =]{value |@variable [
OUTPUT
OUTPUT
] |
] |
[
[
DEFAULT
DEFAULT
]]
]]
[,…n]
[,…n]

VD
VD
:
:


EXEC
EXEC
sp_SinhVien 1984
sp_SinhVien 1984
7
Create Proc
Create Proc
Sp_ChenKhachHang
Sp_ChenKhachHang
@MaKH varchar (10), @TenKH nvarchar (50),
@MaKH varchar (10), @TenKH nvarchar (50),
@Address nvarchar (50), @Phone varchar (24),
@Address nvarchar (50), @Phone varchar (24),
@Fax nvarchar (24), @mail nvarchar (50)
@Fax nvarchar (24), @mail nvarchar (50)
AS
AS
Insert Into
Insert Into
KhachHang (MaKH, TenKH, Address,
KhachHang (MaKH, TenKH, Address,
Phone, Fax, eMail)
Phone, Fax, eMail)
Values

Values
(@MaKH, @TenKH, @Address, @Phone,
(@MaKH, @TenKH, @Address, @Phone,
@Fax, @Mail)
@Fax, @Mail)
Gọi thủ tục:
Gọi thủ tục:
Sp_ChenKhachHang
Sp_ChenKhachHang


'KH01', N'Trường Tin học ABC',
'KH01', N'Trường Tin học ABC',
'12 Nguyễn Văn Bảo', '886699', '791175',
'12 Nguyễn Văn Bảo', '886699', '791175',
'@yahoo.com'
'@yahoo.com'
8
a. Store Procedure and
a. Store Procedure and
Input
Input
Parameters:
Parameters:
Create Procedure
Create Procedure
sp_NhanVien
sp_NhanVien
@Ho
@Ho

nvarchar
nvarchar
(50),
(50),
@Ten
@Ten
nvarchar
nvarchar
(10)
(10)
As
As
Select
Select
*
*
From
From
NhanVien
NhanVien
Where
Where
Ho = @Ho
Ho = @Ho
And
And
Ten = @Ten
Ten = @Ten
Câu 2.10. trong Bài tập - Bài7
Câu 2.10. trong Bài tập - Bài7

Create Procedure
Create Procedure
sp_ThongTinHoaDonSo
sp_ThongTinHoaDonSo
@So_HoaDon
@So_HoaDon
int
int
As
As
Select
Select
d.MaNhanVien, d.NgayGiaoHang, d.NoiGiaoHang
d.MaNhanVien, d.NgayGiaoHang, d.NoiGiaoHang
From
From
Dondathang
Dondathang
as
as
d
d
INNER JOIN
INNER JOIN
NhanVien
NhanVien
as
as
n
n



ON
ON
d.MaNhanVien = n.MaNhanVien
d.MaNhanVien = n.MaNhanVien
Where
Where
SoHoaDon = @So_HoaDon
SoHoaDon = @So_HoaDon
9
a. Store Procedure and
a. Store Procedure and
Default
Default
Parameters:
Parameters:
Create Procedure
Create Procedure
sp_NhanVien
sp_NhanVien
@Ho
@Ho
nvarchar
nvarchar
(50) ,
(50) ,
@Ten
@Ten
nvarchar

nvarchar
(10) = '%'
(10) = '%'
As
As
Select
Select
*
*
From
From
NhanVien
NhanVien
Where
Where
Ho Like @Ho
Ho Like @Ho
And
And
Ten Like @Ten
Ten Like @Ten
Câu 2.10. trong Bài tập - Bài7
Câu 2.10. trong Bài tập - Bài7
Create Procedure
Create Procedure
sp_ThongTinHoaDonSo
sp_ThongTinHoaDonSo
@So_HoaDon
@So_HoaDon
int =

int =
1
1
As
As
Select
Select
d.MaNhanVien, d.NgayGiaoHang, d.NoiGiaoHang
d.MaNhanVien, d.NgayGiaoHang, d.NoiGiaoHang
From
From
Dondathang
Dondathang
as
as
d
d
INNER JOIN
INNER JOIN
NhanVien
NhanVien
as
as
n
n


ON
ON
d.MaNhanVien = n.MaNhanVien

d.MaNhanVien = n.MaNhanVien
Where
Where
SoHoaDon = @So_HoaDon
SoHoaDon = @So_HoaDon
10
a.
a.
Store Procedure and
Store Procedure and
Output
Output
Parameters:
Parameters:
Create Procedure
Create Procedure
sp_GiaBan
sp_GiaBan
@MaHang
@MaHang
int
int
, @GiaBan
, @GiaBan
money
money


OUTPUT
OUTPUT

AS
AS
Select
Select
@GiaBan = Giaban
@GiaBan = Giaban
From
From
MatHang
MatHang
Where
Where
MaHang = @MaHang
MaHang = @MaHang
Gọi thủ tục:
Gọi thủ tục:
Declare
Declare
@price
@price
money
money
Execute
Execute


sp_GiaBan
sp_GiaBan
77, @price
77, @price

Output
Output
Print
Print


Convert
Convert
(
(
varchar
varchar
(10), @price)
(10), @price)
11
Ví dụ
Ví dụ
: Giả sử ta cần thực hiện một chuỗi các thao
: Giả sử ta cần thực hiện một chuỗi các thao
tác như sau trên cơ sở dữ liệu:
tác như sau trên cơ sở dữ liệu:

Bổ sung thêm môn học
Bổ sung thêm môn học
“cơ sở dữ liệu”
“cơ sở dữ liệu”
có mã
có mã
“TI-005”
“TI-005”

và số đơn vị học trình là 5 vào bảng
và số đơn vị học trình là 5 vào bảng
“MONHOC”
“MONHOC”



Nhập điểm thi môn
Nhập điểm thi môn
“cơ sở dữ liệu”
“cơ sở dữ liệu”
cho các sinh
cho các sinh
viên học lớp có mã
viên học lớp có mã
C24102
C24102
(tức là bổ sung thêm
(tức là bổ sung thêm
vào bảng
vào bảng
DIEMTHI
DIEMTHI
các bản ghi với cột
các bản ghi với cột
MAMONHOC
MAMONHOC
nhận giá trị
nhận giá trị
TI-005

TI-005
, cột
, cột
MASV
MASV


nhận giá trị lần lượt là mã các sinh viên học lớp
nhận giá trị lần lượt là mã các sinh viên học lớp
có mã
có mã
C24105
C24105
và các cột điểm là NULL).
và các cột điểm là NULL).
12
VD:
VD:
Nếu thực hiện yêu cầu trên thông qua các câu
Nếu thực hiện yêu cầu trên thông qua các câu
lệnh SQL như thông thường, ta phải thực thi hai
lệnh SQL như thông thường, ta phải thực thi hai
câu lệnh như sau:
câu lệnh như sau:
Insert Into
Insert Into
MonHoc(MaMH,TenMH,SoDVHT)
MonHoc(MaMH,TenMH,SoDVHT)



Values
Values
('TI-005', N'Cơ sở dữ liệu', 5)
('TI-005', N'Cơ sở dữ liệu', 5)


Insert Into
Insert Into
DiemThi(MaMonHoc,MaSV)
DiemThi(MaMonHoc,MaSV)


Select
Select
'TI-005', MaSV
'TI-005', MaSV


From
From
SinhVien
SinhVien


Where
Where
MaLop = 'C24102'
MaLop = 'C24102'
13
Create Proc

Create Proc
sp_LenDanhSachDiem
sp_LenDanhSachDiem


@maMH
@maMH
nvarchar
nvarchar
(10), @tenMH
(10), @tenMH
nvarchar
nvarchar
(50),
(50),


@sodvht
@sodvht
smallint
smallint
, @maLop
, @maLop
nvarchar
nvarchar
(10)
(10)
@KiemTra
@KiemTra
int OUTPUT

int OUTPUT


As
As




BEGIN
BEGIN


Insert Into
Insert Into
MonHoc
MonHoc


Values
Values
(@maMH, @ tenMH, @sodvht);
(@maMH, @ tenMH, @sodvht);




Insert Into
Insert Into
DiemThi(MaMH, MaSV)

DiemThi(MaMH, MaSV)


Select
Select
@maMH, MaSV
@maMH, MaSV
FROM
FROM
SinhVien
SinhVien


Where
Where
MaLop=@maLop
MaLop=@maLop


If
If


@@ERROR
@@ERROR
<> 0
<> 0
Then
Then



Set
Set
@KiemTra = 1
@KiemTra = 1
SET @KiemTra = @@ERROR
SET @KiemTra = @@ERROR


Else
Else


Set
Set
@KiemTra = 0
@KiemTra = 0


END
END


14
Ghi chú:
Ghi chú:


Khi thực thi
Khi thực thi

SP
SP
có tham số OUTPUT ta phải khai báo
có tham số OUTPUT ta phải khai báo
(
(
DECLARE)
DECLARE)
một biến trước khi gọi
một biến trước khi gọi
SP
SP
thực thi và
thực thi và
phải có từ khóa
phải có từ khóa
OUTPUT
OUTPUT
ngay sau tham số đó.
ngay sau tham số đó.
VD: gọi thực thi ví dụ trên.
VD: gọi thực thi ví dụ trên.
DECLARE
DECLARE
@Kiem_Tra
@Kiem_Tra
int
int
EXEC
EXEC

sp_LenDanhSachDiem 'TI-005', N'Cơ sở dữ liệu',
sp_LenDanhSachDiem 'TI-005', N'Cơ sở dữ liệu',


5, 'C24102‘,
5, 'C24102‘,
@Kiem_Tra
@Kiem_Tra
OUTPUT
OUTPUT


PRINT
PRINT
@KiemTra
@KiemTra
15
VD (tt):
VD (tt):
Create Proc
Create Proc
sp_NhanVienCungNamSinh
sp_NhanVienCungNamSinh
@Dem
@Dem
int Output
int Output


As

As


Select
Select
a.Ho + ' ' + a.Ten as HoTen, a.NgaySinh
a.Ho + ' ' + a.Ten as HoTen, a.NgaySinh
From
From
NhanVien a
NhanVien a
Inner Join
Inner Join
NhanVien b
NhanVien b


On
On


Year
Year
(a.NgaySinh) =
(a.NgaySinh) =
Year
Year
(b.NgaySinh)
(b.NgaySinh)
Where

Where
a.MaNhanVien <> b.MaNhanVien
a.MaNhanVien <> b.MaNhanVien
Set
Set
@Dem =
@Dem =
@@ROWCOUNT
@@ROWCOUNT
Gọi thực thi:
Gọi thực thi:
Declare
Declare
@dem int
@dem int
Exec
Exec
sp_NhanVienCungNamSinh @dem
sp_NhanVienCungNamSinh @dem
output
output
Print
Print
@Dem
@Dem
16
VD:
VD:
Store Procedure ENCRYPTION
Store Procedure ENCRYPTION

IF
IF
EXISTS (SELECT name FROM sysobjects
EXISTS (SELECT name FROM sysobjects


WHERE
WHERE
name = sp_encrypt_this' AND type = 'P')
name = sp_encrypt_this' AND type = 'P')


DROP
DROP


PROCEDURE
PROCEDURE
sp_encrypt_this
sp_encrypt_this
GO
GO
USE
USE
pubs
pubs
GO
GO
CREATE
CREATE



PROCEDURE
PROCEDURE
sp_encrypt_this
sp_encrypt_this
WITH
WITH


ENCRYPTION
ENCRYPTION
AS
AS
SELECT
SELECT
*
*
FROM
FROM
authors
authors
GO
GO
EXEC
EXEC


sp_helptext
sp_helptext

sp_encrypt_this
sp_encrypt_this
EXEC
EXEC
sp_encrypt_this
sp_encrypt_this
17
3. Hiệu chỉnh Store Procedure:
3. Hiệu chỉnh Store Procedure:
ALTER PROC
ALTER PROC
[
[
EDURE
EDURE
] procedure_name
] procedure_name


[
[
{ @parameter data_type }
{ @parameter data_type }


[
[
VARYING
VARYING
] [ = default ] [

] [ = default ] [
OUTPUT
OUTPUT
]
]
]
]


[ , n ]
[ , n ]
[
[


WITH
WITH




{
{
Recompile
Recompile
|
|
Encryption
Encryption
|

|
Recompile
Recompile
,
,
Encryption
Encryption
}
}
]
]




[
[
FOR REPLICATION
FOR REPLICATION
]
]
AS
AS
sql_statement [ n ]
sql_statement [ n ]


Hoặc trong SQL Query Analyzer
Hoặc trong SQL Query Analyzer



phải chuột
phải chuột


Edit
Edit
18
5.
5.
Xem nội dung
Xem nội dung
Store Procedure:
Store Procedure:
sp_helptext
sp_helptext
procedure_name
procedure_name
6.
6.
Xóa
Xóa
Store Procedure:
Store Procedure:
DROP PROCEDURE
DROP PROCEDURE
procedure_name
procedure_name
19
II. FUNCTION:

II. FUNCTION:
CREATE FUNCTION
CREATE FUNCTION
[
[
owner_name
owner_name
. ] function_name
. ] function_name


(
(
[{ @parameter_name
[{ @parameter_name
data_type
data_type
[ = default ]} [ , n ]]
[ = default ]} [ , n ]]
)
)
RETURNS
RETURNS
return_data_type
return_data_type
AS
AS
BEGIN
BEGIN



[ function_body ]
[ function_body ]


RETURN
RETURN
( expression )
( expression )
END
END
20
1. Ví dụ về Hàm trả về một giá trị:
1. Ví dụ về Hàm trả về một giá trị:
CREATE
CREATE


FUNCTION
FUNCTION
fn_Thu (@ngay
fn_Thu (@ngay
datetime
datetime
)
)
RETURNS
RETURNS



nvarchar
nvarchar
(10)
(10)
AS
AS




BEGIN
BEGIN




Declare
Declare
@st
@st
nvarchar
nvarchar
(10)
(10)


Select
Select
@st=
@st=

CASE
CASE


Datepart
Datepart
(DW, @ngay)
(DW, @ngay)


When
When
1
1
Then
Then
N'Chu nhật'
N'Chu nhật'


When
When
2
2
Then
Then
N'Thứ hai'
N'Thứ hai'



When
When
3
3
Then
Then
N'Thứ ba'
N'Thứ ba'


When
When
4
4
Then
Then
N'Thứ tư'
N'Thứ tư'


When
When
5
5
Then
Then
N'Thứ năm'
N'Thứ năm'



When
When
6
6
Then
Then
N'Thứ sáu'
N'Thứ sáu'


Else
Else
N'Thứ bảy'
N'Thứ bảy'




END
END


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


END
END



21

Sử dụng hàm:
Sử dụng hàm:
SELECT
SELECT
MaSV, HoDem, Ten,
MaSV, HoDem, Ten,
dbo
dbo
.Thu(ngaysinh), NgaySinh
.Thu(ngaysinh), NgaySinh
FROM
FROM
SinhVien
SinhVien
WHERE
WHERE
MaLop= 'C24102'
MaLop= 'C24102'
22
2. Ví dụ về Hàm trả dữ liệu kiểu TABLE:
2. Ví dụ về Hàm trả dữ liệu kiểu TABLE:
CREATE
CREATE


FUNCTION

FUNCTION
fn_XemSV(@khoa
fn_XemSV(@khoa
smallint
smallint
)
)
RETURNS
RETURNS
TABLE
TABLE
AS
AS




RETURN
RETURN


(
(
SELECT
SELECT
MaSV, HoDem, Ten, NgaySinh
MaSV, HoDem, Ten, NgaySinh


FROM

FROM
SinhVien
SinhVien
INNER JOIN
INNER JOIN
Lop
Lop


ON
ON
SinhVien.MaLop = Lop.MaLop
SinhVien.MaLop = Lop.MaLop


WHERE
WHERE
Khoa=@khoa
Khoa=@khoa
)
)
Gọi hàm:
Gọi hàm:


SELECT
SELECT
*
*
FROM

FROM


dbo
dbo
.fn_XemSV (25)
.fn_XemSV (25)
23
CREATE FUNCTION
CREATE FUNCTION
fn_TongSV(@khoa
fn_TongSV(@khoa
smallint
smallint
)
)
RETURNS
RETURNS
@bangthongke
@bangthongke
TABLE
TABLE




( MaKhoa nvarchar(5), TenKhoa nvarchar(50), tongsosv int )
( MaKhoa nvarchar(5), TenKhoa nvarchar(50), tongsosv int )
AS
AS



BEGIN
BEGIN




IF
IF
@khoa=0
@khoa=0
Insert
Insert


Into
Into
@bangthongke
@bangthongke


Select
Select
k.MaKhoa, k.TenKhoa,
k.MaKhoa, k.TenKhoa,
Count
Count
(s.MaSV)
(s.MaSV)

From
From
Khoa as k
Khoa as k
Inner
Inner


Join
Join
Lop as l
Lop as l
On
On
k.MaKhoa = l.MaKhoa
k.MaKhoa = l.MaKhoa


Inner
Inner


Join
Join
SinhVien as s
SinhVien as s
On
On
l.MaLop = s.MaLop
l.MaLop = s.MaLop

Group
Group


By
By
k.makhoa, k.TenKhoa
k.makhoa, k.TenKhoa


ELSE
ELSE




Insert
Insert


Into
Into
@bangthongke
@bangthongke


Select
Select
k.MaKhoa, k.TenKhoa,
k.MaKhoa, k.TenKhoa,

Count
Count
(s.MaSV)
(s.MaSV)
From
From
Khoa as k
Khoa as k
Inner
Inner


Join
Join
Lop as l
Lop as l
On
On
k.MaKhoa = l.MaKhoa
k.MaKhoa = l.MaKhoa


Inner
Inner


Join
Join
SinhVien as s
SinhVien as s

On
On
l.MaLop = s.MaLop
l.MaLop = s.MaLop


Where
Where
l.Khoa=@khoa
l.Khoa=@khoa


Group
Group


By
By
k.makhoa, k.TenKhoa
k.makhoa, k.TenKhoa


RETURN
RETURN
/*Trả kết quả về cho hàm*/
/*Trả kết quả về cho hàm*/
END /*
END /*
Select * From
Select * From

fn_TongSV
fn_TongSV
(25) */
(25) */

×