1. Trang chủ
  2. » Giáo án - Bài giảng

Chương 7 Lập trình T SQL

59 1,5K 0

Đ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 59
Dung lượng 251 KB

Nội dung

Batch và Script Batch là một tập hợp các lệnh tạo thành một nhóm và được xem như một đơn vị thực thi  Các lệnh Create phải được đặt trong một batch đơn  Script là 1 chuỗi các batch đ

Trang 1

Chương 7

Lập trình T_SQL

Trang 3

 Cấu trúc điều khiển if, while

 Khối lệnh begin … end

Trang 4

Batch và Script

Batch là một tập hợp các lệnh tạo thành một

nhóm và được xem như một đơn vị thực thi

 Các lệnh Create phải được đặt trong một batch đơn

Script là 1 chuỗi các batch được kết hợp và

lưu trữ trong cùng 1 file

 Lệnh GO được dùng để xác định việc kết thúc của 1 batch bên trong 1 script.

 File sql

Trang 5

Batch và Script

USE QLSach

GO /* đánh dấu kết thúc batch thứ 1*/ CREATE VIEW vwNhanvien AS

SELECT * FROM Nhanvien

GO /* đánh dấu kết thúc batch thứ 2 */ SELECT * FROM vwNhanvien

GO /* đánh dấu kết thúc batch thứ 3 */

Trang 7

Biến cục bộ

 Tên biến bắt đầu bằng @

 Phạm vi hoạt động của biến : bắt đầu từ vị trí khai báo đến khi kết thúc batch, hay kết thúc procedure, function

 Khai báo biến

DECLARE @variable_name data_type

Có thể khai báo nhiều biến trong một lệnh declare

Trang 8

Biến cục bộ

 Gán giá trị vào biến: 2 cách

VD1

DECLARE @Charge int //khai báo biến

SET @Charge = 10 //gán biến

VD2

DECLARE @SL int //khai báo biến

SELECT @SL = Sum(SoLuong) // gán biến

From HangHoa Where Year(NgayNhap) = 2004

VD3

DECLARE @SL int

Trang 9

Biến cục bộ

 Gán giá trị vào biến: 2 cách

VD4

DECLARE @SL int //khai báo biến

SELECT @SL = SoLuong // gán biến

From HangHoa

VD4

DECLARE @a int, @b int //khai báo nhiều biếnSELECT @a = 10 , @b = 100 //gán nhiều biến

Trang 12

Cấu trúc điều khiển

 Cấu trúc if …else

 Cấu trúc while

 Biểu thức Case

Trang 14

Cấu trúc if (tt)

VD2

if (select avg(year(ngaysinh)) from nhanvien) <=35

print ‘young leaders’

else

print ‘old leaders’

Trang 15

Cấu trúc if (tt)

VD3

Declare @masach char(5), @dgnew float

Set @masach = ‘S0001’

if (Select slton from dmsach where masach = @masach) >=100

Select @dgnew = dongia*0.7

from dmsach where masach = @masach

else

if (Select slton from dmsach where masach = @masach) >=50

Select @dgnew = dongia*0.8 from dmsach where masach = @masach

else

Select @dgnew = dongia*0.9 from dmsach where masach = @masach

Trang 18

Case (tt)

 VD2.a : dạng 1 của CASE

Select (case phai

when ‘nam’ then ‘Mr ’ when ‘nữ’ then ‘Mrs ’

end ) + Hoten From Nhanvien

Trang 20

Case (tt)

 VD3

select case

when (select avg(soluong) from CTHD)>100

then ‘không khuyến mãi’

when (select avg(soluong) from CTHD)>40

then ‘cần khuyến mãi’

else ‘cần hỗ trợ vốn'

end

 Có thể sử dụng biến trung gian

Trang 21

SET price = price * 2

SELECT MAX(price) FROM titles

IF (SELECT MAX(price) FROM titles) > $50

BREAK

ELSE

CONTINUE

END

Trang 23

Lợi ích

 Dùng thủ tục (stored procedure) trong SQL Server tốt hơn dùng các chương trình T-SQL được lưu trữ trên client:

 Cho phép lập trình thủ tục

 có thể tạo thủ tục 1 lần, lưu trữ nó trong database, và gọi nó bất kỳ lúc nào cần dùng trong chương trình.

 Cho phép thực thi nhanh hơn

 Có thể giảm lưu lượng mạng

 Có thể được dùng như cơ chế bảo mật

Trang 24

Thủ tục - Store procedure

 Gồm các loại

 System Store Procedure

 Lưu trong Master DB

 Có tên bắt đầu sp_

 Thực hiện các tác vụ hệ thống

 User Defined Store Procedure

 Lưu trữ trong DB của người dùng

 Temporary Store Procedure

