1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Client/Server - Chương 8: Thủ tục doc

18 339 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 52 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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... procedure_name [ {@parameter data_

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

Trang 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

Trang 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 ]

}

Trang 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

Trang 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

Trang 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

Trang 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;

Trang 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)))+'.'

Trang 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

Trang 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;

Trang 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 )

Trang 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

Trang 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

Trang 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'

Trang 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'

Trang 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)

Trang 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

Trang 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

Ngày đăng: 27/06/2014, 03:20

TỪ KHÓA LIÊN QUAN