Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tạo và sử dụng thủ tục lưu trữ trong MySQL - Hướng dẫn

Các thủ tục được lưu trữ là các câu lệnh SQL do người dùng định nghĩa được lưu trữ trong cơ sở dữ liệu MySQL và được thực thi theo yêu cầu để thực hiện một hoạt động cơ sở dữ liệu cụ thể. Các chương trình con được xác định trước này giúp chuyển logic nghiệp vụ sang cơ sở dữ liệu, mang lại một số lợi ích:

  • Các chuyến đi khứ hồi do một ứng dụng thực hiện đến máy chủ cơ sở dữ liệu được giảm thiểu.
  • Khả năng bảo trì mã được nâng cao, vì các ứng dụng khác nhau có thể chia sẻ quy trình được lưu trữ.
  • Hiệu suất cơ sở dữ liệu được cải thiện vì các thủ tục được lưu trữ được biên dịch một lần và được thực thi rất nhanh chóng và hiệu quả.

Trong hướng dẫn này, bạn sẽ:

  • Tìm hiểu cú pháp để tạo các thủ tục được lưu trữ và khai báo thủ tục đầu tiên của bạn.

  • Thực hiện quy trình mẫu sau khi bạn đã khai báo.

  • Tìm hiểu cách xóa thủ tục khi bạn không cần nữa.

Trước khi bạn bắt đầu

Đảm bảo bạn có những thứ sau:

  1. Nếu bạn chưa làm như vậy, hãy tạo một tài khoản Linode và Compute Instance. Xem hướng dẫn Bắt đầu với Linode và Tạo phiên bản Máy tính của chúng tôi.

  2. Làm theo hướng dẫn Thiết lập và Bảo mật Phiên bản Máy tính của chúng tôi để cập nhật hệ thống của bạn. Bạn cũng có thể muốn đặt múi giờ, định cấu hình tên máy chủ của mình, tạo tài khoản người dùng hạn chế và tăng cường quyền truy cập SSH.

  3. Máy chủ và máy khách MySQL được cài đặt trên máy chủ Linode. Hướng dẫn cài đặt cho MySQL có sẵn cho các bản phân phối khác nhau trong phần MySQL của chúng tôi.

Chuẩn bị Cơ sở dữ liệu

Bạn sẽ bắt đầu bằng cách tạo cơ sở dữ liệu mẫu, bảng và người dùng để truy cập cơ sở dữ liệu. Bạn cũng sẽ điền vào bảng dữ liệu mẫu cho mục đích thử nghiệm.

Tạo Cơ sở dữ liệu, Bảng và Người dùng

  1. Đăng nhập vào máy chủ MySQL:

     mysql -u root -p
    

    Bạn sẽ được nhắc nhập mật khẩu gốc của cơ sở dữ liệu MySQL của mình. Sau đó, nhấn Enter để tiếp tục.

  2. Tiếp theo, bạn sẽ thấy một lời nhắc MySQL tương tự như lời nhắc bên dưới.

    mysql >
  3. Nhập lệnh bên dưới để tạo test_db cơ sở dữ liệu:

    CREATE DATABASE test_db;
    

    Đầu ra:

    Query OK, 1 row affected (0.01 sec)
  4. Tạo người dùng cơ sở dữ liệu và cấp toàn quyền truy cập vào test_db cơ sở dữ liệu. Thay thế PASSWORD với một giá trị phức tạp và duy nhất tuân theo các nguyên tắc dành cho mật khẩu MySQL:

    CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
    

    Đầu ra:

    Query OK, 1 row affected (0.01 sec)
  5. Cấp cho test_user các đặc quyền đầy đủ đối với test_db cơ sở dữ liệu;

    GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
    

    Đầu ra:

    Query OK, 1 row affected (0.01 sec)
  6. Đặc quyền tuôn ra:

    FLUSH PRIVILEGES;
    

    Đầu ra:

    Query OK, 0 rows affected (0.01 sec)

