[Thực hành] Truyền tham số vào Store Procedure

Tổng quan

Mục tiêu

Luyện tập tạo store procedure

Mô tả

Thực hành luyện tập tạo store procedure trên cơ sở dữ liệu classicmodels.

Chúng ta có bảng customers như sau:

Hướng dẫn

Trong MYSQL thì sẽ tồn tại ba loại Tham số đó là tham số IN, tham số OUT và tham số INOUT

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).

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.

Tham số loại IN

Ví dụ:

DELIMITER //

CREATE PROCEDURE getCusById

(IN cusNum INT(11))

BEGIN

  SELECT * FROM customers WHERE customerNumber = cusNum;

END //

DELIMITER ;

Gọi store procedure:

call getCusById(175);

Kết quả:

Tham số loại OUT

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

VD:

DELIMITER //

CREATE PROCEDURE GetCustomersCountByCity(

    IN  in_city VARCHAR(50),

    OUT total INT

)

BEGIN

    SELECT COUNT(customerNumber)

    INTO total

    FROM customers

    WHERE city = in_city;

END//

DELIMITER ;

Gọi store procedure:

CALL GetCustomersCountByCity(‘Lyon’,@total);

SELECT @total;

Tham số loại INOUT

INOUT là sự kết hợp giữa IN và OUT, ví dụ:

DELIMITER //

CREATE PROCEDURE SetCounter(

    INOUT counter INT,

    IN inc INT

)

BEGIN

    SET counter = counter + inc;

END//

DELIMITER ;

Gọi store procedure:

SET @counter = 1;

CALL SetCounter(@counter,1); — 2

CALL SetCounter(@counter,1); — 3

CALL SetCounter(@counter,5); — 8

SELECT @counter; — 8

Trả lời

Email của bạn sẽ không được hiển thị công khai.