Feb 2, 2010

10:02 PM - 9 comments

Giới thiệu về stored procedure trong MySQL (P.7)

Con trỏ trong Stored Procedures

MySQl hỗ trợ con trỏ trong cả stored procedures, hàm và triggers. Con trỏ được dùng để duyệt theo từng hàng bảng kết quả trả về từ câu truy vấn và xử lý các hàng đó. Tất cả những version sau MySQL 5.x đều hỗ trợ con trỏ với các thuộc tính sau:

* Read only: bạn không thể update con trỏ
* Non-scrollable: con trỏ chỉ có thể di chuyển theo 1 hướng và không thể bỏ qua bất cứ 1 hàng nào, trượt tới hay trượt lùi trong bản kết quả.
* Asensitive: bạn nên tránh update 1 table trong khi vẫn đang mở con trỏ trong chính table đó. Nếu không bạn sẽ nhận được những kết quả không mong đợi

MySQL hỗ trợ các phát biểu sau khi làm việc với con trỏ:

Khai báo 1 con trỏ với phát biểu DECLARE

Mã:
 DECLARE cursor_name CURSOR FOR SELECT_statement;
Mở con trỏ bằng phát biểu OPEN. Bạn phải mở con trỏ trước khi duyệt qua bất cứ dòng nào trong bảng kết quả:

Mã:
 OPEN cursor_name;
Nhận dữ liệu ở dòng hiện tại trong bản kết quả và di chuyển con trỏ đến dòng kế tiếp bằng phát biểu FETCH:

Mã:
 FETCH cursor_name INTO variable list;
Cuối cùng, đóng con trỏ để vô hiệu hóa và giải phóng bộ nhớ. Sử dụng phát biểu:

Mã:
CLOSE cursor_name;

Một điểm quan trọng khi làm việc với con trỏ là bạn nên sử dụng điều khiển NOT FOUND để tránh gặp phải lỗi “no data to fetch”. Chúng ta sử dụng 1 ví dụ nhỏ dưới đây để demo về con trỏ:

Mã:
DELIMITER $$
DROP PROCEDURE IF EXISTS CursorProc$$
CREATE PROCEDURE CursorProc()
BEGIN

DECLARE no_more_products, quantity_in_stock INT DEFAULT 0;
DECLARE prd_code VARCHAR(255);
DECLARE cur_product CURSOR FOR
SELECT productCode FROM products;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_products = 1;

/* for loggging information */
CREATE TABLE infologs (
Id int(11) NOT NULL AUTO_INCREMENT,
Msg varchar(255) NOT NULL,
PRIMARY KEY (Id)

);

OPEN cur_product;
FETCH cur_product INTO prd_code;
REPEAT
SELECT quantityInStock INTO quantity_in_stock
FROM products
WHERE productCode = prd_code;
IF quantity_in_stock < 100 THEN
INSERT INTO infologs(msg)
VALUES (prd_code);
END IF;
FETCH cur_product INTO prd_code;
UNTIL no_more_products = 1
END REPEAT;
CLOSE cur_product;
SELECT * FROM infologs;
DROP TABLE infologs;
END$$
DELIMITER;

Stored procedure này khá đơn giản và có thể thay bằng truy vấn SQL. Chúng ta chỉ sử dụng cho mục đích demo cách thức làm việc của con trỏ

Ta dùng con trỏ để làm việc với table products. Nếu số lượng trong kho của product nhỏ hơn 100, tiến hành ghi lại log trong 1 bảng tạm và sau đó select tất cả các sản phẩm để in ra trong 1 màn hình.

Nhớ là bạn phải khai báo con trỏ trước tiên và sau đó khai báo điều khiển NOT FOUND, nếu không bạn sẽ gặp phải lỗi.

9 comments:

ôi trời cho hỏi tẹo

OPEN cur_product;
FETCH cur_product INTO prd_code;
REPEAT
SELECT quantityInStock INTO quantity_in_stock
FROM products
WHERE productCode = prd_code;
IF quantity_in_stock < 100 THEN
INSERT INTO infologs(msg)
VALUES (prd_code);
END IF;
FETCH cur_product INTO prd_code;
UNTIL no_more_products = 1 --*** cho nay tinh' sao day cái no_more này làm sao mà bằng 1 dc chứ mà nó có liên qua gì tớ vong lặp đâu chịu hết nỗi...
END REPEAT;

- O tren minh da set SET no_more_products = 1;
- O duoi minh lap cho den khi no_more_products = 1. Nghia la vong lap chi chay 1 lan thoi.
-Di nhien doan code nay khong thuc su "make sense", cho nen chi dung cho muc dich demo thoi ban.

Copy ở đâu vậy bác?
Ở đây hả? https://sites.google.com/site/ndhcuong/courses/thuc-hanh-mysql/chuong-4-thu-tuc-thuong-tru/bai-07-con-tro-trong-thu-thuc-thuong-tru

Đây là link gốc trên diễn đàn do mình viết: http://www.tuoitrehoaian.net/diendan/showthread.php?t=1985
Đây là ngày tháng trên trang google site của ai đó: https://sites.google.com/site/ndhcuong/courses/thuc-hanh-mysql/c00---thong-bao
Mình rất ghét cái kiểu buộc tội người khác một cách vô trách nhiệm như thế.

Hi!Cho minh hoi cach truyen bien trong Procedure trong truong hop nay nhu the nao nhe
Procedure SP_AAA(in year TEXT)
Begin
select * from tbBang_$year
end
Vay Truyen bien nhu the nay co dung khong?

Bài viết hay.Thank nhiều

@Anonymous: ban coi lai phan 4 nhe !

Mình xem phần 4 rồi mà không thấy! Nếu được bạn hướng dẫn dùm mình cái

Thanks!

Xem phần 4 là xem cách truyền param trong store, chỉ cần xem ví dụ trong phần 4 là biết cách dùng thôi chứ làm gì có chính xác cái bạn cần. Mình viết rất dễ hiểu mà bạn.

Post a Comment