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


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

 

 Lời gọi thủ tục lưu trữ

            Như đã thấy ở ví dụ ở trên, khi một thủ tục lưu trữ đã được tạo ra, ta có thể yêu cầu hệ quản trị cơ sở dữ liệu thực thi thủ tục bằng lời gọi thủ tục có dạng:

          tên_thủ_tục  [danh_sách_các_đối_số]

Số lượng các đối số cũng như thứ tự của chúng phải phù hợp với số lượng và thứ tự của các tham số  khi định nghĩa thủ tục.

            Trong trường hợp lời gọi thủ tục được thực hiện bên trong một thủ tục khác, bên trong một trigger hay kết hợp với các câu lệnh SQL khác, ta sử dụng cú pháp như sau:

          EXECUTE tên_thủ_tục  [danh_sách_các_đối_số]

            Thứ tự của các đối số được truyền cho thủ tục có thể không cần phải tuân theo thứ tự của các tham số như khi định nghĩa thủ tục nếu tất cả các đối số được viết dưới dạng:

          @tên_tham_số  = giá_trị

Lời gọi thủ tục ở ví dụ trên có thể viết như sau:

sp_LenDanhSachDiem @malop='C24102',

                   @tenmonhoc='Cơ sở dữ liệu',

                   @mamonhoc='TI-005',

                   @sodvht=5

Sử dụng biến trong thủ tục

            Ngoài những tham số được truyền cho thủ tục, bên trong thủ tục còn có thể sử dụng các biến nhằm lưu giữ các giá trị tính toán được hoặc truy xuất được từ cơ sở dữ liệu. Các biến trong thủ tục được khai báo bằng từ khoá DECLARE theo cú pháp như sau:

          DECLARE  @tên_biến  kiểu_dữ_liệu

            Tên biến phải bắt đầu bởi ký tự @ và tuân theo qui tắc về định danh. Ví dụ dưới đây minh hoạ việc sử dụng biến trong thủ tục

Ví dụ : Trong định nghĩa của thủ tục dưới đây sử dung các biến chứa các giá trị truy xuất được từ cơ sở dữ liệu.

CREATE PROCEDURE sp_Vidu(

          @malop1 NVARCHAR(10),

          @malop2 NVARCHAR(10))

AS

     DECLARE @tenlop1 NVARCHAR(30)

     DECLARE @namnhaphoc1 INT

     DECLARE @tenlop2 NVARCHAR(30)        

     DECLARE @namnhaphoc2 INT

    

     SELECT @tenlop1=tenlop,

            @namnhaphoc1=namnhaphoc

     FROM lop WHERE malop=@malop1

         

     SELECT @tenlop2=tenlop,

            @namnhaphoc2=namnhaphoc

     FROM lop WHERE malop=@malop2

 

     PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1)

     print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2)

 

     IF @namnhaphoc1=@namnhaphoc2

          PRINT 'Hai lớp nhập học cùng năm'

     ELSE

          PRINT 'Hai lớp nhập học khác năm'    

Giá trị trả về của tham số trong thủ tục lưu trữ

            Trong các ví dụ trước, nếu đối số truyền cho thủ tục khi có lời gọi đến thủ tục là biến, những thay đổi giá trị của biền trong thủ tục sẽ không được giữ lại khi kết thúc quá trình thực hiện thủ tục.

Ví dụ : Xét câu lệnh sau đây

     CREATE PROCEDURE sp_Conghaiso(@a  INT,@b INT, @c INT)

     AS

          SELECT @c=@a+@b

Nếu sau khi đã tạo thủ tục với câu lệnh trên, ta thực thi một tập các câu lệnh như sau:

DECLARE @tong INT

SELECT @tong=0

EXECUTE sp_Conghaiso 100,200,@tong

SELECT @tong

Câu lệnh "SELECT @tong" cuối cùng trong loạt các câu lệnh trên sẽ cho kết quả là: 0

            Trong trường hợp cần phải giữ lại giá trị của đối số sau khi kết thúc thủ tục, ta phải khai báo tham số của thủ tục theo cú pháp như sau:

          @tên_tham_số  kiểu_dữ_liệu  OUTPUT

