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

Bài giảng Client/Server - Chương 8: Thủ tục 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 (223.25 KB, 18 trang )

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

Khai báo thủ tục

Tham số EXECUTE AS

AS CALLER

AS OWNER

AS SELF

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

sp_procoption
2
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} }]
AS
sql_statement [ n]
return
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.


3
Thực hiện thủ tục
EXEC [ UTE ]
{[@return_status=]
{procedure_name[;number]|@procedure_name_var}
[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]]
[, n]
[WITHRECOMPILE]
}
4
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
5
Tìm USCLN
Create proc uscln
@a int, @b int, @c int output

as
declare @r int
set @r= @a % @b
While @r<>0
Begin
set @a=@b
Set @b=@r
set @r= @a % @b
End
Set @c=@b
return @c
6
Thủ tục đệ qui
Create proc gt
@i int, @j int,@m int output
as
declare @dum int, @t int
if @i>1
Begin
set @t=@i*@j
set @i=@i-1
exec @dum=gt @i,@t,@m output
End
else
set @m=@j
declare @gt1 int
exec gt 4,1, @gt1 output
print @gt1
7
Gía cao nhất của các sản phẩm %Bikes% với ngưỡng @maxprice

Use AdventureWorks
Alter PROCEDURE Production.usp_GetList
@product varchar(40), @maxprice money ,
@compareprice money OUTPUT, @listprice money OUTPUT
AS
SET @listprice = (SELECT MAX(p.ListPrice)
FROM Production.Product p JOIN
Production.ProductSubcategory s ON p.ProductSubcategoryID =
s.ProductSubcategoryID WHERE s.Name LIKE @product AND
p.ListPrice <@maxprice);
Populate the output variable @compareprice.
SET @compareprice = @maxprice;
8
Chạy thử với giá max=$10, $700
DECLARE @compareprice money, @cost money
EXECUTE Production.usp_GetList '%Bikes%', 10,
@compareprice OUT, @cost OUTPUT
IF @cost <= @compareprice
BEGIN
PRINT 'These products can be purchased for less than
$'+RTRIM(CAST(@compareprice AS varchar(20)))+'.'
END
ELSE
PRINT 'The prices for all products in this category exceed
$'+ RTRIM(CAST(@compareprice AS varchar(20)))+'.'
9
Sử dụng tham số cursor output
USE AdventureWorks;
GO
CREATE PROCEDURE dbo.currency_cursor

@currency_cursor CURSOR VARYING OUTPUT
AS
SET @currency_cursor = CURSOR FORWARD_ONLY STATIC FOR
SELECT CurrencyCode, Name FROM Sales.Currency;
OPEN @currency_cursor;
GO
10
Sử dụng tham số cursor output (2)
USE AdventureWorks;
GO
DECLARE @MyCursor CURSOR;
EXEC dbo.currency_cursor @currency_cursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
11
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 )
12
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 productName, unitPrice
FROM Northwind.dbo.Products ORDER BY UnitPrice
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
13
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
14
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'
15
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'
16
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)
17
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.
18
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

×