bài 5 : lập trình với csdl trong sql

40
1 1 TRѬӠNG ҤI HӐC KHOA HӐC TӴ NHIÊN TP.HCM TRUNG TÂM TIN HӐC SQL Server

Upload: mastercodevn

Post on 16-Apr-2017

22.681 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Bài 5 : Lập trình với CSDL trong SQL

1 1

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

SQL Server

Page 2: Bài 5 : Lập trình với CSDL trong SQL

2 2

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Lập trình v i CSDL

5

Page 3: Bài 5 : Lập trình với CSDL trong SQL

3 3

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Biến cục bộ

Page 4: Bài 5 : Lập trình với CSDL trong SQL

4 4

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Khai báo biến cục bộ

• Dùng để l u tr các giá tr t m th i trong quá trình tính toán

Biến phải có kiểu dữ liệu

Biến muốn sử dụng trong một batch phải khai báo trước

DECLARE @Tên_biến Kiểu_dữ_liệu [, ...] Ví dụ : DECLARE @Tongsldat INT, @Hotenncc CHAR(50)

DECLARE @Ngayxh DATETIME

Page 5: Bài 5 : Lập trình với CSDL trong SQL

5 5

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Gán giá tr cho biến

SET @Biến = Giá_trị SET @a = 5

Select @Biến = Tên_Cột From Tên_Bảng

Select @ConLai = TonCuoiKy From TonKho Where MaVTu = ‘VT010’ And NamThang = ‘200402’

Sử dụng lệnh SET hoặc SELECT

Page 6: Bài 5 : Lập trình với CSDL trong SQL

6 6

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Xem giá tr hiện hành của biến

• Lệnh PRINT

Print @Biến Print @A

• Khi có kết hợp với chuỗi, phải đổi kiểu dữ liệu sang kiểu chuỗi bằng hàm CAST hay CONVERT

Print ‘Giá trị của @A ‘ + cast(@A as char(4))

Page 7: Bài 5 : Lập trình với CSDL trong SQL

7 7

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Ph m vi ho t động của biến

• Một biến chỉ có ph m vi ho t động cục bộ

Trong một Batch

Trong một Stored Procedure hay Trigger DECLARE @Ngaydhgn DATETIME

SELECT @Ngaydhgn=MAX(NGAYDH)

FROM DONDH

GO

PRINT 'Ngày đặt hàng gần nhất: ' + CONVERT(CHAR(12),@Ngaydhgn)

GO

Page 8: Bài 5 : Lập trình với CSDL trong SQL

8 8

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Biến hệ thống

Page 9: Bài 5 : Lập trình với CSDL trong SQL

9 9

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Ý nghĩa sử dụng • Cung cấp các thông tin hệ thống nh

Phiên bản SQL Server

Số dòng dữ liệu vừa được xử lý bởi câu lệnh

Mã lỗi

Số lượng kết nối

Tình trạng cursor

• Không cần khai báo

Biến do SQL Server định sẵn

Tên bắt đầu bởi @@

Page 10: Bài 5 : Lập trình với CSDL trong SQL

10 10

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Một vài biến hệ thống th ng dùng • @@RowCount

Tổng số mẩu tin được tác động của câu lệnh truy vấn gần nhất.

• @@Error

Số mã lỗi của câu lệnh thực hiện gần nhất

Khi một câu lệnh thực hiện thành công thì giá trị là 0.

• @@Fetch_Status

Trạng thái của việc đọc dữ liệu trong bảng theo cơ chế từng mẩu tin (cursor).

Khi đọc dữ liệu của mẩu tin thành công thì giá trị là 0.

Page 11: Bài 5 : Lập trình với CSDL trong SQL

11 11

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Các toán tử

Page 12: Bài 5 : Lập trình với CSDL trong SQL

12 12

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Toán tử số h c Ký hiệu Ý nghĩa

+ Thực hiện phép cộng hai số

- Thực hiện phép trừ hai số.

* Thực hiện phép nhân hai số.

/ Thực hiện phép chia hai số.

% Thực hiện phép chia lấy phần dư.

Page 13: Bài 5 : Lập trình với CSDL trong SQL

13 13

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Toán tử nối chuỗi

• Sử dụng dấu + làm toán tử nối chuỗi

SELECT 'Hello' + ' ' + 'The World!'

SELECT 'Ngày đặt hàng D007 là: ' + CAST(NGAYDH AS CHAR(11))

FROM DONDH

WHERE SODH='D007'

Page 14: Bài 5 : Lập trình với CSDL trong SQL

14 14

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Toán tử so sánh

Ký hiệu Ý nghĩa

