1. Stored Procedure trong MySQL là gì?

  • Stored Procedure (SP) là một tập hợp các câu lệnh SQL được lưu trữ trên máy chủ cơ sở dữ liệu và có thể được gọi để thực hiện một tác vụ cụ thể. Khi sử dụng SP, chúng ta có thể tránh việc gửi nhiều câu lệnh SQL riêng lẻ, tăng hiệu suất và bảo mật.

2. Lợi ích của Stored Procedure trong MySQL là gì?

  • Tăng hiệu suất: Giảm tải cho ứng dụng client vì SP được thực thi trực tiếp trên máy chủ.
  • Tái sử dụng mã lệnh: Một SP có thể được sử dụng lại trong nhiều ứng dụng mà không cần viết lại mã.
  • Bảo mật: SP có thể được cấp quyền truy cập riêng biệt, giúp bảo vệ dữ liệu.
  • Quản lý logic nghiệp vụ: Tập trung logic vào cơ sở dữ liệu giúp giảm lỗi và tăng khả năng bảo trì.

3. Sự khác biệt giữa Stored Procedure và Function trong MySQL là gì?

  • Stored Procedure: Thực hiện một loạt các hành động và có thể không trả về giá trị, hoặc trả về nhiều giá trị thông qua biến OUT.
  • Function: Luôn trả về một giá trị duy nhất và có thể được sử dụng trực tiếp trong câu lệnh SQL (SELECT, WHERE…).

4. Làm thế nào để tạo một Stored Procedure trong MySQL?

Cú pháp để tạo SP trong MySQL:

DELIMITER //
CREATE PROCEDURE procedure_name (IN parameter_name datatype, OUT parameter_name datatype)
BEGIN
  -- logic của SP
END //
DELIMITER ;

5. Làm thế nào để gọi một Stored Procedure trong MySQL?

Để gọi SP, bạn có thể sử dụng lệnh CALL:

CALL procedure_name(parameter1, parameter2);

6. IN, OUT, INOUT trong Stored Procedure có nghĩa là gì?

  • IN: Giá trị được truyền vào SP, chỉ có thể được đọc.
  • OUT: Giá trị được trả về từ SP, chỉ có thể được ghi, không được đọc bên trong SP.
  • INOUT: Giá trị được truyền vào, có thể đọc và ghi bên trong SP, và sẽ được trả về khi kết thúc SP.

7. Làm thế nào để xử lý lỗi trong Stored Procedure?

MySQL cung cấp cơ chế xử lý lỗi bằng cách sử dụng DECLARE HANDLER. Ví dụ:

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
  -- Logic xử lý lỗi
END;

8. Làm thế nào để trả về nhiều giá trị từ một Stored Procedure?

Bạn có thể sử dụng biến OUT để trả về nhiều giá trị:

CREATE PROCEDURE get_user_info(IN user_id INT, OUT name VARCHAR(50), OUT email VARCHAR(50))
BEGIN
  SELECT username, email INTO name, email
  FROM users
  WHERE id = user_id;
END;

9. Stored Procedure có thể gọi một Stored Procedure khác không?

Có, trong MySQL, một SP có thể gọi SP khác. Điều này giúp tạo ra các SP phức tạp và chia nhỏ logic nghiệp vụ:

CALL other_procedure(parameters);

10. Sự khác biệt giữa Stored Procedure và Trigger trong MySQL là gì?

  • Stored Procedure: Được gọi thủ công thông qua lệnh CALL.
  • Trigger: Tự động kích hoạt khi có một sự kiện cụ thể xảy ra (như INSERT, UPDATE, DELETE) trong một bảng.

11. Làm thế nào để sử dụng vòng lặp trong Stored Procedure?

MySQL cung cấp các cấu trúc lặp như LOOP, WHILE, và REPEAT. Ví dụ:

DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
  SET counter = counter + 1;
END WHILE;

12. Stored Procedure có ảnh hưởng đến hiệu suất hệ thống không?

  • SP có thể tăng hiệu suất khi giảm số lượng yêu cầu gửi từ client đến server. Tuy nhiên, nếu không được tối ưu hóa, SP có thể gây nghẽn cổ chai nếu thực hiện quá nhiều phép tính phức tạp trong cơ sở dữ liệu.

13. Làm thế nào để sửa đổi hoặc xóa một Stored Procedure?

Để sửa đổi, bạn cần xóa SP cũ và tạo lại SP mới. Xóa SP bằng cách:

DROP PROCEDURE IF EXISTS procedure_name;

14. Khi nào nên sử dụng Stored Procedure thay vì truy vấn trực tiếp?

  • Sử dụng SP khi cần thực hiện nhiều thao tác phức tạp, tái sử dụng logic nhiều lần, hoặc khi cần tăng cường bảo mật và giảm tải cho ứng dụng client.

15. Làm thế nào để kiểm tra xem một Stored Procedure đã tồn tại chưa?

Bạn có thể kiểm tra bảng information_schema.ROUTINES để xác định xem SP đã tồn tại chưa:

SELECT routine_name
FROM information_schema.ROUTINES
WHERE routine_name = 'procedure_name';