Stored Procedure

Stored Procedure (SP) là đoạn chương trình kịch bản (programming scripts) với các câu lệnh SQL nhúng (embedded SQL) được lưu dưới dạng đã được biên dịch và được thi hành trực tiến bởi SQL Server. SP cho phép lưu trữ các logic ứng dụng trên CSDL.

Ưu điểm của SP:

  • Giảm dư thừa mã chương trình: Các đoạn mã tương tự trong các ứng dụng như thêm, cập nhật có thể lưu ở phía CSDL
  • Bảo trì: Nếu có sự thay đổi trong CSDL, mã lệnh cần thay đổi có thể xác định trong các SP
  • An ninh CSDL tốt hơn: Trong các ứng dụng an ninh cao, với SP có thể kiểm soát truy cập dữ liệu và đưa ra các qui định an ninh tập trung.

Nhược điểm của SP:

  • Thiếu tính khả chuyển (Lack of Portability)

SP khó chuyển từ một DBMS sang một DBMS khác. Yêu cầu lập trình  và kiểm thử lại đáng kể.

SQLServer: T-SQL.

Oracle:PL-SQL.

  • Tải DB SERVER

Sử dụng SP nhiều có thể gây quá tải MySQL Server.

  • Hạn chế ngôn ngữ lập trình:

Lập trình SP không phong phú như các nền tảng phát triển khác như Java hay PHP.

Lưu ý: Các phiên bản tương lai của MySQL có thể cung cấp các giao diện cho phép tạo các SP sử dụng các ngôn ngữ bên ngoài, ví dụ Java.
Thủ tục, Hàm

Thủ tục Hàm
Gọi Sử dụng CALL Sử dụng trong các lệnh SQL như Select, Update
Giá trị trả về Có thể một hoặc nhiều kết quả SELECT và các tham số out Trả về một giá trị duy nhất thông qua RETURN
Các tham số Giá trị (input) và tham chiếu

(output) Các tham số (IN,OUT, INOUT)

Chỉ các giá trị tham số vào (input). Không cần các thẻ như IN..
Gọi thủ tục/hàm Có thể gọi các thủ tục và hàm khác Chỉ có thể gọi các hàm khác

Ví dụ
Ví dụ 1:

DELIMITER $$
CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT)
READS SQL DATA
BEGIN
SELECT inventory_id
FROM inventory
WHERE film_id = p_film_id
AND store_id = p_store_id
AND inventory_in_stock(inventory_id);
SELECT FOUND_ROWS() INTO p_film_count;
END $$
DELIMITER ;

Ví dụ 2:

CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN
READS SQL DATA
BEGIN
DECLARE v_rentals INT;
DECLARE v_out INT;
SELECT COUNT(*) INTO v_rentals
FROM rental WHERE inventory_id = p_inventory_id;
IF v_rentals = 0 THEN
RETURN TRUE;
END IF;
SELECT COUNT(rental_id) INTO v_out
FROM inventory LEFT JOIN rental USING(inventory_id)
WHERE inventory.inventory_id = p_inventory_id
AND rental.return_date IS NULL;
IF v_out > 0 THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END $$

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">