Biến trong Mysql Stored Procedure

Khai báo:

Cú pháp: DECLARE variable_name datatype(size) DEFAULT default_value

Trong đó:

  • DECLARE: là từ khóa tạo biến
  • variable_name là tên biến
  • datatype(size)  là kiểu dữ liệu của biến và kích thước của nó
  • DEFAULT default_value: là gán giá trị mặc định.

ví dụ: tạo một biến ten có kiểu varchar mặc định là no name


DECLARE ten VARCHAR(255) DEFAULT 'No Name';

Gán giá trị cho biến:

Cú pháp: SET variable_name = ‘value’;

Ta có ví dụ: khai báo một biến tuoi và gán giá trị là 20


DECLARE age INT(11) DEFAULT 0
SET age = 12

Chúng ta cũng có thể gán giá trị bên trong lệnh sql select như sau: đếm tổng record sau đó gán vào biến tong


DECLARE tong INT DEFAULT 0
  SELECT COUNT(*) INTO tong
FROM shops

Phạm vi của biến:

Các bạn có thể khai báo biến bên ngoài Procedure(bên ngoài BEGIN và END) nhưng bên trong sẽ không thể hiểu được, vì vậy tốt nhất là khai báo và set giá trị bên trong Procedure, có 2 ví dụ sau:

Ví dụ 1: không có lỗi và kết quả tong là 5


DELIMITER $$
DROP PROCEDURE IF EXISTS tinhtong $$
CREATE PROCEDURE tinhtong()
BEGIN
  DECLARE a INT (11) DEFAULT 0;
  DECLARE b INT (11) DEFAULT 0;
  DECLARE tong INT (11) DEFAULT 0;
  SET a = 2;
  SET b = 3;
  SET tong = a + b;
  SELECT tong;
END; $$
DELIMITER;

Ví dụ 2: lỗi, vì nó không hiểu biến tong khai báo bên ngoài => không set được giá trị


DELIMITER $$
DECLARE tong INT (11) DEFAULT 0;
DROP PROCEDURE IF EXISTS tinhtong $$
CREATE PROCEDURE tinhtong()
BEGIN
  DECLARE a INT (11) DEFAULT 0;
  DECLARE b INT (11) DEFAULT 0;
  SET a = 200;
  SET b = 300;
  SET tong = a + b;
  SELECT tong;
END; $$
DELIMITER;

Tham số trong 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 tham số INOUT 

  • IN: Đây là chế độ mặc định, 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, 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 INOUT, có thể gán giá trị trướccó thể bị thay đổi nếu trong Procedure có tác động tới

Tham số loại IN:


DELIMITER $$
DROP PROCEDURE IF EXISTS getId $$
CREATE PROCEDURE getId(
  IN idval INT(11)
)
BEGIN
  SELECT * FROM shops WHERE id = idval;
END; $$
DELIMITER;

Sử dụng hàm này bằng cú pháp: CALL getId(1); sẽ được kết quả là record có id bằng 1 trong table shops

Tham số loại OUT:

  • Khi gọi thì biến truyền vào phải có dấu @ phía trước tên biến.
  • Mục đích sử dụng out là sử dụng dữ liệu trong Procedure và sử dụng bên ngoài
  • Giá trị ban đầu lúc nào cũng là NULL cho dù có gán giá trị khác.

Ví dụ:


DELIMITER $$
DROP PROCEDURE IF EXISTS changeName $$
CREATE PROCEDURE changeName(OUT name VARCHAR(255))
BEGIN
  SET name = 'Shop Lazada';
END; $$
DELIMITER;

Cách gọi như sau:


CALL changeName(@name);
SELECT @name;

Tham số loại INOUT: là sự kết hợp của 2 loại IN và OUT truyền tham số có thể gán giá trị và trong Procedure nếu có thay đổi thì giá trị này cũng sẽ thay đổi.

Ví dụ:

Với phpmyadmin có một số lệnh khởi tạo sẽ không chạy được, chúng ta có thể tạo bằng cách sau, xem hình sẽ rõ:

Cách thực hiện trên hình sẽ tương ứng với cú pháp:


DELIMITER $$
DROP PROCEDURE IF EXISTS counter $$
CREATE PROCEDURE counter(INOUT number INT(11))
BEGIN
  SET number = number + 1;
END; $$
DELIMITER;

Gọi hàm đó như sau:


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

và kết quả nhận được sẽ là 2

Bài này sẽ đến đây, vấn đề tham số này không khác gì các hàm trong các ngôn ngữ lập trình khác, chỉ khác về cách thể hiện sử dụng hơi khác tý. Bài tiếp theo chúng ta sẽ cùng tìm hiểu một số câu lệnh, vòng lặp trong MySQL để sử dụng chúng trong Procedure

Kết luận

  1. Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
  2. Cảm ơn các bạn đã đọc.

Nongdanit.info
[Mysql] – Bài 2 – Biến và tham số trong Mysql Stored Procedure
Tagged on: