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

Lập trình SQL

82 1,5K 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

Tiêu đề Lập trình SQL
Trường học Trường Đại Học Công Nghệ Thông Tin - ĐHQG HCM
Chuyên ngành Lập trình Cơ Sở Dữ Liệu
Thể loại Giáo trình
Năm xuất bản 2023
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 82
Dung lượng 1,16 MB

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

Nội dung

Batch và script4  Lỗi biên dịch compile error ngăn không cho biên dịch bảng thực thi, vì vậy không có lệnh nào trong batch được thực thi..  Nếu batch được biên dịch, và lệnh thứ hai b

Trang 1

Lập Trình SQL

Trang 3

Batch và script

3

Batch là một tập hợp các lệnh tạo thành một nhóm và được gửi đi dưới dạng 1 nhóm lệnh thực thi

 SQL Server biên dịch các lệnh của 1

batch thành 1 đơn vị thực thi đơn gọi là bảng thực thi (Execution plan) Các lệnh trong bảng thực thi được thực thi cùng lúc.

Trang 4

Batch và script

4

 Lỗi biên dịch ( compile error) ngăn không cho biên dịch bảng thực thi, vì vậy không có lệnh nào trong batch được thực thi.

 Lỗi thực thi ( run-time error) g ây ra 1 trong 2 ảnh hưởng sau:

 Hầu hết các lỗi thực thi đều dừng lệnh đang chạy

và các lệnh tiếp sau nó trong batch.

 Một vài lỗi thực thi như vi phạm ràng buộc, chỉ làm dừng lệnh hiện hành Tất cả các lệnh còn lại trong batch vẫn được thực thi.

Trang 5

Batch và script

5

 Giả sử có 10 lệnh trong 1 batch

 Nếu lệnh thứ 5 có lỗi cú pháp, không 1 lệnh nào trong batch được thực thi

 Nếu batch được biên dịch, và lệnh thứ hai bị lỗi trong lúc thực thi, kết quả của lệnh đầu tiên không bị ảnh hưởng vì đã thực thi rồi

Trang 6

Một số quy định khi sử dụng batch

6

1 Các lệnh CREATE DEFAULT, CREATE PROCEDURE,

CREATE RULE, CREATE TRIGGER, và CREATE VIEW

không thể được dùng chung cùng với các lệnh khác trong

cùng 1 batch Lệnh CREATE nên bắt đầu 1batch, cac lệnh khác tiếp theo trong batch sẽ đuợc thông dịch như phần bổ sung vào định nghĩa của lệnh CREATE

2 Một bảng không thể vừa được thay đổi (alter) rồi ngay sau đó

các cột mới đuợc sử dụng ngay trong cùng 1 batch.

3 Nếu lệnh EXECUTE là lệnh đầu tiên trong 1 batch, từ khóa

EXECUTE không bắt buộc Từ khóa này bắt buộc phải dùng khi nó không phải là lệnh đầu tiên trong 1 batch

Trang 7

Đinh nghi a Batch ̣ ̃

7

Có nhiều cách để tạo một batch:

 Tất cả các lệnh SQL được gửi đến từ 1 ứng dụng được xem như 1 batch

 Tất cả các lệnh trong 1 thủ tục hay trigger được xem như 1 batch

 Một chuỗi được thực thi bởi lệnh EXECUTE là 1 batch

 Một chuỗi được thực thi bởi thủ tục hệ thống

sp_executesql là 1 batch

Mỗi batch sẽ được biên dịch thành 1 kế hoạch thực thi đơn (single execution plan)

Trang 8

 Các biến cục bộ ( local variable ) chỉ có tác

dụng trong phạm vi của batch tạo ra nó  không thể tham chiếu các biến này sau khi kết thúc 1 batch

Trang 9

Vi du vê batch ́ ̣ ̀

9

USE pubs

GO

DECLARE @MyMsg VARCHAR(50)

SELECT @MyMsg = 'Hello, World.'

GO Biến @MyMsg không còn hợp lệ sau lệnh

Trang 11

Các h n ch c a Script ạ ế ủ

11

 Các lệnh CREATE DEFAULT, CREATE RULE, CREATE VIEW, CREATE PROCEDURE, and CREATE TRIGGER phải được đặt trong 1 batch riêng chỉ chứa riêng các lệnh đó, không thể kết hợp với các lệnh khác được