Điền vào Cơ sở dữ liệu

  1. Tiếp theo, chuyển sang cơ sở dữ liệu test_db:

     USE test_db;
    

    Đầu ra:

    Database changed
  2. Tạo một products bảng lưu hồ sơ mẫu:

    CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
    

    Đầu ra:

    Query OK, 0 rows affected (0.01 sec)
  3. Giờ đây, bạn có thể thêm một vài sản phẩm vào bảng sản phẩm bằng cách thực hiện từng lệnh bên dưới:

    INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES');
    INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES');
    INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES');
    INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS');
    INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS');
    INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');
    

    Bạn sẽ nhận được đầu ra bên dưới sau khi thực hiện mỗi Insert tuyên bố:

    Query OK, 1 row affected (0.00 sec)
  4. Kế tiếp. xác nhận xem sản phẩm mẫu đã được chèn thành công vào cơ sở dữ liệu hay chưa bằng cách chạy Select lệnh bên dưới:

    SELECT * FROM products;
    

    Các sản phẩm mẫu của bạn sẽ được liệt kê như hình dưới đây:

    +------------+-----------------+----------------------+
    | product_id | product_name    | category_name        |
    +------------+-----------------+----------------------+
    |          1 | GAMING KEYBOARD | COMPUTER ACCESSORIES |
    |          2 | OPTICAL MOUSE   | COMPUTER ACCESSORIES |
    |          3 | MOUSE PAD       | COMPUTER ACCESSORIES |
    |          4 | STEREO SYSTEM   | ELECTRONICS          |
    |          5 | 32 INCH TV      | ELECTRONICS          |
    |          6 | DVB-T2 RECEIVER | ELECTRONICS          |
    +------------+-----------------+----------------------+
    6 rows in set (0.00 sec)
  5. Thoát khỏi máy chủ MySQL.

    QUIT;
    

    Đầu ra:

    Bye!
  6. Khi bạn đã tạo test_db cơ sở dữ liệu, products bảng, một test_user và đã thêm một số sản phẩm mẫu, bây giờ bạn có thể chuyển sang tạo quy trình được lưu trữ đầu tiên.

Tạo một thủ tục đã lưu trữ

Cú pháp Thủ tục Đã Lưu trữ

Cú pháp cơ bản của việc tạo một thủ tục được lưu trữ trong cơ sở dữ liệu MySQL được hiển thị bên dưới:

DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
  • DELIMITER && ở đầu dòng cho máy chủ MySQL xử lý các câu lệnh SQL sau đây như một câu lệnh duy nhất, thay vì thực thi chúng riêng lẻ. && khác được đưa vào một dòng sau đó để đánh dấu phần cuối của tuyên bố này.

  • PROCEDURE_NAME là nơi khai báo tên của thủ tục đã lưu trữ của bạn.

  • Tên thủ tục được theo sau bởi một tập hợp các dấu ngoặc đơn và chúng bao gồm các tham số cho thủ tục của bạn. Các thủ tục được lưu trữ hỗ trợ các tham số được phân tách bằng dấu phẩy và tính năng này làm cho chúng linh hoạt hơn. Xem phần tham số để biết thêm chi tiết.

  • BEGIN...END các lệnh bao gồm câu lệnh SQL mà bạn muốn được thực thi bằng thủ tục được lưu trữ.

  • Cuối cùng, câu lệnh DELIMITER ; được cấp lại để thay đổi dấu phân cách trở lại giá trị mặc định của ;

Các Tham số Thủ tục Đã Lưu trữ

Mỗi tham số cho một thủ tục có một kiểu, tên và kiểu dữ liệu, được phân tách bằng dấu cách:

PARAMETER_TYPE PARAMETER_NAME DATA_TYPE

Ví dụ:để tạo một tham số kiểu IN , được đặt tên là category , với VARCHAR loại dữ liệu có độ dài 50 ký tự, sử dụng cú pháp này:

IN category VARCHAR(50)

MySQL hỗ trợ ba loại tham số:

  • IN :Giá trị của tham số phải được chỉ định bởi ứng dụng khách đang gọi. Không thể thay đổi giá trị này bằng quy trình được lưu trữ .

    Ví dụ:nếu bạn chuyển biến phiên aMySQL dưới dạng IN tham số cho một thủ tục và thủ tục sửa đổi giá trị này trong các câu lệnh của nó, biến phiên của bạn sẽ vẫn không được sửa đổi sau khi thủ tục thoát.

  • OUT :Loại tham số này cũng được chỉ định bởi chương trình gọi, nhưng giá trị của nó có thể được thay đổi bởi thủ tục được lưu trữ và được chương trình gọi truy xuất.

    Lưu ý rằng thủ tục được lưu trữ không thể truy cập giá trị ban đầu của một biến được chuyển dưới dạng OUT tham số.

  • INOUT :Một tham số kiểu này kết hợp các hành vi của INOUT thông số:

    • Thủ tục được lưu trữ có thể đọc giá trị ban đầu của tham số.

    • Tham số có thể được thay đổi trong quá trình thực thi thủ tục được lưu trữ.

    • Giá trị đã thay đổi có thể được trả lại cho chương trình gọi, nếu chương trình gọi đã chuyển một biến làm tham số.

Ví dụ về Thủ tục được Lưu trữ

Sau khi hiểu cú pháp cơ bản, hãy tạo một quy trình đơn giản được lưu trữ để lọc sản phẩm theo tên danh mục. Tên danh mục sẽ được cung cấp dưới dạng IN tham số.

  1. Đăng nhập vào máy chủ MySQL bằng test_user Thông tin đăng nhập mà bạn đã tạo khi chuẩn bị cơ sở dữ liệu:

     mysql -u test_user -p
    
  2. Nhập mật khẩu của test_user và nhấn Enter để tiếp tục.

  3. Bạn sẽ nhận được một mysql > lời nhắc. Tiếp tục bằng cách chọn test_db :

     USE test_db;
    

    Đầu ra:

    Database changed.
  4. Sau đó, nhập các lệnh SQL bên dưới để tạo filter_by_category thủ tục được lưu trữ:

     DELIMITER &&
     CREATE PROCEDURE filter_by_category (IN category VARCHAR(50))
     BEGIN
     SELECT * FROM products WHERE category_name=category;
     END &&
    

    Đầu ra:

    Query OK, 0 rows affected (0.00 sec)
  5. Thay đổi DELIMITER quay lại ;

    DELIMITER ;
    
  6. Nếu mã để tạo thủ tục được lưu trữ chạy thành công, bây giờ bạn có thể chuyển sang thực thi thủ tục đã lưu trữ.

Thực thi một thủ tục đã lưu trữ

Trong bước này, chúng ta sẽ gọi thủ tục được lưu trữ mà chúng ta đã tạo ở trên. Chúng ta sẽ thực hiện theo cú pháp cơ bản sau:

CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
  • Để thực thi filter_by_category thủ tục được lưu trữ mà chúng tôi đã tạo ở trên, hãy nhập lệnh bên dưới:

    CALL filter_by_category('COMPUTER ACCESSORIES');
    

    Quy trình được lưu trữ bây giờ sẽ xuất ra tất cả các sản phẩm trong COMPUTER ACCESSORIES danh mục vì chúng tôi đã chỉ định COMPUTER ACCESSORIES dưới dạng một tham số:

    +------------+-----------------+----------------------+
    | product_id | product_name    | category_name        |
    +------------+-----------------+----------------------+
    |          1 | GAMING KEYBOARD | COMPUTER ACCESSORIES |
    |          2 | OPTICAL MOUSE   | COMPUTER ACCESSORIES |
    |          3 | MOUSE PAD       | COMPUTER ACCESSORIES |
    +------------+-----------------+----------------------+
    3 rows in set (0.00 sec)
    
    Query OK, 0 rows affected (0.01 sec)
  • Tương tự, bạn có thể truy xuất danh sách tất cả các sản phẩm từ ELECTRONICS phân loại bằng cách thực hiện lệnh bên dưới.

    CALL filter_by_category('ELECTRONICS') ;
    

    Đầu ra:

    +------------+-----------------+---------------+
    | product_id | product_name    | category_name |
    +------------+-----------------+---------------+
    |          4 | STEREO SYSTEM   | ELECTRONICS   |
    |          5 | 32 INCH TV      | ELECTRONICS   |
    |          6 | DVB-T2 RECEIVER | ELECTRONICS   |
    +------------+-----------------+---------------+
    3 rows in set (0.00 sec)
    
    Query OK, 0 rows affected (0.01 sec)

Thủ tục được lưu trữ của chúng tôi đã hoạt động như chúng tôi mong đợi. Tiếp theo, chúng ta sẽ tìm hiểu cách loại bỏ các thủ tục đã lưu trữ nếu chúng ta không muốn chúng thực thi nữa.

Xóa thủ tục đã lưu trữ

Bạn có thể xóa một thủ tục được lưu trữ trong MySQL nếu bạn không muốn sử dụng nó nữa hoặc nếu bạn muốn tạo lại nó từ đầu. Cú pháp cơ bản để loại bỏ quy trình đã lưu trữ được hiển thị bên dưới:

DROP PROCEDURE IF EXISTS PROCEDURE_NAME;

Ví dụ:để xóa filter_by_category của chúng tôi thủ tục được lưu trữ, thực hiện lệnh MySQL bên dưới:

DROP PROCEDURE IF EXISTS filter_by_category;

Nếu thủ tục được lưu trữ tồn tại, bạn sẽ nhận được kết quả hiển thị bên dưới:

Query OK, 0 rows affected (0.00 sec)

Đó là tất cả khi nói đến việc tạo, sử dụng và hủy bỏ các thủ tục được lưu trữ trong MySQL.

Thông tin khác

Bạn có thể muốn tham khảo các nguồn sau đây để biết thêm thông tin về chủ đề này. Mặc dù những điều này được cung cấp với hy vọng rằng chúng sẽ hữu ích, xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc kịp thời của các tài liệu được lưu trữ bên ngoài.

  • Làm việc với các thủ tục được lưu trữ trong MySQL

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLException:Không tìm thấy trình điều khiển phù hợp

  2. Tính toán phần trăm từ tần suất trong MySQL

  3. Cách cài đặt MySQL 8 trên Ubuntu

  4. mysqli_stmt ::bind_result ():Số biến ràng buộc không khớp với số trường trong câu lệnh đã chuẩn bị

  5. Mẹo để cung cấp hiệu suất cơ sở dữ liệu MySQL - Phần một