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

Post on 16-Apr-2017

22.681 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1 1

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

TRUNG TÂM TIN H C

SQL Server

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

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ộ

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

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

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

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

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

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 @@

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.

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ử

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ư.

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'

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.

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)

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

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 ]

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'

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 ]

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

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

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)

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ớ

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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ố

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]

top related