Trang 12

 Lệnh gắn kết (bind) các rule và default vào

các cột trong bảng không được để cùng batch với các lệnh sửa đổi dữ liệu trên các cột đó

 Lệnh tạo và sử dụng các ràng buộc check

không thể đặt trong cùng 1 batch

 Lệnh thay đổi các cột trong bảng (alter Table) không thể đặt cùng batch với các lệnh tham chiếu đến các cột vừa sửa

Trang 13

Bi n - Variable ế

13

 Trong Transact SQL, có 2 loại biến:

 Biến cục bộ (Local variable hay user-defined variables) : là các biến được khai báo bên trong 1 batch và sẽ bị xoá khi batch kết thúc

 Bi ến toàn cục ( Global variables) l à các biến được khai báo và gán giá trị bởi chính

server Biến toàn cục luôn bắt đầu bằng

@@.

Trang 14

Global variables

14

Trang 15

 Cách khai báo biến:

DECLARE @variable_name data_type

 Để gán giá trị vào biến: dùng lệnh SET hoặc SELECT

Trang 16

Bi n ng ế ườ i dùng

User defined Variables

16

thông báo của người dùng hoặc nội dung của biến ra màn hình

 Ví dụ

USE Northwind

GO

DECLARE @MyObject NVARCHAR(128)

SET @MyObject = 'Products'

PRINT 'Object Name: ' + @MyObject

PRINT ' Object ID: ' + STR(123456)

Trang 17

L p trình trong SQL Server ậ

17

 Các lệnh điều khiển (Control-of-Flow) dùng để điều khiển thứ tự thực hiện các lệnh trong batch, stored procedure, trigger và transaction

 Lệnh IF…ELSE

 Lệnh CASE

 Lệnh WHILE

Trang 18

L nh IF…ELSE

18

điều kiện các lệnh của SQL.

IF boolean_expression {sql_statement | statement_block} [ELSE boolean_expression

{sql_statement | statement_block}]

Trang 19

Kh i l nh BEGIN…END ố ệ

19

nhóm lệnh đó bên trong khối lệnh BEGIN và END

BEGIN

{sql_statement | statement_ block}

END

Trang 20

Ví d 1

20

Điểm thi (test score) tối thiểu để được mời phỏng vấn cho các ứng viên nội bộ (internal candidate) là 80 Hãy viết 1 batch hiển thị câu thông báo “Được mời phỏng vấn” ( “Called for interview” ) cùng với điểm thi nếu điểm thi cao hơn 80, ngược lại hiển thị thông báo “Bị loại – Không được mời phỏng vấn”(“Rejected

- Not called for interview”) cho nhân viên có

mã là 000008.

Trang 21

Ví d 1 ụ

21

DECLARE @iTest int

SELECT @iTest = siTestScore

END

Trang 22

Ví d 2 ụ

22

Phí phần phăm (siPercentageCharge) đối với các nhà tuyển dụng theo hợp đồng phải tăng thêm 5% nếu phí trung bình ít hơn 20% và phải tăng thêm 3% trong

trường hợp ngược lại.

IF (SELECT AVG(siPercentageCharge)

FROM ContractRecruiter) < 20 BEGIN

UPDATE ContractRecruiter SET siPercentageCharge = siPercentagecharge + 5 END

ELSE

BEGIN

UPDATE ContractRecruiter SET siPercentageCharge = siPercentagecharge + 3 END

Trang 23

 Lệnh CASE có 2 dạng như sau:

 Dạng đơn giản: lệnh sẽ so sánh 1 biểu thức

input_expression với 1 bộ các biểu thức đơn giản

để chọn ra nhánh cần thực hiện.

 Dạng dò tìm: lệnh sẽ đánh giá 1 bộ các biểu thức điều kiện để chọn nhánh cần thực hiện

Trang 24

Searched CASE function:

Trang 25

Ví d l nh case d ng đ n gi n ụ ệ ạ ơ ả

25

USE pubs

GO SELECT Category = CASE type WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking'

WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Traditional Cooking' ELSE 'Not yet categorized'

END, CAST(title AS varchar(25)) AS 'Shortened Title', price AS Price