= Thực hiện phép so sánh bằng. > Thực hiện phép so sánh lớn hơn. < Thực hiện phép so sánh nhỏ hơn.

>= Thực hiện phép so sánh lớn hơn hoặc bằng. <= Thực hiện phép so sánh nhỏ hơn hoặc bằng. <> Thực hiện phép so sánh khác. != Thực hiện phép so sánh khác. !> Thực hiện phép so sánh không lớn hơn. !< Thực hiện phép so sánh không nhỏ hơn.

Page 15: Bài 5 : Lập trình với CSDL trong SQL

15 15

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Toán tử luận lý

• Sử dụng các toán tử thông th ng AND, OR, NOT vẫn dùng trong các câu SQL

SELECT * FROM VATTU

WHERE (DVTINH='Bộ' AND PHANTRAM>10) OR (DVTINH='Cái' AND PHANTRAM>20)

Page 16: Bài 5 : Lập trình với CSDL trong SQL

16 16

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

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

Page 17: Bài 5 : Lập trình với CSDL trong SQL

17 17

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Cấu trúc rẽ nhánh IF...ELSE

IF Biểu_thức_luận_lý Câu_lệnh1 | Khối_lệnh1 [ ELSE

Câu_lệnh2 | Khối_lệnh2 ]

Page 18: Bài 5 : Lập trình với CSDL trong SQL

18 18

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Ví Dụ : IF (SELECT COUNT(*) FROM CTPXUAT WHERE SLXUAT>4) > 0

BEGIN

PRINT 'Danh sách các hàng hóa bán với số lượng > 4' SELECT CTPX.MAVTU, TENVTU, SLXUAT

FROM CTPXUAT CTPX INNER JOIN VATTU VT

ON VT.MAVTU=CTPX.MAVTU

WHERE SLXUAT>4

END

ELSE

PRINT 'Chưa bán hàng hóa nào với số lượng >4'

Page 19: Bài 5 : Lập trình với CSDL trong SQL

19 19

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Cú pháp If Exists

IF EXISTS (SELECT * FROM CTPXUAT WHERE SLXUAT>4)

BEGIN

PRINT 'Danh sách các hàng hóa bán với số lượng > 4' SELECT CTPX.MAVTU, TENVTU, SLXUAT

FROM CTPXUAT CTPX INNER JOIN VATTU VT ON VT.MAVTU=CTPX.MAVTU

WHERE SLXUAT>4

END

ELSE

PRINT 'Chưa bán hàng hóa nào với số lượng >4'

IF EXISTS (Câu_lệnh_SELECT) Câu_lệnh1 | Khối_lệnh1 [ ELSE Câu_lệnh2 | Khối_lệnh2 ]

Page 20: Bài 5 : Lập trình với CSDL trong SQL

20 20

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Cấu trúc lặp WHILE

DECLARE @Songuyen INT

SET @Songuyen=100

WHILE (@Songuyen<110)

BEGIN

PRINT 'Số nguyên : ' + CONVERT(CHAR(3), @Songuyen) SET @Songuyen = @Songuyen + 1

END

WHILE Biểu_thức_luận_lý BEGIN Các_lệnh_lặp END

Page 21: Bài 5 : Lập trình với CSDL trong SQL

21 21

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Sử dụng biến kiểu d liệu cursor

Page 22: Bài 5 : Lập trình với CSDL trong SQL

22 22

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Khái niệm về cursor

• Các lệnh của SQL Server làm việc trên một nhóm nhiều mẩu tin

• Cursor là cấu trúc giúp làm việc v i từng mẩu tin t i một th i điểm

Khai báo cursor như một câu lệnh SELECT

Có thể di chuyển giữa các mẩu tin trong cursor để làm việc

Có thể dùng cursor để cập nhật dữ liệu (Update, Delete)

Page 23: Bài 5 : Lập trình với CSDL trong SQL

23 23

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Các b c sử dụng kiểu d liệu cursor • Định nghĩa biến kiểu cursor bằng lệnh DECLARE

Có hai loại cursor: Local, Global

Cách di chuyển mẩu tin trong cursor: Forward only, scroll

Cách quản lý dữ liệu của cursor: static, dynamic, keyset

• Sử dụng lệnh OPEN để mở ra cursor đã định nghĩa trước đó

• Đọc và xử lý trên từng dòng dữ liệu bên trong cursor Sử dụng biến @@Fetch_status

Các lệnh Fetch và cấu trúc while

• Đóng cursor lại bằng lệnh CLOSE và DEALLOCATE

Sau khi close, có thể mở lại

Deallocate: hủy cursor khỏi bộ nhớ

Page 24: Bài 5 : Lập trình với CSDL trong SQL

24 24

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Cú pháp Declare DECLARE Tên_cursor CURSOR

