Views virtual tables trong SQL • View: là một bảng đơn được tạo ra từ các bảng cơ sở hoặc từ các view được tạo trước – View không tồn tại vật lý vì vậy view còn gọi là bảng ảo.. Views v
Trang 1Chương 9
Views & Lập trình trong SQL
1
Trang 2Views (virtual tables) trong SQL
• View: là một bảng đơn được tạo ra từ các
bảng cơ sở hoặc từ các view được tạo trước – View không tồn tại vật lý vì vậy view còn gọi là bảng ảo
– Đơn giản hoá việc truy cập dữ liệu
– Chọn dữ liệu cần thiết ứng với mổi user, đảm bảo
an toàn dữ liệu
– Dùng để Import và export
– View là một đối tượng của CSDL
Trang 3Views (virtual tables) trong SQL
• Cú pháp tạo view:
Ví dụ:
CREATE VIEW view_name [(column[ , n ])]
AS select_statement [ WITH CHECK OPTION ]
CREATE VIEW WORKS_ON1
AS SELECT FNAME, LNAME, PNAME, HOURS
FROM EMPLOYEE, PROJECT, WORKS_ON
WHERE SSN=ESSN AND PNO=PNUMBER;
Trang 4Views (virtual tables) trong SQL
Ví dụ:
CREATE VIEW DEPTJNFO
(DEPT_NAME,NO_OF_EMPS,TOTAL_SAL)
AS SELECT DNAME, COUNT (*), SUM (SALARY)
FROM DEPARTMENT, EMPLOYEE
WHERE DNUMBER=DNO
GROUP BY DNAME;
Trang 5Views (virtual tables) trong SQL
Ví dụ:
CREATE TABLE WORKS_ON_NEW AS
SELECT FNAME, LNAME, PNAME, HOURS
FROM EMPLOYEE, PROJECT, WORKS_ON WHERE SSN=ESSN AND PNO=PNUMBER
GROUP BY PNAME;
Trang 6Views (virtual tables) trong SQL
• Câu lệnh select trong view không được
chứa:
– Mệnh đề ORDER BY
– Mệnh đề COMPUTE VÀ COMPUTE BY
– Các bảng tạm không được tham chiếu trong
view không dùng select Into trong view
– Các trigger và chỉ mục không được tạo ra trên
view
6
Trang 7Views (virtual tables) trong SQL
Trang 9Lập trình trong SQL
• Kiểu dữ liệu: Có 2 loại
– Kiểu dữ liệu của hệ thống (System - supplied data type)
– Kiểu dữ liệu do người dùng định nghĩa (User- defined data type)
• Reference to object:
Server.database.owner.object
Trang 10Biến
• Biến cục bộ (Local variable)
– Cú pháp khai báo:
– Ví dụ: DECLARE @EmpIDVar int
DECLARE@ VariableName var_type
Trang 11Biến
– Gán giá trị cho biến: Khi một biến được khai báo thì
giá trị của nó là Null
– Ví dụ 1:
DECLARE @temp_name varchar(20)
SELECT @temp_name = companyname
FROM customers
WHERE customerid = ‘adsff’
SET @VariableName = expression
or
SELECT{@VariableName=expression} [,…n]
Trang 12Biến
– Ví dụ 2:
DECLARE @temp_city varchar(10) SET @temp_city = ‘london’
SELECT * FROM Customers
WHERE city = @temp_city
Trang 14– Không gán giá trị cho biến toàn cục
– Biến toàn cục không có kiểu
– Tên biến được bắt đầu với @@
Trang 15Biến
• Một số biến toàn cục thông dụng
– @@SERVERNAME: trả về tên của server
– @@ROWCOUNT: số dòng chịu tác dụng của câu lệnh cuối cùng
– @@ERROR: trả về chỉ số index của lỗi
– @@IDENTITY: trả về định danh
Trang 16return end
Trang 18Cách thực thi câu lệnh SQL
• Batches: là một tập các câu lệnh SQL gửi đến
server và được thực thi tại cùng một thời điểm
– Nếu một câu lệnh trong batch bị lỗi thì SQL server
sẽ không thực thi tất cả những câu lệnh trong batches
– Mỗi batch không thể chứa tất cả những câu lệnh sau: CREATE PROCEDURE, CREATE TRIGGER, CREATE VIEW, CREATE RULE, CREATE DEFAULT
Trang 21Cách thực thi câu lệnh SQL
• Cấu trúc của Transaction:
BEGIN TRANSACTION [<transaction_name>]
[WITH MARK <description>]…
Trang 22VALUES(‘BU1122’,’Teach Yourself SQL’,’business’,
‘9988’, $35.00, $1000,10,4501,’a great book’) SELECT *from titleauthor
COMMIT TRAN
Trang 24Cấu trúc điều khiển
Trang 25Cấu trúc điều khiển
• BEGIN …END
BEGIN
{sql_statement | statement_ block}
END
Trang 26Cấu trúc điều khiển
• Ví dụ:
IF ( SELECT COUNT(*) FROM authors
WHERE contract =0) >0
BEGIN PRINT 'These authors do not have contracts on file: ' SELECT au_lname, au_fname, au_id
FROM authors WHERE contract=0 END
ELSE
BEGIN PRINT 'All authors have contracts on file.' END
Trang 27Cấu trúc điều khiển
Trang 28Cấu trúc điều khiển
END
Trang 29Cấu trúc điều khiển
END
PRINT 'Too much for the market to bear'
Trang 30Cấu trúc điều khiển
Trang 31Cấu trúc điều khiển
Trang 32Cấu trúc điều khiển
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
Trang 33Cấu trúc điều khiển
0.1 END
FROM [Order Details]
ORDER BY Quantity, ProductId
Trang 34Cấu trúc điều khiển
integer_expression : return value
WAITFOR { DELAY 'time' | TIME 'time' }
Trang 35Cấu trúc điều khiển
Ví dụ:
BEGIN
WAITFOR TIME '22:20' EXECUTE update_all_stats END
Trang 36Cấu trúc điều khiển
• RAISERROR
RAISERROR ({msg_id | msg_str} { , severity , state }
[ , argument [ , n ] ] )
[ WITH option [ , n ] ]
Trang 37Thủ tục (Stored Procedures)
và Hàm (Function)
Trang 38– Stored procedures có thể được tạo trong CSDL và tái sử dụng
– Thủ tục nhận tham số đầu vào và trả về một kết quả
Trang 39Loại Stored procedures
• System SP (sp): được lưu trữ trong CSDL Master,
nhưng có thể thực thi ở bất kỳ CSDL nào
– sp_helptext: In nội dung của rule, a default, an
unencrypted stored procedure, user-defined function, trigger, computed column, or view
Trang 40Loại Stored procedures
Extended SP (xp): được tạo từ ngôn ngữ khác
(C++, ) và được sử dụng như một thủ tục của SQL Server
User_defined :
‒Local sp: là đối tượng trong CSDL dùng để
thực thi các tác vụ, có thể tạo trong CSDL master
‒Temporary sp: local (tên bắt đầu với #) và
global (tên bắt đầu với ##)
Trang 41Tạo stored procedures
• Cú pháp:
CREATE PROC [EDURE ] procedure_name
[ ; number ] [ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ] ] [, n ]
[ WITH { RECOMPILE | ENCRYPTION |
RECOMPILE, ENCRYPTION } ]
[FOR REPLICATION ]
AS sql_statement [ n ]
Trang 42Tạo stored procedures
FROM Orders AS Ord JOIN [Order Details] AS OrDet ON (Ord.OrderID = OrDet.OrderID)
GROUP BY Ord.EmployeeID
Trang 43Thực thi stored Procedures
• Execute : Dùng để thực thi
– User-defined function
– System procedure
– User-defined stored procedure,
– Extended stored procedure
Trang 44Thực thi stored Procedures
Trang 45Thực thi stored Procedures
Trang 46Hiệu chỉnh stored Procedures
Trang 47Hiệu chỉnh stored Procedures
FROM dbo.orders
WHERE RequiredDate<GETDATE()and shippeddate is null
ORDER BY RequiredDate
Trang 48Xóa stored Procedures
• Cú pháp:
DROP PROC owner.stored_procedure_name
Trang 49Tham số trong stored Procedures
• Input parameter:
CREATE PROCEDURE procedure_name
[@parameter_name data_type] [=default_value] [WITH option]
AS
sql_statement [ n]
Trang 50Tham số trong stored Procedures
Ví dụ1:
CREATE PROC dbo.MovieByRating
@rating varchar(5) = NULL
AS SELECT rating , title FROM movie
WHERE rating = @rating ORDER BY title
Trang 51Tham số trong stored Procedures
Ví dụ 2:
CREATE PROC sp_name
@parameter data_type =value
AS
IF @parameter IS NULL
BEGIN
PRINT ‘Message Line 1’
PRINT ‘Message Line 2’
RETURN END
SELECT statement
GO
51
Trang 52Viết thủ tục có tham số a, b dạng input để giải phương trình bậc nhất ax+b=0
create proc ptbn @a int,@b int
as if(@a=0) print 'Phuong trinh vo nghiem.' else
print 'phuong trinh co nghiem la:‘
+cast(cast(-@b as float)/@a as nvarchar(12))
go
Trang 53Tham số trong stored Procedures
• Output parameter:
CREATE PROCEDURE procedure_name
[@parameter_name data_type] [=default_value]
OUTPUT
[WITH option]
AS
sql_statement [ n]
Trang 54Tham số trong stored Procedures
Ví dụ:
CREATE PROC count_row
@movie_count int OUTPUT
AS
SELECT @movie_count = COUNT(*) FROM Movie
GO
• Sp execution with output parameter: a variable must
be declared to stored the return value of the output parameter
DECLARE @num int
EXEC count_row @num OUTPUT
SELECT @num
Trang 55Quản lý lỗi
• sp_addmessage: Lưu thông báo lỗi mới do
người dùng định nghĩa trong một thể hiện của Database Engine
– Thông báo lỗi có thể được xem bằng sys.messages
• Cú pháp: sp_addmessage [ @msgnum= ] msg_id , [
@severity= ] severity , [ @msgtext= ] 'msg'
[ , [ @lang= ] 'language' ]
[ , [ @with_log= ] { 'TRUE' | 'FALSE' } ]
[ , [ @replace= ] 'replace' ]
Trang 57Quản lý lỗi
Example: Display an error message when delete a customer
CREATE PROC DeleteCust
@cust_num nvarchar(5) = null
AS
IF EXISTS (SELECT customerID FROM Orders
WHERE customerID like @cust_num)
BEGIN
RAISERROR (50001, 10, 1) RETURN
END DELETE FROM Customers WHERE customerID like @cust_num
GO
Trang 59Quản lý lỗi
• @@ERROR và @@ROWCOUNT: sử dụng để
xác nhận tính hợp lệ của câu lệnh UPDATE
– Giá trị của @@ERROR được kiểm tra cho bất kỳ dấu hiệu của một lỗi
– Giá trị của @@ROWCOUNT được sử dụng để chắc chắn lệnh cập nhật thành công vào các dòng trong bảng
Trang 60Hàm (FUNCTION)
• Hàm hệ thống (System function):
aggregate funtion: avg(), count(), count(*),
sum(), max(), min(),
Other function: getdate(), month(), upper(),
user_name(),@@rowcount,
• Hàm do người dùng định nghĩa (User-defined function):
Cho phép định nghĩa một hàm T-SQL mà nó có thể chấp nhận một hoặc nhiều tham số và trả về một giá trị đơn hoặc một bảng giá trị
Trang 61Hàm (FUNCTION)
• Có 3 loại hàm do người dùng định nghĩa:
– Scalar: trả về một giá trị đơn dựa trên giá trị đầu vào
– Multi-statement Table-valued: trả về một tập các dòng
– Inline Table-valued: trả về một tập các dòng
Trang 62Hàm (FUNCTION)
• Scalar function:
CREATE FUNCTION [ owner_name ] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [= default ] } [ , n ] ] )
Trang 63WHERE month(orderdate)= @monthOrd RETURN @Ordnum
END
GO
Trang 66od.ProductID WHERE c.CategoryID= @Categoryid
GROUP BY c CategoryName,p.ProductName)
Trang 67Hàm (FUNCTION)
• Multistatement Table-valuesd
CREATE FUNCTION [owner_name.]function_name
([{@parameter_name [AS] data_type [=default]} [ ,…n ]])
END
Trang 68Ví dụ:
CREATE FUNCTION Contacts(@suppliers bit=0)
RETURNS @Contacts TABLE (ContactName nvarchar(30), Phone nvarchar(24), ContactType nvarchar(15))
Trang 69Hàm (FUNCTION)
• Thực thi:
SELECT * FROM CONTACTS(1) ORDER BY ContactName
Trang 70TRIGGERS-CURSOR
Trang 71Trigger
• Trigger là một loại thủ tục đặc biệt, tự động thực thi khi một sự kiện xãy ra trong database server
• DML triggers: thực thi khi người dùng cố hiệu chỉnh dữ liệu thông qua một sự kiện ngôn ngữ thao tac dữ liệu (DML)
• DML events gồm: các câu lệnh INSERT, UPDATE, or DELETE trên bảng hoặc view
Trang 72{ { FOR | AFTER | INSTEAD OF }
{ [DELETE] [,] [ INSERT ] [, ] [ UPDATE ] }
Trang 73Tạo trigger
– Schema_name: tên của lược đồ chứa trigger
– Table | view: tên bảng hoặc View mà trên đó
trigger thực thi
– WITH ENCRYPTION: mã hóa trigger
– FOR | AFTER | INSTEAD OF: loại trigger
Trang 74Tạo trigger
• AFTER triggers hoặc FOR trigger :
– Thực thi sau khi thực hiện insert/ delete các dòng trong table, gọi là reactive, chỉ tạo trên table
– Khi tạo trigger nếu không chỉ định rõ thì mặc định
là AFTER Trigger
74
Trang 75Tạo trigger
• INSTEAD OF triggers: kiểm tra trứơc khi thực
hiện Insert/Delete, gọi là proactive, tạo trên table và view
– Table1 có trigger1, table2 có trigger2, nếu thao
tác trên table1 có liên quan đến table2 thì trigger2 tự động thực thi, gọi là trigger lồng (Nested Trigger)
Trang 76Thực thi sau khi :
+ xử lý ràng buộc + thực hiện xong hành động I/U/D phát sinh trigger
- Thi hành trước khi:
+ Xử lý ràng buộc + Thay thế hành động phát sinh trigger
- Không xây dựng được trên table có áp dụng cascade delete/ update
Trang 77Tạo trigger
– {[DELETE] [ , ] [INSERT] [ , ] [UPDATE] }: chỉ định thao tác mà khi thực hiện thì trigger tự động thực thi
• Khi Insert mẫu tin mới vào Table thì mẫu tin mới
đó cũng lưu trong table INSERTED
• Khi Delete mẫu tin trong table: Thì các mẫu tin bị
xoá đó được di chuyển sang table DELETED
• Khi Update mẫu tin trong table: thì table đó và
table INSERTED đều chứa mẫu tin có nội dung mới, còn DELETED chứa mẫu tin có nội dung cũ
Trang 78– NOT FOR REPLICATION
• Trigger sẽ không thực hiện khi bảng có liên quan đến kỹ thuật sao chép nhân bản (relication)
• sql_statement: câu lệnh SQL chứa điều kiện và hành
động của triiger
Trang 79Tạo trigger
Ví dụ: tạo một trigger hiển thị số dòng được chèn vào bảng Nhomsach
CREATE TRIGGER Thongbaomautin
ON NHOMSACH FOR INSERT
Trang 83Ví dụ:
CREATE TRIGGER Trg_NgayLap_NgayGiaoHD
ON Hoadon AFTER INSERT
AS
DECLARE @NgayLapHD DateTime, @NgayGiao DateTime
SELECT @NgayLapHD=hd.NGayLapHD,NgayGiao=hd.NgayGiaoNhan FROM HoaDon hd INNER JOIN Inserted i ON hd.MaHD=i.Mahd
If @NgayGiao<@NgayLapHD
BEGIN
RAISERROR(500103,10,1) ROLLBACK TRANSACTION
END
Trang 84Ví dụ: AFTER TRIGGERS
CREATE TRIGGER Trg_Xoa_HD
ON Hoadon AFTER DELETE
AS
SET NOCOUNT ON
IF EXISTS (SELECT * FROM Deleted)
BEGIN
DELETE CT_HOADON WHERE CT_HOADON.MaHD
IN (SELECT hd.MaHD FROM HoaDon hd INNER JOIN Deleted d ON hd.MaHD=d.Mahd) RAISERROR('Cac chi tiet HD da bi xoa',10,1)
END
SET NOCOUNT ON
Trang 85{ { FOR | AFTER | INSTEAD OF }
{ [DELETE] [,] [ INSERT ] [, ] [ UPDATE ] }
Trang 86Hiệu chỉnh Triggers
Ví dụ:
ALTER TABLE [Order Details]
DISABLE TRIGGER ALL
• Xóa trigger:
– DROP TRIGGER Trigger_Name
Trang 87Con trỏ
• Con trỏ là vùng làm việc tạm được tạo trong bộ nhớ
hệ thống khi câu lệnh SQL được thực thi
• Con trỏ chứa thông tin của câu lệnh select, sau khi cursor được định vị trên một dòng, các hoạt động có thể thực hiện trên dòng đó hoặc khối các dòng bắt đầu từ vị trí con trỏ
• Con trỏ có thể chứa nhiều hơn một dòng nhưng chỉ thao tác trên một dòng tại một thời điểm
Trang 89Khai báo con trỏ
Trang 90– Lấy mẫu tin hoặc điều hướng cursor (FETCH)
– Dữ liệu trong dòng hiện hành có thể được hiệu chỉnhnếu cần thiết
– Đóng cursor nhưng vẫn tồn tại
– Giải phóng Cursor(deallocate) khi không dùng nữa
90
Trang 92Sử dụng con trỏ
• Delete data by cursor:
• Close cursor:
• DEALLOCATE: Removes a cursor reference
DELETE <Ten Table>
WHERE CURRENT OF <Cur_Name>
CLOSE cursor_name
DEALLOCATE cursor_name
Trang 93• Ví dụ:
DECLARE MyCursor CURSOR FOR
SELECT c.CustomerID,c.Companyname,c.contactname,
o.OrderID,o.OrderDate FROM Customers c, Orders o WHERE c.CustomerID = o.CustomerID
FOR UPDATE
Open cursor
OPEN MyCursor
DECLARE @cid VARCHAR( 8), @c VARCHAR( 80), @o INT,
@od DATETIME, @cn VARCHAR( 80) FETCH NEXT FROM MyCursor INTO @cid, @c, @cn, @o, @od
SELECT @cid
BEGIN TRANSACTION
UPDATE Customers SET CompanyName = 'q'
WHERE CURRENT OF Mycursor
DEALLOCATE MyCursor
SELECT * FROM Customers
ROLLBACK TRANSACTION
Trang 943.List the three main approaches to database programming What are the advantagesand disadvantages of each approach?
Trang 95Review questions
4 What is the impedance mismatch problem?
Which of the three programming approaches minimizes this problem?
5 Describe the concept of a cursor and how it is
used in embedded SQL
6 What is SQLJ used for? Describe the two
types of iterators available in SQL
Trang 96Review questions
• State which of the following queries and updates would be allowed on the view If a query or update would be allowed, show what the corresponding query or update on the base relations would look like, and give its result when appliedto the database of Figure 5.6