Lưu trữ trong Tempdb DB

Trang 25

System Store Procedure

 Một số System Store Procedure

Trang 26

User Defined Store Procedure

Trang 27

User Defined Store Procedure

Trang 28

User Defined Store Procedure

Trang 29

User Defined Store Procedure

Trang 30

Sử dụng tham số trong thủ tục

 Sử dụng tham số vào

VD2:

Create proc nhan2so

@so1 int, @so2 int

As

Print @so1*@so2

Go

Exec nhan2so 5, 10 //xuất ra 50

Trang 31

Sử dụng tham số trong thủ tục

 Khai báo giá trị default của tham số vào

Create proc nhan2so

@so1 int = 1, @so2 int = 1

As

Print @so1*@so2

Go

Exec nhan2so 5, 10 //xuất ra 50

Exec nhan2so //xuất ra 1

Trang 32

Sử dụng tham số trong thủ tục

 Sử dụng tham số ra để trả về giá trị

Create proc nhan2so

@so1 int , @so2 int , @kq int OUTPUT

As

Set @kq= @so1*@so2

Go

Declare @ketqua int

Exec nhan2so 5, 10 , @ketqua OUTPUT

Print @ketqua

Trang 33

Sử dụng return trong thủ tục

 Sử dụng lệnh return để trả về giá trị

Create proc nhan2so

@so1 int , @so2 int

As

Return @so1*@so2

Go

Declare @ketqua int

Exec @ketqua = nhan2so 5, 10

Print @ketqua

Trang 34

Bài tập 1

Viết thủ tục chèn dữ liệu vào bảng Sach

Create proc insSach

@Masach char(5), @tensach varchar(50), @tacgia varchar(50), @manhom char(5), @dongia int,

@slton int

As

Insert into sach

Values(@Masach, @tensach, @tacgia, @manhom,

@dongia, @slton)

Go

Trang 35

Bài tập 1

Create proc insSach

@Masach char(5), @tensach varchar(50), @tacgia varchar(50),

@manhom char(5), @dongia int, @slton int

As

Insert into sach

Values(@Masach, @tensach, @tacgia, @manhom, @dongia, @slton) Return @@error //trả về mã lỗi

Go

declare @err int

exec @err = insSach 's100', 'aaa', 'bbb', 'n001', 100, 20

print @err

Trang 36

Hàm _ functions

 Chức năng

 Trả về một giá trị, hay một tập row

 Không sử dụng tham số ra => trả về giá trị bằng lệnh return

 Có 3 loại

– Scalar function : Trả về một giá trị đơn

– Inline Table-valued :Sử dụng một câu lệnh Select để trả về một tập row

– Multi-statement Table-valued : Sử dụng nhiều câu lệnh để trả về một tập row

Trang 37

Scalar functions

 Định nghĩa Scalar function

CREATE FUNCTION nhan(@so1 int, @so2 int) RETURNS int

Trang 38

Inline Table_value Function

 Sử dụng để tạo một view có tham số

CREATE FUNCTION nhomsach(@manhom char(5))RETURNS TABLE

Trang 39

Multistatement table_value

function

 Sử dụng để tạo tập dữ liệu

 Cho phép nhiều câu lệnh trong thân hàm

CREATE FUNCTION Loaisach()

RETURNS @tapkq TABLE(maso char(5), ten

varchar(40) ) as

BEGIN

insert @tapkq select * from nhomsach

insert @tapkq select * from nhomsach

Trang 40

Bài tập 2

Xây dựng thủ tục , hàm để thực hiện cùng chức năng với truy vấn sau

Select Mahd, c.Masach, soluong, dongia, chietkhau = case

(when soluong <5 then 0.05*dongia

when soluong <10 then 0.06*dongia

when soluong <15 then 0.08*dongia

else 0.1*dongia

end )

From Sach s, Chitiethoadon c

Where s.masach = c.masach

Trang 41

when soluong <10 then 0.06*dongia

when soluong <15 then 0.08*dongia

else 0.1*dongia

end )

From Sach s, Chitiethoadon c

Where s.masach = c.masach

Trang 42

Bài tập 2

Phương án 2

Create proc chitiethd

@m1 int, @dg1 float, @m2 int, @dg2 float, @m3 int, @dg3 float, @dg4 float

as

Select Mahd, c.Masach, soluong, dongia, chietkhau = case

(when soluong <@m1 then @dg1 *dongia

when soluong <@m2 then @dg2 *dongia

when soluong <@m3 then @dg3 *dongia

else @dg4 *dongia

end )

From Sach s, Chitiethoadon c

Where s.masach = c.masach

Trang 43

