Stored Procedure – Parameters

Stored Procedure Parameters
Stored Procedure Parameters

Cũng giống như lập trình thủ tục, hàm ở các ngôn ngữ lập trình. Parameters (tham số đầu vào) giúp cho các stored procedures của chúng ta linh hoạt hơn.

Trong bài trước, chúng ta đã biết cách tạo một stored procedure đơn giản. Tuy nhiên, những procedure đơn giản như vậy thật sự không hữu ích lắm. Trong thực tế, chúng ta thường làm việc với những câu truy vấn linh hoạt và có tính cập nhật hơn. Ví dụ: tính doanh thu tháng 5, tháng 6, tháng 7 … của năm 2019 hay 2020…vv Do đó, để một procedure trở nên hữu dụng hơn. Chúng ta cần điều chỉnh được một vài tham số đầu vào. Trong ví dụ trên, nếu chúng ta có thể thay thế được tháng và năm thì procedure của chúng ta sẽ tuyệt vời hơn rất nhiều.

Trong bài viết này, mình sẽ giới thiệu qua về cách tạo một procedure với tham số; cách sử dụng chúng một cách hiệu quả.

Stored procedure với một tham số

So với cách tạo một stored procedure thông thường, để tạo một procedure có tham số đầu vào sẽ có cú pháp hơi khác một xíu. Trước khi bắt đầu, chúng ta sẽ bàn về tham số là gì? Một cách đơn giản, tham số là một biến số. Khi sử dụng procedure, người dùng sẽ set giá trị cho biến này. Tùy vào giá trị của biến lúc sử dụng, procedure sẽ trả về những kết quả khác nhau.

Nhắc lại khái niệm biến

Với một biến, chúng ta sẽ quan tâm đến 2 vấn đề. Đầu tiên là tên biến. Tên biến sẽ bắt đầu bằng dấu @ và như mọi khi, mình vẫn khuyến khích 1 cái tên mang ý nghĩa rõ ràng. Kế đến là kiểu giá trị của biến. Kiểu giá trị phải phù hợp với ngữ cảnh sử dụng biến.

Cú pháp

Để minh họa, chúng ta sẽ cùng thực hiện một procedure. Liệt kê tất cả khách hàng theo từng quốc gia. Cú pháp để tạo mới procedure của chúng ta sẽ là.

Các bạn có thể nhận ra, cú pháp tương tự khi ta tạo một procedure đơn giản. Có thêm danh sách parameters là các biến, được khai báo theo cú pháp:

Sau khi thực hiện đoạn mã T-SQL để khởi tạo procedure, chúng ta thực hiện các thao tác refresh để kiểm tra. Lúc này, tại Object Explorer chúng ta sẽ thấy được sự khác biệt của procedure mới tạo.

Stored procedure có tham số
Stored procedure có tham số

Và tương tự, để thực thi procedure này, chúng ta cũng sử dụng một trong 2 lệnh EXECEXECUTE. Điểm khác biệt ở đây là cách chúng ta truyền tham số. Chúng ta sẽ có 2 cách, để truyền tham số cho một procedure khi gọi thực thi chúng.

Cách 1: Đơn giản. Chúng ta chỉ cần thêm giá trị của các tham số. Các giá trị này cần được sắp xếp đúng với thứ tự khai báo tham số.

Cách 2: Tường minh. Chúng ta sẽ khai báo tường minh tên biến đi kèm với giá trị của chúng. Khi chúng ta có một tham số, cách này có vẻ khá dài dòng so với cách 1. Tuy nhiên, khi procedure của chúng ta phức tạp hơn, chúng chưa nhiều tham số và có cả tham số mặc định. Cách tường minh sẽ giúp chúng ta hoặc những người cần phải đọc mã của chúng ta cảm thấy dễ chịu.

Stored procedure với nhiều tham số

Trong thực tế, chúng ta sẽ có những vấn đề phức tạp hơn rất nhiều. Để giải quyết những vấn đề đó, chúng ta cần procedure với nhiều hơn 1 tham số. Cũng giống như khi lập trình với các ngôn ngữ khác. Chúng ta có thể có một procedure có 2, 3, 4,..n tham số.

Với những stored procedures nhiều tham số, có gì khác biệt so với procedure chỉ chứa 1 tham số không? Câu trả lời là không, sự khác biệt duy nhất chỉ là chúng ta sẽ phải viết nhiều hơn một xíu mà thôi.

Procedure với 2 tham số

Chúng ta cần liệt kê các danh sách hóa đơn. Trong trường hợp này mình sẽ tìm trên 2 tiêu chí là thời gian và địa điểm. Lúc này, procedure mới sẽ gồm 2 tham số đầu vào.

Sau khi thực thi, các bạn có thể sử dụng một trong 2 cách sau để thực thi procedure của chúng ta:

Tham số mặc định

Trong một số trường hợp, chúng ta sử dụng tham số, nhưng tham số này có giá trị rất ít thay đổi. Chúng ta có thể tăng tính tiện lợi bằng cách đặt cho nó một giá trị mặc định. Khi sử dụng, nếu chúng ta cần truy vấn đến những trường hợp ngoại lệ, đặc biệt. Chúng ta có thể gán lại giá trị cho tham số. Còn trong trường hợp phổ thông, chúng ta có thể bỏ qua tham số này, hệ thống sẽ tự động gán giá trị mặc định cho nó.

Ví dụ: Cửa hàng trong CSDL mẫu của chúng ta được đặt tại Canada. Phần lớn khách hàng đến từ Canada. Chúng ta thường khảo sát các hóa đơn trong nước, chỉ trong 1 vài trường hợp đặc biệt mới cần thay đổi tìm kiếm sang các nước khác. Để minh họa cụ thể, mình sẽ xóa procedure uspInvoiceList của ví dụ trên. Sau đó, thực hiện lại nó với giá trị country được gán mặc định là Canada.

Với procedure này, chúng ta có thể yêu cầu thực thi bằng cách đơn giản:

Lúc này, hệ thống sẽ tự hiểu giá trị biến @country = ‘Canada’. Trong trường hợp chúng ta muốn gán lại giá trị cho biến country. Chỉ đơn giản khai báo thêm giá trị biến @country trong câu thực thi procedure.