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
[sql]
DECLARE ten VARCHAR(255) DEFAULT ‘No Name’;
[/sql]
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
[sql]
DECLARE age INT(11) DEFAULT 0
SET age = 12
[/sql]
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
[sql]
DECLARE tong INT DEFAULT 0
SELECT COUNT(*) INTO tong
FROM shops
[/sql]
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
[sql]
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;
[/sql]
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ị
[sql]
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;
[/sql]
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ố IN, tham số OUT và tham số INOUT
IN
: Đây là chế độ mặc định, không bị thay đổi nếu như trong Procedure có tác động đếnOUT
: 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ữaIN
vàOUT,
có thể gán giá trị trước và có thể bị thay đổi nếu trong Procedure có tác động tới
Tham số loại IN:
[sql]
DELIMITER $$
DROP PROCEDURE IF EXISTS getId $$
CREATE PROCEDURE getId(
IN idval INT(11)
)
BEGIN
SELECT * FROM shops WHERE id = idval;
END; $$
DELIMITER;
[/sql]
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ụ:
[sql]
DELIMITER $$
DROP PROCEDURE IF EXISTS changeName $$
CREATE PROCEDURE changeName(OUT name VARCHAR(255))
BEGIN
SET name = ‘Shop Lazada’;
END; $$
DELIMITER;
[/sql]
Cách gọi như sau:
[php]
CALL changeName(@name);
SELECT @name;
[/php]
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:
[sql]
DELIMITER $$
DROP PROCEDURE IF EXISTS counter $$
CREATE PROCEDURE counter(INOUT number INT(11))
BEGIN
SET number = number + 1;
END; $$
DELIMITER;
[/sql]
Gọi hàm đó như sau:
[php]
SET @counter = 1;
CALL counter(@counter);
SELECT @counter;
[/php]
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
[thongbao]
- 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ể.
- Cảm ơn các bạn đã đọc.
[/thongbao]
Comments are closed.