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

Bài 8 thủ tục (SP) và xử lý lỗi trong SP

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 (251.12 KB, 21 trang )

1
Bài 8: Thủ tục (Stored Procedure)

Tìm hiểu về thủ tục trong SQL

Cú pháp tạo, sửa, xóa thủ tục

Ý nghĩa các tham số EXECUTE AS

CALLER

OWNER

SELF

Thiết lập thủ tục tự động

sp_procoption
1. Tìm hiểu về Stored Procedure (SP)

Khái niệm: Stored Procedure là một đối tượng trong SQL Server,
gồm một nhóm câu lệnh Transact-SQL đã được compiled (biên
dịch), được xử lý như một đơn vị

Bắt đầu được bổ sung từ SQL 2000
2
Ưu điểm của SP
-
Hiệu quả (Performance): SP được biên dịch (compile) và lưu trữ
ngay trong database server. Do đó:
+ Không cần kiểm tra quyền (permission) của các câu lệnh đơn lẻ.


+ Không cần kiểm tra lại cú pháp và tạo kế hoạch thực thi
+ Giảm lưu lượng mạng: Không cần gửi nhiều câu lệnh SQL dài dòng,
chỉ cần gửi tên SP và nhận kết quả trả về.
-
Lập trình (Programming Framework)
+ Dễ bảo trì
- Bảo mật (Security )
+ Che dữ liệu của bảng
+ SP có thể được mã hóa (encrypt ) để tăng tính bảo mật
3
Nhược điểm

Stored procedure làm cho database server phải tốn nhiều tài nguyên
về cả bộ nhớ lẫn xử lý.

Chỉ chứa các khai báo Sql, do đó khó viết một Sp nhằm thực hiện
thao tác phức tạp như các ngôn ngữ khác: C#, Java, C++, …

Xử lý trong các cấu trúc lệnh chậm hơn so với các ngôn ngữ khác.

Khó Debug
4
Các loại Stored Procedure

System Stored Prcedure
+ Chứa trong master DB
+ SQL cung cấp hàng nghìn SP hệ thống. Chủ yếu dùng trong việc
quản lý database (administration) và security
+ Liệt kê các sp hệ thống trong CSDL master
select * from sysobjects where xtype ='P'

+ Ví dụ thủ tục sp_addtype dùng để tạo kiểu dữ liệu mới.

Local Stored Procedure
+ Được viết bởi DBA hoặc Programmer
+ Lưu trong User Database
5
Các loại Stored Procedure

Temporary Stored Procedure
+ Được lưu trong TemDB
+ Sẽ bị xóa khi connection tạo ra chúng bị đóng hoặc SQL Server
Shutdown

Extended Stored Procedure
+ Là một loại stored procedure của một chương trình ngoại vi (external
program) có thể viết bởi C, C++, được biên dịch thành một DLL.
+ Lời gọi thủ tục này có cú pháp giống gọi SP của SQL
+ Thường bắt đầu bằng xp_

Remote Stored Procedure
+ Là các stored procedure gọi stored procedure ở server khác.
+ Ví dụ: sp_who @loginame=’DomainNameAdministrators’
6
7
Khai báo thủ tục
Cú pháp:
CREATE PROC[EDURE] [schema.]procedure_name
[ {@parameter data_type} [= default] [OUTPUT] ]
[, n]
[WITH {RECOMPILE | ENCRYPTION |

EXECUTE AS { CALLER|OWNER|SELF} }]
AS
sql_statement [ n]
return [expression]
EXECUTE AS CALLER: chỉ định là user muốn thực hiện thủ tục phải có quyền
thực hiên trên thủ tục này, và có các quyền tương ứng trên các objects trong thủ
tục.

8
Thực thi thủ tục
EXEC [ UTE ]
{[@return_status=]
{procedure_name[;number]|@procedure_name_var}
[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]]
[, n]
[WITHRECOMPILE]
}
-
Nếu sử dụng cách gọi @parameter = value, có thể để các tham số theo thứ tự bất
kỳ
-
Nếu không sử dụng tên tham số, các giá trị sẽ được gán cho các tham số theo thứ
tự.
-
Tham số nào không được truyền giá trị hoặc gán bằng DEFAULT, SP sẽ sử dụng
giá trị mặc định trong khai báo tham số đó.
-
@return_status = giá trị trả về của SP. Nếu hàm không có giá trị trả về
@return_status = 0 (Thủ tục thực thi không lỗi).
Sử dụng tham số output

-
Nếu sử dụng từ khóa OUTPUT để khai báo tham số trong SP. Giá
trị hiện tại của biến sẽ được lưu lại sau lời gọi thủ tục.
-
Khi gọi SP cũng phải sử dụng từ khóa OUTPUT với các biến được
khai báo dạng này.
9
10
VD: Tìm số lớn nhất trong 3 số a,b,c
Use Test
CREATE PROCEDURE dbo.MaxABC
@a real=1, @b real=9, @c real=10, @max real output
as
set @max=@a
if @max <@b
set @max=@b
if @max <@c
set @max=@c
return @max
GO
declare @max real,@return_status real
exec @return_status = dbo.maxabc 100, default, default, @max output
print @max
print @return_status
11
Thủ tục đệ qui
Create proc gt
@n int,@m int output
as
if @i>1

Begin
exec @m=gt @n - 1,@m output
set @m = @n*@m
End
else
set @m=1
declare @gt1 int
exec gt 4,1, @gt1 output
print @gt1
Một số ví dụ
Vd1: Viết thủ tục chèn một bản ghi vào bảng (bảng có/ không có
trường identity)
-
Hàm @@IDENTITY
Vd2: Viết thủ tục liệt kê k mặt hàng có doanh thu lớn nhất của mỗi loại
hàng trong một khoảng thời gian nào đó.
- Hàm ROW_NUMBER
Vd3: Viết thủ tục phân trang các bản ghi
12
13
Thủ tục phân trang các bản ghi
CREATE PROCEDURE sp_PagedItems ( @Page int, @RecsPerPage int)
AS
CREATE TABLE #TempItems (ID int IDENTITY, Name varchar(50), Price money)
INSERT INTO #TempItems (Name, Price)
SELECT Name, listPrice
FROM Adventureworks.Production.Product ORDER BY listPrice
DECLARE @FirstRec int, @LastRec int
SET @FirstRec = (@Page - 1) * @RecsPerPage +1
SET @LastRec = (@Page * @RecsPerPage )

SELECT *, MoreRecords =( SELECT COUNT(*)
FROM #TempItems TI WHERE TI.ID > @LastRec)
FROM #TempItems WHERE ID >= @FirstRec AND ID <= @LastRec
go
Exec sp_pagedItems 2, 10
14
Thủ tục phân trang các bản ghi
use tempDB go
create table Customers (CustomerID int , CompanyName
varchar(100)) go
CREATE PROC GetCustomersByPage @PageSize int,
@PageNumber int AS
Declare @RowStart int; Declare @RowEnd int
if @PageNumber > 0
Begin
SET @PageNumber = @PageNumber -1
SET @RowStart = @PageSize * @PageNumber + 1;
SET @RowEnd = @RowStart + @PageSize - 1;
With Cust AS ( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as
RowNumber FROM Customers )
Select * from Cust Where RowNumber >= @RowStart and
RowNumber <= @RowEnd
END
exec GetCustomersByPage 10, 1
15
Tham số EXECUTE AS

Chúng ta phân biệt giữa:


EXECUTE AS CALLER (mặc định)

EXECUTE AS OWNER

EXECUTE AS SELF

Xem kịch bản trong lecture4-Procedure.doc (Phân biệt các tham số
Execute as )
16
Thiết lập một thủ tục tự động chạy
Có thể thiết lập để một thủ tục có thể tự động chạy khi mà chúng ta
khởi động dịch vụ sqlserver:
sp_procoption [ @ProcName = ] 'procedure'
, [ @OptionName = ] 'option'
, [ @OptionValue = ] 'value'
17
Thiết lập một thủ tục tự động chạy (2)
use master
go
CREATE PROCEDURE StartUpProcAudit
as
IF NOT EXISTS (SELECT * FROM sys.objects WHERE
object_id = OBJECT_ID(N'[dbo].[AuditTable]') AND type in (N'U'))
CREATE TABLE [dbo].[AuditTable](
[UserName] [nchar](20) COLLATE Vietnamese_CI_AI NULL,
[DateTimeLogin] [datetime] NULL
) ON [PRIMARY]
INSERT INTO [AuditTable] values(user_name(),getdate())
exec sp_procoption N'StartUpProcAudit', N'startup', N'true'
18

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)
19
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.
20
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
So sánh hiệu năng vòng while

declare @d1 decimal, @d2 decimal, @d3 decimal, @i int

set @i = 1

while @i<10 000 000

begin

set @d1 = @d1 +1

set @d2 = @d2 +1

set @d3 = @d3 +1

set @i = @i + 1


end

Thực thi: 12s

C#: 1s
21

×