FROM titles WHERE price IS NOT NULL ORDER BY type, price COMPUTE AVG(price) BY type

GO

Trang 26

Ví d l nh case d ng dò tìm ụ ệ ạ

26

USE pubs

GO

SELECT 'Price Category' = CASE

WHEN price IS NULL THEN 'Not yet priced'

WHEN price < 10 THEN 'Very Reasonable Title' WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'

ELSE 'Expensive book!'

END,

CAST(title AS varchar(20)) AS 'Shortened Title' FROM titles ORDER BY price

GO

Trang 27

L nh WHILE ệ

27

 Lệnh WHILE có thể được dùng trong batch,

stored procedure, trigger, hay cursor để cho phép

1 khối lệnh T-SQL được thực hiện lặp lại chừng nào mà điều kiện vẫn còn TRUE

 Cú pháp

WHILE boolean_expression {sql_statement | statement_block}

[BREAK]

{sql_statement | statement_block}

[CONTINUE]

Trang 29

BREAK END

IF @count=6 BEGIN

CONTINUE END

PRINT @count END

???

Trang 30

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

ELSE

CONTINUE END

PRINT 'Too much for the market to bear'

Trang 31

 Ví dụ:

Aa: print ‘ Successful’

…….

Goto Aa

Trang 33

L nh Execution ệ

33

 EXEC[UTE] được dùng để thực thi

Thực thi 1 chuỗi lệnh

Thực thi 1 thủ tục

Trang 34

Lênh Execute th c thi 1 ̣ ự

chuô ĩ

 Cú pháp:

EXEC [ UTE ]

( { @string_variable | [ N ] 'tsql_string' } [ + n ] )

 Sử dụng toán tử + để tạo các chuỗi dài Mỗi

chuỗi có thể chứa cả loại Unicode và Unicode

Trang 35

L nh Execution th c thi 1 thu tuc ệ ự ̉ ̣

Trang 38

Stored procedures

38

 Một thủ tục tạm thời cục bộ ( local temporary

stored procedure) có tên bắt đầu với ký hiệu # và chỉ có tác dụng trong phiên làm việc của người dùng

 Một thủ tục tạm thời toàn cục (global temporary stored procedure) có tên bắt đầu với biểu tượng

## và thủ tục có tác dụng cho tất cả phiên làm việc của ngươì dùng

Trang 39

Stored procedures

39

 Thủ tục chứa các lệnh T-SQL để thực thi 1 nhiệm

vụ (task) Thủ tục được thiết kế, mã hóa, kiểm tra

và biên dịch thành mã thực thi (single execution plan) đăt ngay server Các ứng dụng (application) khi cần thực thi nhiệm vụ, chỉ cần gọi thủ tục

Server sẽ chạy execution plan và trả kết quả về lại client

 Thực thi nhanh hơn

 Giảm lưu lượng mạng (network traffic)

Trang 40

 Cho phép thực thi nhanh hơn: thủ tục được kiểm tra lỗi và tối

ưu khi chúng được tạo và được biên dịch thành 1 execution plan ở lần chạy đầu tiên Các lần sau đó khi client có yêu cầu chạy thủ tục thì server sẽ chạy từ execution plan đã biên dịch sẵn.

 Có thể giảm lưu lượng mạng: để thực thi 1 tác vụ, thay vì phải gửi có lúc lên đến hàng trăm lệnh về server, chỉ cần dùng 1 lệnh gọi thủ tục là đủ

 Có thể đuợc dùng như cơ chế bảo mật: người dùng được cấp quyền để chạy thủ tục thậm chí ngay cả khi họ không có

quyền thực thi từng lệnh đơn lẻ trong thủ tục.

Trang 41

Stored procedure

41

 Khi 1 thủ tục được tạo ra, tên thủ tục được viết vào bảng hệ thống sysobjects, nội dung của thủ tục thì được lưu trong bảng hệ thống

syscomments

 Thủ tục khi chạy lần đầu hay được biên dịch lại

sẽ theo 3 bước sau:

 Resolution

 Optimization

 Compilation

Trang 42

Th c thi l n đ u ự ầ ầ