hoặc:

          @tên_tham_số  kiểu_dữ_liệu  OUT      

và trong lời gọi thủ tục, sau đối số được truyền cho thủ tục, ta cũng phải chỉ định thêm từ khoá OUTPUT (hoặc OUT)

Ví dụ : Ta định nghĩa lại thủ tục ở ví dụ 5.4 như sau:

     CREATE PROCEDURE sp_Conghaiso(

                                  @a  INT,

                                  @b   INT,

                                  @c   INT OUTPUT)

     AS

          SELECT @c=@a+@b

và thực hiện lời gọi thủ tục trong một tập các câu lệnh như sau:

DECLARE @tong INT

SELECT @tong=0

EXECUTE sp_Conghaiso 100,200,@tong OUTPUT

SELECT @tong

thì câu lệnh "SELECT @tong" sẽ cho kết quả là: 300

 

Tham số với giá trị mặc định

            Các tham số được khai báo trong thủ tục có thể nhận các giá trị mặc định. Giá trị mặc định sẽ được gán cho tham số trong  trường hợp không truyền đối số cho tham số khi có lời gọi đến thủ tục.

            Tham số với giá  trị mặc định được khai báo theo cú pháp như sau:

          @tên_tham_số  kiểu_dữ_liệu  =  giá_trị_mặc_định

Ví dụ : Trong câu lệnh dưới đây:

CREATE PROC sp_TestDefault(

                    @tenlop NVARCHAR(30)=NULL,

                    @noisinh NVARCHAR(100)='Huế')

AS

     BEGIN

          IF @tenlop IS NULL

              SELECT hodem,ten

              FROM sinhvien INNER JOIN lop

                   ON sinhvien.malop=lop.malop

              WHERE noisinh=@noisinh

          ELSE

              SELECT hodem,ten

              FROM sinhvien INNER JOIN lop

                   ON sinhvien.malop=lop.malop

              WHERE noisinh=@noisinh AND

                    tenlop=@tenlop

     END

thủ tục sp_TestDefault được định nghĩa với tham số @tenlop có giá trị mặc định là NULL và tham số @noisinh có giá trị mặc định là Huế. Với thủ tục được định nghĩa như trên, ta có thể thực hiện các lời gọi với các mục đích khác nhau như sau:

  • Cho biết họ tên của các sinh viên sinh tại Huế:

        sp_testdefault

  • Cho biết họ tên của các sinh viên lớp Tin K24 sinh tại Huế:

        sp_testdefault @tenlop='Tin K24'

  • Cho biết họ tên của các sinh viên sinh tại Nghệ An:

        sp_testDefault @noisinh=N'Nghệ An'

  • Cho biết họ tên của các sinh viên lớp Tin K26 sinh tại Đà Nẵng:

        sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng'

 Sửa đổi thủ tục

            Khi một thủ tục đã được tạo ra, ta có thể tiến hành định nghĩa lại thủ tục đó bằng câu lệnh ALTER PROCEDURE có cú pháp như sau:

ALTER 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

Câu lệnh này sử dụng tương tự như câu lệnh CREATE PROCEDURE. Việc sửa đổi lại một thủ tục đã có không làm thay đổi đến các quyền đã cấp phát trên thủ tục cũng như không tác động đến các thủ tục khác hay trigger phụ thuộc vào thủ tục này.

Xoá thủ tục

            Để xoá một thủ tục đã có, ta sử dụng câu lệnh DROP PROCEDURE với cú pháp như sau:

     DROP PROCEDURE tên_thủ_tục

Khi xoá một thủ tục, tất cả các quyền đã cấp cho người sử dụng trên thủ tục đó cũng đồng thời bị xoá bỏ. Do đó, nếu tạo lại thủ tục, ta phải tiến hành cấp phát lại các quyền trên thủ tục đó.