[LOCAL | GLOBAL]

[FORWARD_ONLY | SCROLL]

[STATIC | DYNAMIC | KEYSET]

[READ_ONLY | SCROLL_LOCK]

FOR Câu_lệnh_SELECT [FOR UPDATE [OF Danh_sách_cột_cập_nhật]]

DECLARE cur_Vattu CURSOR

DYNAMIC

FOR

SELECT * FROM VATTU

Page 25: Bài 5 : Lập trình với CSDL trong SQL

25 25

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Cú pháp Open

OPEN Tên_cursor

DECLARE cur_Vattu CURSOR

DYNAMIC

FOR

SELECT * FROM VATTU

OPEN cur_Vattu

Page 26: Bài 5 : Lập trình với CSDL trong SQL

26 26

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Cú pháp FETCH

FETCH [NEXT | PRIOR | FIRST | LAST

| ABSOLUTE n | RELATIVE n]

FROM Tên_cursor

[INTO Danh_sách_biến]

Absolute n: Đọc dòng thứ n trong cursor

Relative n: Đọc dòng thứ n kể từ vị trí hiện hành

Page 27: Bài 5 : Lập trình với CSDL trong SQL

27 27

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Ví dụ hoàn chỉnh --1. Khai báo biến cursor DECLARE cur_Vattu CURSOR KEYSET

FOR SELECT * FROM VATTU

WHERE MAVTU LIKE 'TV%'

ORDER BY MAVTU

--2. Mở cursor OPEN cur_Vattu

--3. Đọc dữ liệu

FETCH NEXT FROM cur_Vattu

WHILE @@FETCH_STATUS = 0

BEGIN

-- Xử lý dòng mới vừa đọc được

-- Thực hiện đọc tiếp các dòng kế

FETCH NEXT FROM cur_Vattu

END

--4. Đóng cursor CLOSE cur_Vattu

DEALLOCATE cur_Vattu

Page 28: Bài 5 : Lập trình với CSDL trong SQL

28 28

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Các hàm th ng dùng

Page 29: Bài 5 : Lập trình với CSDL trong SQL

29 29

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Các hàm chuyển đổi kiểu d liệu Một hàm của SQL Server có thể sử dụng ở bất cứ đâu thay

cho một giá trị cụ thể

• Đổi một số thành chuỗi STR (Số_thực, Số_ký_tự [, Số_lẻ])

• Đổi kiểu dữ liệu CAST (Biểu_thức AS Kiểu_dữ_liệu)

• Đổi kiểu dữ liệu và định dạng CONVERT (Kiểu_dữ_liệu, Biểu_thức [, Định_dạng])

Page 30: Bài 5 : Lập trình với CSDL trong SQL

30 30

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Một số đ nh d ng chuỗi ngày thông dụng

yy yyyy Chuỗi kết quả

- 0 hoặc 100 mon dd yyyy hh:miAM (or PM)

1 101 mm/dd/yyyy

2 102 yy.mm.dd

3 103 dd/mm/yy

5 105 dd-mm-yy

6 106 dd mon yy

8 108 hh:mm:ss

9 109 mon dd yyyy hh:mi:ss:mmmAM (or PM)

10 110 mm-dd-yy

11 111 yy/mm/dd 12 112 yymmdd …

Print convert(nvarchar(50), getdate(), 5) 23-05-09

Print convert(nvarchar(50), getdate(), 105) 23-05-2009

Page 31: Bài 5 : Lập trình với CSDL trong SQL

31 31

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Các hàm ngày gi • Cộng ngày

DATEADD (Đơn_vị, Con_số, Ngày_chỉ_định) • So sánh hai biến ngày

DATEDIFF (Đơn_vị, Ngày1, Ngày2) • Lấy tên ngày, tháng, năm

DATENAME (Đơn_vị, Ngày) • Thời điểm hiện hành

GETDATE()

• Lấy một thành phần ngày, giờ trong biến ngày

DATEPART (Đơn_vị, Ngày) • Lấy ngày, tháng, năm của biến ngày

DAY (Ngày)

MONTH (Ngày)

YEAR (Ngày)

Page 32: Bài 5 : Lập trình với CSDL trong SQL

32 32

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Đơn_v (Thành phần của ngày) Ch viết tắt

year yy, yyyy

quarter qq, q

month mm, m

dayofyear dy, y

day dd, d

week wk, ww

weekday dw

hour hh

minute mi, n

second ss, s

millisecond ms

Page 33: Bài 5 : Lập trình với CSDL trong SQL

33 33

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Các hàm toán h c • Lấy trị tuyệt đối

ABS (Biểu_thức_số) • Hằng số Pi