Bài tập 2

Phương án 3

Create proc chitiethd

@m1 int, @dg1 float, @m2 int, @dg2 float, @m3 int, @dg3 float, @dg4 float

as

Select Mahd, c.Masach, soluong, dongia, chietkhau =

dbo Ckhau(soluong, dongia, @m1, @dg, @m2,

@dg2, @m3, @dg3, @dg4)

From Sach s, Chitiethoadon c

Trang 44

Bài tập 2

Create function ckhau(@solg int, @gia float, @m1 int,

@dg1 float, @m2 int, @dg2 float, @m3 int, @dg3

set @ck = @dg3 *@gia else

Trang 45

 Raiserror

 Transaction

Trang 46

 Các thông báo lỗi có thể:

 được trả về bởi chính SQL Server khi có lỗi xảy ra

 Hoặc được phát ra bằng lệnh RAISERROR

 Cú pháp

RAISERROR ( { msg_id | msg_str } { ,

severity , state } [ , argument [ , n ] ] )

Trang 47

msg_id : mã lỗi Mỗi thông báo lỗi trong

sysmessages có 1 mã lỗi

msg_str : thông báo chỉ ra lỗi và có thể chỉ ra

cách khắc phục lỗi Chuỗi thông báo có thể chứa

các biến và đối số thay thế, giống như hàm printf

của ngôn ngữ C

severity : Mức độ nghiêm trọng của lỗi

state : Số trạng thái lỗi _chỉ nguồn mà từ đó lỗi được tạo ra

Trang 48

 Mức độ nghiêm trọng của lỗi : Có 25 mức độ

 Mức từ 17 đến 25 chỉ ra các lỗi về phần cứng và phần

mềm và thường chỉ có nhà quản trị hệ thống mới giải quyết

và theo dõi các lỗi này

 Mức từ 11 đến 16 được tạo ra bởi người dùng và người dùng có thể tự sửa chữa được.

 Mức 10 thường lỗi mang tính chất thông báo và thường do nhầm lẫn khi gõ lệnh

 Khi tạo thông báo lỗi của người dùng, mã lỗi phải lớn hơn 50,000 và mức độ nghiêm trọng từ 0 đến

18 Chỉ có các nhà quản trị hệ thống mới có thể tạo

Trang 50

Transaction – giao tác

 Transaction là 1 chuỗi các thao tác được

thực thi như 1 đơn vị công việc riêng (single logical unit of work).

 Hoặc tất cả các lệnh trong transaction được thực thi , hoặc không lệnh nào được thực thi

 Những chỉnh sửa của 1 trans độc lập với trans khác thi hành đồng thời

 Kết quả của trans được lưu giữ ổn định trong hệ thống

Trang 51

Transaction – các lệnh

Bắt đầu một transaction

BEGIN TRAN [ SACTION ] transaction_name

Hoàn tất một Transaction

COMMIT [ TRAN [ SACTION ] transaction_name

Đặt điểm dừng trong Transaction

SAVE TRAN [ SACTION ] { savepoint_name |

@savepoint_variable }

Hủy một Transaction

ROLLBACK [ TRAN [ SACTION ]

[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]

Trang 55

Cơ cấu thực thi

 Khi lệnh insert và update được thực hiện, dòng dữ liệu thêm mới hay chỉnh sửa được lưu vào bảng

Inserted trong bộ nhớ cash

 Khi lệnh delete dữ liệu được thực hiện, dòng dữ liệu

bị xóa được lưu vào bảng deleted trong bộ nhớ

cash

 Các bảng Inserted và deleted có cấu trúc giống hệt bảng gốc, và truy suất được bởi các lệnh T_SQL

trong trigger

Trang 56

Các lệnh

 Hai loại trigger

 FOR trigger / AFTER trigger

Trang 58

IF EXISTS (Select * From INSERTED I, Sach s where

i.masach=s.masach and i.soluong > s.soluongton) Begin

RAISERROR(‘Không cập nhật được vì số lượng > slTon kho’,16,1) ROLLBACK TRAN

Trang 59

Ví dụ 3

Create Trigger SLban2

ON cthd

INSTEAD OF INSERT, UPDATE

AS

IF EXISTS (Select * From INSERTED I, Sach s where i.masach=s.masach and i.soluong <= s.soluongton)

if not exists (select * from deleted)

Begin Insert cthd select * from Inserted End

else

begin Declare @sl int, @mahd char(5), @masach char(5) Set @sl = (select soluong from inserted )

Set @mahd = (select mahd from inserted) Set @masach = (select masach from inserted) update cthd set soluong = @sl

where mahd = @mahd and masach = @masach end

Ngày đăng: 12/05/2014, 11:52

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w