42

 Resolution — Công cụ xử lý truy vấn (query processor) đọc và kiểm tra lỗi chính tả của thủ tục

 Optimization — Công cụ tối ưu hoá truy vấn phát triển một execution plan cho các lệnh trong thủ tục

 Compilation — trong quá trình biên dịch, thủ tục được phân tích và execution plan được tạo ra Execution plan được nạp vào bộ nhớ ( procedure cache)

SQL Server 2000 có 1 vùng bộ nhớ được dùng

để lưu trữ cả execution plan và vùng đệm dữ liệu

Trang 43

Object có thể là stored procedure, trigger, table

 Dùng lệnh tạo thủ tục (CREATE PROCEDURE) với tùy chọn WITH RECOMPILE để quy định SQL Server không cần lưu vào bộ nhớ execution plan của thủ tục này, mà thủ tục cần được biên dịch lại mỗi lần thủ tục được gọi

 Dùng lệnh EXECUTE với tuỳ chọn WITH RECOMPILE để gọi

1 thủ tục

Trang 44

M t s hu ng d n khi t o và s d ng ộ ố ớ ẫ ạ ử ụ

th t c ủ ụ

44

 Mỗi thủ tục chỉ nên hoàn thành 1 nhiệm vụ

 Lệnh tạo thủ tục (CREATE PROCEDURE) không thể chứa các lệnh CREATE VIEW, CREATE

DEFAULT, CREATE PROCEDURE, CREATE

RULE, hay CREATE TRIGGER

 Các lệnh CREATE TABLE và CREATE INDEX có thể được tạo và tham chiếu ngay trong cùng 1 thủ tục

Trang 45

 Các bảng tạm (Temporary table) có thể được tạo

ra bên trong thủ tục và được tự động xoá khi thủ tục kết thúc

 Có thể tham chiếu đến các đối tượng từ các CSDL khác và server từ xa

 Cho phép các thủ tục đệ quy (recursive) – thủ tục

có thể gọi chính nó

Trang 49

Tham s - Parameters ố

49

Tham số là nơi mà thủ tục dùng để nhận giá trị của người dùng mỗi khi thủ tục được thực thi

 Hai loại tham số:

Tham sốvào (Input parameter)

Tham số ra (Output parameter)

 Có thể có tới 2100 tham số được dùng trong thủ tục

 Tham số vào (Input parameter) để đưa giá trị vào thủ tục.

 Tham số ra (Output parameter) dùng để đưa giá trị ra khỏi thủ tục

 Mỗi thủ tục trả về 1 mã số nguyên (integer return code) cho người gọi Mặc định mã trả về là 0

Trang 50

Th t c vào - Input parameters ủ ụ

50

 Cú pháp

@parameter_name data_type [=default]

Có thể dùng tham số mặc định để đưa giá trị vào thủ tục trong trường hợp không có giá trị nào được đưa vào khi gọi thủ tục.

Giá trị mặc định phải là hằng hay NULL

 Ví dụ:

CREATE PROC prcMultiplyNumber(

@Number1 int, @Number2 int=5) AS

PRINT @Number1*@Number2

Trang 53

@Description char(30) OUTPUT,

@budget int OUTPUT,

@CurrentStrength int OUTPUT

AS

BEGIN

IF EXISTS(SELECT * FROM Position WHERE cPositionCode =@PCode)

Trang 54

FROM Position WHERE cPositionCode=@Pcode RETURN 0

END

ELSE

RETURN 1 END

Trang 55

DECLARE @Description char(30)

DECLARE @budget int

DECLARE @CurrentStrength int

DECLARE @ReturnValue int

EXEC @ReturnValue = prcGetPositionDetail @Pcode,

PRINT ‘Chức danh: ‘ + @Description

PRINT ‘Số nhân viên theo ngân sách: ' +

CONVERT( char(30),@budget)

PRINT ‘Số nhân viên hiện tại : ' + CONVERT (char(30),

@CurrentStrength)

Trang 56

Ví dụ

56

SELECT cRequisitionCode,vRegion,

iNoOfVacancy FROM Requisition

Trang 57

D liêu tra vê (return data) ư ̃ ̣ ̉ ̀

 Dữ liệu trả về từ 1 thủ tục theo 1 trong 4 cách

sau:

1. Tham số ra (Output parameters)

2. Mã trả về (Return codes) luôn luôn là 1 số

nguyên