PI()

• Luỹ thừa

POWER (Biểu_thức_số, Số_mũ) • Lấy số ngẫu nhiên

RAND ([Số_nguồn]) • Làm tròn số

ROUND (Biểu_thức_số, Vtrí_làm_tròn) • Dấu của kết quả biểu thức : SIGN (Biểu_thức_số) • Lấy căn bậc 2 : SQRT (Biểu_thức_số)

Page 34: Bài 5 : Lập trình với CSDL trong SQL

34 34

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Các hàm xử lý chuỗi • Hàm viết hoa, th ng

UPPER (Chuỗi), LOWER (Chuỗi) • Hàm cắt chuỗi

LEFT (Chuỗi nguồn, Số_ktự), RIGHT (Chuỗi nguồn, Số_ktự) SUBSTRING (Chuỗi nguồn,Vị_trí,Số_ktự)

• Hàm cắt khoảng trắng, t o chuỗi khoảng trắng

LTRIM (Chuỗi), RTRIM (Chuỗi), SPACE (N) • Hàm t o chuỗi lặp

REPLICATE (Chuỗi_lặp, N) • Chiều dài chuỗi

LEN (Chuỗi) • Đảo chuỗi

REVERSE (Chuỗi) • Tìm và thay thế chuỗi

REPLACE (Chuỗi nguồn, Chuỗi_tìm, Chuỗi_thay_thế) • Đổi từ số thành ký t và ng ợc l i

CHAR (Số) , ASCII(Ký_tự)

Page 35: Bài 5 : Lập trình với CSDL trong SQL

35 35

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Xử lý lỗi

Page 36: Bài 5 : Lập trình với CSDL trong SQL

36 36

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Khối lệnh TRY…CATCH • Ý nghĩa : Thực hiện các lệnh trong khối TRY, nếu gặp lỗi sẽ chuyển

qua xử lý bằng các lệnh trong khối CATCH

• Cú pháp : BEGIN TRY

{ các câu lệnh }

END TRY

BEGIN CATCH

{ các câu lệnh}

END CATCH

• Các điểm cần lưu ý :

• TRY và CATCH phải cùng lô xử lý

• Sau khối TRY phải là khối CATCH

• Có thể lồng nhiều cấp

Page 37: Bài 5 : Lập trình với CSDL trong SQL

37 37

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Khối lệnh TRY…CATCH

Ví dụ :

BEGIN TRY

SELECT * FROM BangKhongTonTai;

END TRY

BEGIN CATCH

SELECT

ERROR_NUMBER() as ErrorNumber,

ERROR_MESSAGE() as ErrorMessage;

END CATCH

Page 38: Bài 5 : Lập trình với CSDL trong SQL

38 38

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Một số hàm ERROR th ng dùng

ERROR_NUMBER() : Trả về mã số của lỗi

ERROR_MESSAGE() Trả về chuỗi lỗi

ERROR_SEVERITY() returns the error severity.

ERROR_STATE() returns the error state number.

ERROR_LINE() : Trả về dòng gây ra lỗi

ERROR_PROCEDURE() Trả về tên thủ tục/ trigger gây ra lỗi

Page 39: Bài 5 : Lập trình với CSDL trong SQL

39 39

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Thủ tục RAISERROR

• Ý nghĩa : Trả thông báo lỗi về cho ứng dụng

• Cú pháp :

• Raiserror(tbao_loi, muc_do, trang_thai [, cac_tham_so] )

Trong đó:

tbao_loi : - mã thông báo lỗi do người dùng định nghĩa trước bằng sp_addmessage và được lưu trong sys.messages. Giá trị phải lớn hơn 50000.

- chuỗi thông báo lỗi bất kỳ.

muc_do : Số có giá trị từ 025 thể hiện mức độ nghiêm trọng của lỗi.

trang_thai : Số từ 1-127 để xác định vị trí lỗi khi sử dụng cùng một tbao_loi tại nhiều điểm khác nhau

cac_tham_so : Hỗ trợ cho các tbao_loi cần tham số

Page 40: Bài 5 : Lập trình với CSDL trong SQL

40 40

TR NG Đ I H C KHOA H C T NHIÊN TP.HCM

TRUNG TÂM TIN H C

Ví dụ sử dụng RAISERROR …

IF @nPhanTram NOT BETWEEN 0 AND 100

BEGIN

SET @sErrMsg = N‘Tỉ lệ phầm trăm phải nằm trong đoạn [0,100]’

RAISERROR(@sErrMsg, 16, 1)

RETURN

END

Msg 50000, Level 16, State 1, Line 6

Tỉ lệ phầm trăm phải nằm trong đoạn [0,100]