Thứ Tư, 26 tháng 7, 2023

Truyền tham số vào Mysql Stored Procedure

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ố INtham 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.

Mục lục

  • 1. Tạo Cơ sở dữ liệu Products
  • 2. Các loại tham số trong Mysql Stored Procedure
  • 3. Tham số loại IN trong Mysql Stored Procedure
  • 4. Tham số loại OUT trong Mysql Stored Procedure
  • 5. Tham số dạng INOUT trong Mysql Stored Procedure
  • Lời kế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:

Bài viết này được đăng tại tranvanbinh.vn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE IF NOT EXISTS `products` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `content` TEXT COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=INNODB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
  
--
-- Contenu de la table `products`
--
  
INSERT INTO `products` (`id`, `title`, `content`) VALUES
(1, 'Học lập trình online tại freetuts.net', 'Gioi thieu website Học lập trình online 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ữa IN 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ụ:

1
2
3
4
5
6
DELIMITER $$
CREATE PROCEDURE getById(IN id INT(11))
BEGIN
    /*Code*/
END; $$
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ụ:

1
2
3
4
5
6
7
DELIMITER $$
DROP PROCEDURE IF EXISTS getById $$
CREATE PROCEDURE getById(IN id INT(11), IN title VARCHAR(255))
BEGIN
    /*Code*/
END; $$
DELIMITER;

Thông thường chúng ta viết các tham số xuống hàng để nhìn đẹp hơn. Ví dụ:

1
2
3
4
5
6
7
8
9
10
11
DELIMITER $$
DROP PROCEDURE IF EXISTS getById $$
 
CREATE PROCEDURE getById(
    IN id INT(11),
    IN title VARCHAR(255)
)
BEGIN
    /*Code*/
END; $$
DELIMITER;

3. Tham số loại IN trong Mysql Stored Procedure

Như trình bày ở trên tham số này sẽ được bảo vệ và không bị thay đổi trong quá trình sử dụng trong Procedure.

Ví dụ: Viết Store lấy chi tiết sản phẩm theo ID

1
2
3
4
5
6
7
DELIMITER $$
DROP PROCEDURE IF EXISTS getById $$
CREATE PROCEDURE getById(IN idVal INT(11))
BEGIN
    SELECT * FROM products WHERE id = idVal;
END; $$
DELIMITER;

Chạy Procedure này:

1
CALL getById(1);

Và ta có giao diện kết quả trả về:

call store procedure in mysql png

4. Tham số loại OUT trong Mysql Stored Procedure

Loại out nếu trong quá trình thực thi mà Procedure có tác động đến tham số này thì bên ngoài nó ảnh hưở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.

1
2
3
4
5
6
7
DELIMITER $$
DROP PROCEDURE IF EXISTS changeTitle $$
CREATE PROCEDURE changeTitle(OUT title VARCHAR(255))
BEGIN
    SET title = 'Hoc lap trinh online tai freetuts.net';
END; $$
DELIMITER;

Bây giờ ta gọi Procedure này như sau:

1
2
3
CALL changeTitle(@title);
 
SELECT @title;

Thì kết quả sẽ như sau:

call store procedure in mysql 1 png

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ưng IN 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ưng OUT thì không được.

Ví dụ: Tạo Procedure

1
2
3
4
5
6
7
8
9
DELIMITER $$
 
DROP PROCEDURE IF EXISTS counter $$
 
CREATE PROCEDURE counter(INOUT number INT(11))
BEGIN
    SET number = number + 1;
END; $$
DELIMITER;

Gọi sử dụng:

1
2
3
SET @counter = 1;
CALL counter(@counter);
SELECT @counter;

Và kết quả 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 bắt đầu thấy căng rồi phải không nào :D 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 các ngôn ngữ lập trình khác đó là tồn tại tham chiếu và tham trị nhưng cách thể hiện khác nhau. Bài tiếp theo chúng ta sẽ tìm hiểu về lệnh IF ELSE trong MySql nhé.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
Truyền tham số vào Mysql Stored Procedure, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master