Làm cách nào để gọi thủ tục lưu trữ MySQL?

Tóm lược. trong hướng dẫn này, bạn sẽ tìm hiểu cách tạo thủ tục lưu trữ với các tham số, bao gồm các tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1,

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
2 và

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
3

Giới thiệu về tham số thủ tục lưu trữ MySQL

Thông thường, các thủ tục được lưu trữ có các tham số. Các tham số làm cho thủ tục được lưu trữ hữu ích hơn và có thể tái sử dụng. Một tham số trong một thủ tục được lưu trữ có một trong ba chế độ.

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
4, hoặc

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;Code language: SQL (Structured Query Language) (sql)1 thông số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 là chế độ mặc định. Khi bạn xác định một tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 trong một thủ tục được lưu trữ, chương trình gọi phải truyền một đối số cho thủ tục được lưu trữ

Ngoài ra, giá trị của tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 được bảo vệ. Điều đó có nghĩa là ngay cả khi bạn thay đổi giá trị của tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 bên trong thủ tục được lưu trữ, thì giá trị ban đầu của nó vẫn không thay đổi sau khi thủ tục được lưu trữ kết thúc. Nói cách khác, thủ tục lưu trữ chỉ hoạt động trên bản sao của tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;Code language: SQL (Structured Query Language) (sql)2 thông số

Giá trị của tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
2 có thể được thay đổi bên trong thủ tục được lưu trữ và giá trị mới của nó được chuyển trở lại chương trình gọi

Lưu ý rằng thủ tục được lưu trữ không thể truy cập giá trị ban đầu của tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
2 khi nó bắt đầu

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;Code language: SQL (Structured Query Language) (sql)5 thông số

Tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5  là sự kết hợp của tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 và

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
2. Điều đó có nghĩa là chương trình gọi có thể chuyển đối số và thủ tục được lưu trữ có thể sửa đổi tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5 và chuyển giá trị mới trở lại chương trình gọi

Xác định một tham số

Đây là cú pháp cơ bản để xác định một tham số trong thủ tục lưu sẵn

[IN | OUT | INOUT] parameter_name datatype[(length)]

Code language: SQL (Structured Query Language) (sql)

Trong cú pháp này,

  • Đầu tiên, chỉ định chế độ tham số, có thể là

    DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

    Code language: SQL (Structured Query Language) (sql)
    1 ,

    DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

    Code language: SQL (Structured Query Language) (sql)
    2 hoặc

    DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

    Code language: SQL (Structured Query Language) (sql)
    5 tùy thuộc vào mục đích của tham số trong thủ tục lưu sẵn
  • Thứ hai, chỉ định tên của tham số. Tên tham số phải tuân theo quy tắc đặt tên của tên cột trong MySQL
  • Thứ ba, chỉ định loại dữ liệu và độ dài tối đa của tham số

Các ví dụ về tham số thủ tục lưu trữ MySQL

Hãy lấy một số ví dụ về việc sử dụng các tham số thủ tục được lưu trữ

Ví dụ về tham số IN

Ví dụ sau tạo một thủ tục được lưu trữ để tìm tất cả các văn phòng đặt tại một quốc gia được chỉ định bởi tham số đầu vào

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
3

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)

Trong ví dụ này,

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
3 là tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 của thủ tục lưu trữ

Giả sử bạn muốn tìm các văn phòng ở Hoa Kỳ, bạn cần chuyển một đối số (

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
6) cho thủ tục được lưu trữ như trong truy vấn sau

CALL GetOfficeByCountry('USA');

Code language: SQL (Structured Query Language) (sql)
Làm cách nào để gọi thủ tục lưu trữ MySQL?
Làm cách nào để gọi thủ tục lưu trữ MySQL?

Để tìm các văn phòng ở

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
7, bạn chuyển chuỗi ký tự

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
7 đến quy trình được lưu trữ

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
9 như sau

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
Làm cách nào để gọi thủ tục lưu trữ MySQL?
Làm cách nào để gọi thủ tục lưu trữ MySQL?

CALL GetOfficeByCountry('France')