3. Một bộ kết quả (result set) cho mỗi một

lệnh SELECT bên trong thủ tục

4. Một cursor toàn cục (global cursor) mà

cursor này có thể được tham chiếu đến từ bên ngoài thủ tục

57

Trang 58

Qu n lý l i - Error handling ả ỗ

58

 Các lỗi trong thủ tục thường được quản lý bằng cách hoặc dùng giá trị trả về (return values) hoặc dùng lệnh RAISERROR

 Giá trị trả về là 1 số nguyên khi lệnh RETURN

được thực thi

Trang 59

Ví d cách dùng return ụ

59

CREATE PROC Check_Customer

@custid char(6) = NULL

Trang 60

Ví d cách dùng return ụ

60

DECLARE @getres int

EXEC @getres = Check_Customer

Trang 61

Vi du 2: thu tuc v i nhiê u ca ch tra vê ́ ̣ ̉ ̣ ơ ́ ̀ ́ ̉ ̀ gia tri ́ ̣

Ord.EmployeeID ORDER BY Ord.EmployeeID

SELECT @MaxQuantity = MAX(Quantity) FROM [Order

Details]

RETURN (SELECT SUM(Quantity) FROM [Order Details])

61

Trang 62

Vi du 2: thu tuc v i nhiê u ca ch tra vê ́ ̣ ̉ ̣ ơ ́ ̀ ́ ̉ ̀ gia tri ́ ̣

 Kiểm tra thủ tục bằng script sau:

DECLARE @OrderSum INT

DECLARE @LargestOrder INT

EXEC @OrderSum = OrderSummary @MaxQuantity =

Trang 63

Vi du 2: thu tuc v i nhiê u ca ch tra vê ́ ̣ ̉ ̣ ơ ́ ̀ ́ ̉ ̀ gia tri ́ ̣

 Kết quả khi chạy script kiểm tra:

The size of the largest single order was: 130

The sum of the quantities ordered was: 51317

63

Trang 66

L ệ nh xoá th t c ủ ụ

66

 Được dùng để xoá thủ tục khỏi database

 Cú pháp

DROP PROCEDURE proc_name

 Không thể khôi phục 1 thủ tục ngay khi nó bị xoá

Trang 67

L nh RAISERROR ệ

67

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

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

 Hoặc được tạo ra bằng lệnh RAISERROR

 RAISERROR có thể khôi phục bất kỳ thông báo hệ thông

nào đang được lưu trữ trong bảng hệ thống sysmessages,

hay có thể là thông báo của người dùng

 Mỗi thông báo chứa:

 Số thông báo hệ thống: mỗi thông báo đều có 1 số xác định duy

nhất (msg_id).

 Mức độ nghiêm trọng (severity level): cho biết mức độ lỗi xảy ra.

 Số trạng thái lỗi: dùng đẻ chỉ nguồn mà từ đó lỗi được tạo ra

 Và cuối cùng là thông báo chỉ ra lỗi và đôi khi chỉ ra cách khắc phục lỗi

Trang 68

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 tao 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, số thông

báo 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 ra các thông báo lỗi mức 19 đến 25

Trang 69

 RAISERROR được ghi nhận lại trong các nhật ký lỗi

(error log) của SQL Server 2000 và Microsoft Windows

 Chuỗi thông báo (message string) 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

Trang 71

Các tham sô cua msg_str ́ ̉

71

 msg_str: là 1 thông báo đặc biệt với định dạng tương

tự như lệnh printf của C Thông báo lỗi có thể chứa tối đa 400 ký tự, nếu dài hơn thi chỉ có 397 ký tự đầu tiên được hiển thị , các ký tự còn lại được ký hiệu

thành dấu chấm lửng

% [[flag] [width] [precision] [{h | l}]] type

Trang 72

Các tham số của msg_str

{h | l} type: được dùng với các loại ký tự d, i, o, x, X,

or u, và tạo các giá trị số nguyên ngắn (short int h) hay

số nguyên dài (long int l).

type Biểu diễn

d hay i Số nguyên có dấu

o Số bát phân không dấu

u Số nguyên không dấu

x hay X Số thập lục phân (hexadecimal)

không dấu

72

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

Xem thêm

TỪ KHÓA LIÊN QUAN

w