Thảo luận mới

Store Procedures - Thủ tục lưu trữ


Từ: 15:32 05/09/2012
Bài: 62
Cảm ơn: 87
Thích: 13

 

 Các khái niệm

           SQL được thiết kế và cài đặt như là một ngôn ngữ để thực hiện các thao tác trên cơ sở dữ liệu như tạo lập các cấu trúc trong cơ sở dữ liệu, bổ sung, cập nhật, xoá và truy vấn dữ liệu trong cơ sở dữ liệu. Các câu lệnh SQL được người sử dụng viết và yêu cầu hệ quản trị cơ sở dữ liệu thực hiện theo chế độ tương tác.

            Các câu lệnh SQL có thể được nhúng vào trong các ngôn ngữ lập trình, thông qua đó chuỗi các thao tác trên cơ sở dữ liệu được xác định và thực thi nhờ vào các câu lệnh, các cấu trúc điều khiển của bản thân ngôn ngữ lập trình được sử dụng.

            Với thủ tục lưu trữ, một phần nào đó khả năng của ngôn ngữ lập trình được đưa vào trong ngôn ngữ SQL. Một thủ tục là một đối tượng trong cơ sở dữ liệu bao gồm một tập nhiều câu lệnh SQL được nhóm lại với nhau thành một nhóm với những khả năng sau:

  • Các cấu trúc điều khiển (IF, WHILE, FOR) có thể được sử dụng trong thủ tục.
  • Bên trong thủ tục lưu trữ có thể sử dụng các biến như trong ngôn ngữ lập trình nhằm lưu giữ các giá trị tính toán được, các giá trị được truy xuất được từ cơ sở dữ liệu.
  • Một tập các câu lệnh SQL được kết hợp lại với nhau thành một khối lệnh bên trong một thủ tục. Một thủ tục có thể nhận các tham số truyền vào cũng như có thể trả về các giá trị thông qua các tham số (như trong các ngôn ngữ lập trình). Khi một thủ tục lưu trữ đã được định nghĩa, nó có thể được gọi thông qua tên thủ tục, nhận các tham số truyền vào, thực thi các câu lệnh SQL bên trong thủ tục và có thể trả về các giá trị sau khi thực hiện xong.

            Sử dụng các thủ tục lưu trữ trong cơ sở dữ liệu sẽ giúp tăng hiệu năng của cơ sở dữ liệu, mang lại các lợi ích sau:

  • Đơn giản hoá các thao tác trên cơ sở dữ liệu nhờ vào khả năng module hoá các thao tác này.
  • Thủ tục lưu trữ được phân tích, tối ưu khi tạo ra nên việc thực thi chúng nhanh hơn nhiều so với việc phải thực hiện một tập rời rạc các câu lệnh SQL tương đương theo cách thông thường.
  • Thủ tục lưu trữ cho phép chúng ta thực hiện cùng một yêu cầu bằng một câu lệnh đơn giản thay vì phải sử dụng nhiều dòng lệnh SQL. Điều này sẽ làm giảm thiểu sự lưu thông trên mạng.
  • Thay vì cấp phát quyền trực tiếp cho người sử dụng trên các câu lệnh SQL và trên các đối tượng cơ sở dữ liệu, ta có thể cấp phát quyền cho người sử dụng thông qua các thủ tục lưu trữ, nhờ đó tăng khả năng bảo mật đối với hệ thống.

Tạo thủ tục lưu trữ

            Thủ tục lưu trữ được tạo bởi câu lệnh CREATE PROCEDURE với cú pháp như sau:

CREATE PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]

[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]

AS

     Các_câu_lệnh_của_thủ_tục

Trong đó:

tên_thủ_tục

Tên của thủ tục cần tạo. Tên phải tuân theo qui tắc định danh và không được vượt quá 128 ký tự.

danh_sách_tham_số

Các tham số của thủ tục được khai báo ngay sau tên thủ tục và nếu thủ tục có nhiều tham số thì các khai báo phân cách nhau bởi dấu phẩy. Khai báo của mỗi một tham số tối thiểu phải bao gồm hai phần:

  • tên tham số được bắt đầu bởi dấu @.
  • kiểu dữ liệu của tham số

RECOMPILE

Thông thường, thủ tục sẽ được phân tích, tối ưu và dịch sẵn ở lần gọi đầu tiên. Nếu tuỳ chọn WITH RECOMPILE được chỉ định, thủ tục sẽ được dịch lại mỗi khi được gọi.

ENCRYPTION

Thủ tục sẽ được mã hoá nếu tuỳ chọn WITH ENCRYPTION được chỉ định. Nếu thủ tục đã được mã hoá, ta không thể xem được nội dung của thủ tục.

các_câu_lệnh_của_thủ_tục

Tập hợp các câu lệnh sử dụng trong nội dung thủ tục. Các câu lệnh này có thể đặt trong cặp từ khoá BEGIN...END hoặc có thể không.

Giả sử ta cần thực hiện một chuỗi các thao tác như sau trên cơ sở dữ liệu

  • 1. Bổ sung thêm môn học cơ sở dữ liệu có mã TI-005 và số đơn vị học trình là 5vào bảng MONHOC
  • 2. Lên danh sách nhập điểm thi môn cơ sở dữ liệu cho các sinh viên học lớp có mãC24102 (tức là bổ sung thêm vào bảng DIEMTHI các bản ghi với cột MAMONHOC nhận giá trị TI-005, cột MASV nhận giá trị lần lượt là mã các sinh viên học lớp có mãC24105 và các cột điểm là NULL).

Nếu thực hiện yêu cầu trên thông qua các câu lệnh SQL như thông thường, ta phải thực thi hai câu lệnh như sau:

INSERT INTO MONHOC

     VALUES('TI-005','Cơ sở dữ liệu',5)

INSERT INTO DIEMTHI(MAMONHOC,MASV)

            SELECT ‘TI-005',MASV

            FROM SINHVIEN

            WHERE MALOP='C24102'

Thay vì phải sử dụng hai câu lệnh như trên, ta có thể định nghĩa môt thủ tục lưu trữ với các tham số vào là @mamonhoc@tenmonhoc@sodvht và @malop như sau:

CREATE PROC sp_LenDanhSachDiem(

                        @mamonhoc     NVARCHAR(10),

                        @tenmonhoc    NVARCHAR(50),

                        @sodvht       SMALLINT,    

                         @malop        NVARCHAR(10))

AS

     BEGIN

          INSERT INTO monhoc

          VALUES(@mamonhoc,@tenmonhoc,@sodvht)

 

          INSERT INTO diemthi(mamonhoc,masv)

              SELECT @mamonhoc,masv

              FROM sinhvien

              WHERE malop=@malop

     END

Khi thủ tục trên đã được tạo ra, ta có thể thực hiện được hai yêu cầu đặt ra ở trên  một cách đơn giản thông qua lòi gọi thủ tục:

     sp_LenDanhSachDiem 'TI-005','Cơ sở dữ liệu',5,'C24102'

 

---------------To be continue---------------

Label
Từ: 07:41 22/07/2012
Bài: 3
Cảm ơn: 8
Thích: 2

Một điều chú ý trong convention khi viết SP là không nên sử dụng tiền tố sp_ nhé. Vì khi execute, SQL server sẽ hiểu đây là system store nên sẽ tìm trong các system store trước rồi mới đến user defined SP dẫn đến bị chậm.

Label
Từ: 23:44 10/10/2014
Bài: 12
Cảm ơn: 0
Thích: 0

Hay quá, đọc lại bài này thấy hiểu hơn. Cảm ơn chị nhiều smiley