Code language: SQL (Structured Query Language) (sql)
3 là tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 nên bạn phải truyền một đối số. Nếu bạn không làm như vậy, bạn sẽ gặp lỗi.

CALL GetOfficeByCountry();

Code language: SQL (Structured Query Language) (sql)

Đây là lỗi

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

Code language: JavaScript (javascript)

Ví dụ về tham số OUT

Thủ tục được lưu trữ sau đây trả về số lượng đơn hàng theo trạng thái đơn hàng

DELIMITER $$ CREATE PROCEDURE GetOrderCountByStatus ( IN orderStatus VARCHAR(25), OUT total INT ) BEGIN SELECT COUNT(orderNumber) INTO total FROM orders WHERE status = orderStatus; END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)

Thủ tục được lưu trữ

CALL GetOfficeByCountry();

Code language: SQL (Structured Query Language) (sql)
2 có hai tham số

  • The

    CALL GetOfficeByCountry();

    Code language: SQL (Structured Query Language) (sql)
    3. là tham số

    DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

    Code language: SQL (Structured Query Language) (sql)
    1 chỉ định trạng thái của các đơn đặt hàng trả lại.
  • CALL GetOfficeByCountry();

    Code language: SQL (Structured Query Language) (sql)
    5. là tham số

    DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

    Code language: SQL (Structured Query Language) (sql)
    2 lưu trữ số lượng đơn đặt hàng trong một trạng thái cụ thể

Để tìm số lượng đơn đặt hàng đã được giao, bạn gọi

CALL GetOfficeByCountry();

Code language: SQL (Structured Query Language) (sql)
7 và chuyển trạng thái đơn hàng là

CALL GetOfficeByCountry();

Code language: SQL (Structured Query Language) (sql)
8, đồng thời chuyển một biến phiên (

CALL GetOfficeByCountry();

Code language: SQL (Structured Query Language) (sql)
9 ) để nhận giá trị trả về

CALL GetOrderCountByStatus('Shipped',@total); SELECT @total;

Code language: SQL (Structured Query Language) (sql)
Làm cách nào để gọi thủ tục lưu trữ MySQL?
Làm cách nào để gọi thủ tục lưu trữ MySQL?

Để biết số lượng đơn đặt hàng đang được xử lý, bạn gọi thủ tục được lưu trữ là

CALL GetOfficeByCountry();

Code language: SQL (Structured Query Language) (sql)
7 như sau.

CALL GetOrderCountByStatus('in process',@total); SELECT @total AS total_in_process;

Code language: SQL (Structured Query Language) (sql)
Làm cách nào để gọi thủ tục lưu trữ MySQL?
Làm cách nào để gọi thủ tục lưu trữ MySQL?

Ví dụ về tham số INOUT

Ví dụ sau minh họa cách sử dụng tham số 

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5 trong quy trình được lưu trữ

DELIMITER $$ CREATE PROCEDURE SetCounter( INOUT counter INT, IN inc INT ) BEGIN SET counter = counter + inc; END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)

Trong ví dụ này, thủ tục được lưu trữ

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

Code language: JavaScript (javascript)
2 chấp nhận một tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5 (

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

Code language: JavaScript (javascript)
4 ) và một tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1 (

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

Code language: JavaScript (javascript)
6 ). Nó tăng bộ đếm (

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

Code language: JavaScript (javascript)
4 ) theo giá trị được chỉ định bởi tham số

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

Code language: JavaScript (javascript)
6

Các câu lệnh này minh họa cách gọi thủ tục được lưu trữ

Error Code: 1318. Incorrect number of arguments for PROCEDURE classicmodels.GetOfficeByCountry; expected 1, got 0

Code language: JavaScript (javascript)
9

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
0

Đây là đầu ra

Làm cách nào để gọi thủ tục lưu trữ MySQL?
Làm cách nào để gọi thủ tục lưu trữ MySQL?

Trong hướng dẫn này, bạn đã học cách tạo thủ tục lưu trữ với các tham số bao gồm các tham số

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
1,

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
2 và

DELIMITER // CREATE PROCEDURE GetOfficeByCountry( IN countryName VARCHAR(255) ) BEGIN SELECT * FROM offices WHERE country = countryName; END // DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5