Như ta biết thông thường một hàm sẽ có các tham số truyền vào và đối với ngôn ngữ lập trình thì sẽ tồn tại khái niệm tham chiếu và tham trị. Nhưng với Procedure trong MYSQL thì sẽ tồn tại ba loại đó là tham số IN, tham số OUT và tham số INOUT tuy nhiên về bản chất thì nó rất giống nhau. Chi tiết thế nào thì chúng ta tìm hiểu ở các phần dưới đây nhé.
Vậy thì trong bài này chúng ta sẽ tìm hiểu cách truyền một tham số (variable) vào một Stored Procedure như thế nào? Nhưng trước tiên chúng ta tìm hiểu cú pháp của nó đã nhé.
Lưu ý trong bài này tôi sử dụng lại CSDL của bài trước đó là bảng Products nhé, nên nếu bạn chưa đọc bài tạo procedure đầu tiên thì vui lòng quay lại đọc để tạo CSDL. Mà thôi tôi đưa vào đây luôn cho tiện theo dõi.
Tóm Tắt
1. Tạo Cơ sở dữ liệu Products
Bạn tạo mới một Database và chạy lệnh SQL tạo bảng sau lệnh này sẽ tạo một bảng products
và thêm hai record:
1234567891011121314 |
CREATETABLEIFNOTEXISTS`products`( `id`INT(11)NOTNULLAUTO_INCREMENT, `title`VARCHAR(255)COLLATEutf8_unicode_ciDEFAULTNULL, `content`TEXTCOLLATEutf8_unicode_ci, PRIMARYKEY(`id`) )ENGINE=INNODBDEFAULTCHARSET=utf8COLLATE=utf8_unicode_ciAUTO_INCREMENT=3;
— –Contenudelatable`products` —
INSERTINTO`products`(`id`,`title`,`content`)VALUES (1,’ Học lập trình trực tuyến tại freetuts.net ‘,’ Gioi thieu website Học lập trình trực tuyến tại freetuts.net ‘), (2,’ Tutorials học Stored Procedure ‘,’ Website Tutorials học Stored Procedure ‘); |
2. Các loại tham số trong Mysql Stored Procedure
Chúng ta có hai loại tham số chính trong Procedure đó là :
-
IN
: Đây là chế độ mặc định (nghĩa là nếu bạn không định nghĩa loại nào thì nó sẽ hiểu là IN). Khi bạn sử dụng mức này thì nó sẽ được bảo vệ an toàn, có nghĩa là sẽ không bị thay đổi nếu như trong Procedure có tác động đến -
OUT
: Chế độ này nếu như trong Procedure có tác động thay đổi thì nó sẽ thay đổi theo. Nhưng có điều đặc biệt là dù trước khi truyền vào mà bạn gán giá trị cho biến đó thì vẫn sẽ không nhận được vì mặc định nó luôn hiểu giá trị truyền vào là NULL. -
INOUT
: Đây là sự kết hợp giữaIN
vàOUT
. Nghĩa là có thể gán giá trị trước và có thể bị thay đổi nếu trong Procedure có tác động tới
Ví dụ:
123456 |
DELIMITERUSDUSD CREATEPROCEDUREgetById(INidINT(11)) BEGIN / * Code * / END;USDUSD DELIMITER; |
Nếu muốn truyền vào nhiều hơn một tham số thì ta sẽ ngăn cách nó bởi dấu phẩy. Ví dụ :
1234567 |
DELIMITERUSDUSD DROPPROCEDUREIFEXISTSgetByIdUSDUSD CREATEPROCEDUREgetById(INidINT(11),INtitleVARCHAR(255)) BEGIN / * Code * / END;USDUSD DELIMITER; |
Thông thường tất cả chúng ta viết những tham số xuống hàng để nhìn đẹp hơn. Ví dụ :
1234567891011 |
DELIMITERUSDUSD DROPPROCEDUREIFEXISTSgetByIdUSDUSD CREATE PROCEDURE getById( INidINT(11), INtitleVARCHAR(255) ) BEGIN / * Code * / END;USDUSD DELIMITER; |
3. Tham số loại IN trong Mysql Stored Procedure
Như trình diễn ở trên tham số này sẽ được bảo vệ và không bị đổi khác trong quy trình sử dụng trong Procedure .
Ví dụ: Viết Store lấy chi tiết sản phẩm theo ID
1234567 |
DELIMITERUSDUSD DROPPROCEDUREIFEXISTSgetByIdUSDUSD CREATEPROCEDUREgetById(INidValINT(11)) BEGIN SELECT *FROMproductsWHEREid=idVal; END;USDUSD DELIMITER; |
Chạy Procedure này :
1 |
CALLgetById(1); |
Và ta có giao diện hiệu quả trả về :
4. Tham số loại OUT trong Mysql Stored Procedure
Loại out nếu trong quy trình thực thi mà Procedure có tác động ảnh hưởng đến tham số này thì bên ngoài nó ảnh hưởng tác động theo. Khi nhận tham số này thì Procedure sẽ hiểu đó là giá trị NULL nên dù bạn có gán giá trị cho biến trước khi truyền vào nó vẫn lấy NULL .
- Biến truyền vào phải có chữ @ đằng trước, ví dụ
@title
Ví dụ: Truyền tham số title kiểu OUT
vào Procedure và đổi giá trị cho nó, sau đó bên ngoài Procedure hiển thị giá trị của title.
1234567 |
DELIMITERUSDUSD DROPPROCEDUREIFEXISTSchangeTitleUSDUSD CREATEPROCEDUREchangeTitle(OUTtitleVARCHAR(255)) BEGIN SETtitle=’ Hoc lap trinh trực tuyến tai freetuts.net ‘; END;USDUSD DELIMITER; |
Bây giờ ta gọi Procedure này như sau :
123 |
CALLchangeTitle(@title); SELECT@title; |
Thì hiệu quả sẽ như sau :
Như vậy ra rút ra kết luận như sau:
- Khi truyền tham số dạng
OUT
mục đích là lấy dữ liệu trong Proedure và sử dụng ở bên ngoài. - Khi truyền tham số vào dạng
OUT
phải có chữ@
đằng trước biến - Hoạt động giống tham chiếu nên biến truyền vào dạng
OUT
không cần định nghĩa trước, chính vì vậy khởi đầu nó có giá trị NULL
5. Tham số dạng INOUT trong Mysql Stored Procedure
INOUT
là sự kết hợp giữa IN
và OUT
, nghĩa là:
- Nó có thể được định nghĩa trước và gán gia trị trước rồi truyền vào Procedure, điều này với dạng
OUT
thì không thể được nhưngIN
thì được. - Sau khi thực thi xong nếu trong Procedure có tác động đến thì ảnh hưởng theo. Điêu này dạng
IN
không được nhưngOUT
thì không được.
Ví dụ: Tạo Procedure
123456789 |
DELIMITERUSDUSD DROPPROCEDUREIFEXISTScounterUSDUSD CREATEPROCEDUREcounter(INOUTnumberINT(11)) BEGIN SETnumber=number+1; END;USDUSD DELIMITER; |
Gọi sử dụng:
123 |
SET@counter=1; CALLcounter(@counter); SELECT@counter; |
Và tác dụng là 2 .
Nhưng nếu ta dùng dạng OUT
thì kết quả sẽ là NULL
. Lý do là bên trong có tăng lên 1 nhưng nó lấy giá trị truyền vào dạng OUT
là NULL
nên 1 + NULL
sẽ là NULL
.
Lời kết:
Bài này khởi đầu thấy căng rồi phải không nào 😀 Thực sự thì với ba loại tham số này rất hay và rất giống với hàm trong những ngôn từ lập trình khác đó là sống sót tham chiếu và tham trị nhưng cách biểu lộ khác nhau. Bài tiếp theo tất cả chúng ta sẽ khám phá về lệnh IF ELSE trong MySql nhé .
Source: https://final-blade.com
Category: Kiến thức Internet