Hướng dẫn delimiter mysql

Hướng dẫn delimiter mysql

Ở bài trước tất cả chúng ta đã khám phá khái niệm Mysql Stored Procedure là gì rồi thì trong bài này tất cả chúng ta sẽ liên tục học chủ đề này. Chúng ta sẽ học cách viết một Stored Procedure mới trong hệ quản trị CSDL MYSQL .

Nội dung chính

  • 1. Tạo bảng Products để viết Procedure
  • 2. Tạo Mysql Stored Procedure đầu tiên
  • Tạo Stored Procedure
  • Gọi Stored Procedure
  • Xem danh sách Stored Procedure trong hệ thống
  • Sửa Stored Procedure đã tạo
  • Lời kết:
  • 1. Tạo Cơ sở dữ liệu Products
  • 2. Các loại tham số trong Mysql Stored Procedure
  • 3. Tham số loại IN trong Mysql Stored Procedure
  • 4. Tham số loại OUT trong Mysql Stored Procedure
  • 5. Tham số dạng INOUT trong Mysql Stored Procedure
  • Lời kết:
  • Video liên quan

Bài viết này được đăng tại

freetuts.net

Bạn đang đọc: Tạo MySQL Stored Procedure đầu tiên – Freetuts

, không được copy dưới mọi hình thức.

Trong bài tất cả chúng ta sẽ viết một Procedure trả về list loại sản phẩm của bảng Products, chính vị vậy thứ nhất bạn phải tạo một bảng tên là Products đã nhé .

1. Tạo bảng Products để viết Procedure

Bạn tạo một Database mới với tên bất kể, sau đó dán đoạn code sau vào trình chạy câu truy vấn để tạo bảng products .

CREATE TABLE IF NOT EXISTS `products` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, `content` TEXT COLLATE utf8_unicode_ci, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ; -- -- Contenu de la table `products` -- INSERT INTO `products` (`id`, `title`, `content`) VALUES (1, 'Học lập trình online tại freetuts.net', 'Gioi thieu website Học lập trình online tại freetuts.net'), (2, 'Tutorials học Stored Procedure', 'Website Tutorials học Stored Procedure');

Câu lệnh này sẽ tạo mới một bảng và thêm vào hai record để ta test. Bây giờ tất cả chúng ta sẽ mở màn khám phá cú pháp khai báo và sử dụng Stored Procedure trong MYSQL .

2. Tạo Mysql Stored Procedure đầu tiên

Trong serie này tôi sử dụng IDE SqlYog để quản lý CSDL nhé, nên nếu muốn học thuận tiện thì bạn nên cài đặt và dụng phần mềm này luôn.

Tạo Stored Procedure

Chúng ta sẽ viết một Procedure với tên là GetAllProducts(), nhiệm vụ của thủ tục này là truy vấn lấy danh sách tất cả sản phẩm nằm trong bảng Products. Nhưng trước tiên chúng ta tìm hiểu cú pháp khai báo tạo mới một Procedure như sau:

DELIMITER $$ CREATE PROCEDURE procedureName() BEGIN /*Xu ly*/ END; $$ DELIMITER ;

Trong đó:

  • Dòng đầu tiên DELIMITER $ $ dùng để phân cách bộ nhớ lưu trữ thủ tục Cache và mở ra một ô lưu trữ mới. Đây là cú pháp nên bắt buộc bạn phải nhập như vậy
  • Dòng CREATE PROCEDURE procedureName() dùng để khai báo tạo một Procedure mới, trong đó procedureName chính là tên thủ tục còn hai từ đầu là từ khóa.
  • BEGINvà END ;$$dùng để khai báo bắt đầu của Procedure và kết thúc Procedure
  • Cuối cùng là đóng lại ô lưu trữ DELIMITER;

Lưu ý là bạn phải tuân theo cú pháp như trên nhé, ban chỉ việc đổi khác tên của thủ tục là ok .
Bây giờ để tạo mới một Procedure với tên là GetAllProduct thì tất cả chúng ta sẽ làm như sau :

DELIMITER $$ CREATE PROCEDURE GetAllProducts() BEGIN /*Xu ly*/ END; $$ DELIMITER ;

Sau đó bạn chạy câu SQL này và nó báo thành công tức là bạn đã tạo mới một thủ tục với tên là GetAllProduct rồi đấy. Nếu như bạn sử dụng SqlYog thì bạn vào table Products và vào mục Stored Procs sẽ thấy một thủ tục vừa được tạo:

Xem thêm: Đúng giờ tiếng Anh là gì? Văn hóa đúng giờ đối với mỗi nước

Gọi Stored Procedure

Tạo xong rồi giờ đây làm thế nào để gọi đến Store này ? Đơn giản để gọi tới Store nào thì ta chỉ cần dùng cú pháp như sau :

CALL storeName();

Như vậy để gọi tới Procedure tên là GetAllProducts thì ta làm như sau :

CALL GetAllProducts();

Chạy câu truy vấn này và bạn sẽ thấy hiệu quả như sau, đây chính là hai records mà ta đã thêm ở phần 1 :

Xem danh sách Stored Procedure trong hệ thống

Nếu bạn không sử dụng SqlYog thì rất khó để quản trị Procedure vì không nhìn thấy được nó. Yên tâm vì trong MYSQL có tương hỗ một số ít lệnh hiển thị dánh sách Stored Procedure bằng cách chạy lệnh sau :

show procedure status;

Sau khi chạy lên bạn sẽ nhận được tác dụng dạng như sau :

Đây chính là Procedure mà ta đã tạo ở trên .

Sửa Stored Procedure đã tạo

Trong Mysql không phân phối lệnh sửa Stored nên thường thì tất cả chúng ta sẽ chạy lệnh tạo mới. Tuy nhiên có một quan tâm đó là nếu như bạn đã chạy lệnh tạo Procedure một lần rồi, sau đó bạn edit và chạy lại thì ngay lập tức sẽ bị báo lỗi ngay vì trùng tên. Để xử lý yếu tố này thì tất cả chúng ta sẽ dùng lệnh Drop để xóa đi Procedure đó và tạo lại :

DELIMITER $$ DROP PROCEDURE IF EXISTS `GetAllProducts`$$ CREATE PROCEDURE `GetAllProducts`() BEGIN SELECT * FROM products; END$$ DELIMITER ;

Và một quan tâm nữa là khi bạn dùng với quyền User nào thì Store đó sẽ có quyền triển khai trong phạm vu của User đó. Ví dụ bạn không có quyền edit mà bạn tạo mới một Procedure Edit thì khi chạy sẽ bị báo lỗi ngay. Chính vì thế thường thì khi edit bạn phải thêm người định nghĩa nó như sau :

DELIMITER $$ DROP PROCEDURE IF EXISTS `GetAllProducts`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `GetAllProducts`() BEGIN SELECT * FROM products; END$$ DELIMITER ;

Dòng chữ DEFINER=`root`@`localhost` chính là tên người đã tạo ra nó.

Lời kết:

Bài này đang ở mức cơ bản hướng dẫn tạo Procedure trong MYSQL thôi chứ không chuyên sâu gì ,. Bài tiếp theo tất cả chúng ta sẽ học cách khai tham số truyền vào cho Procedure và cách truyền biến vào khi gọi hàm. Mời những bạn đón xem nhse .

Source: https://chickgolden.com
Category: Hỏi đáp

Như ta biết thông thường một hàm sẽ có các tham số truyền vào và đối với ngôn ngữ lập trình thì sẽ tồn tại khái niệm tham chiếu và tham trị. Nhưng với Procedure trong MYSQL thì sẽ tồn tại ba loại đó là tham số IN, tham số OUT tham số INOUT tuy nhiên về bản chất thì nó rất giống nhau. Chi tiết thế nào thì chúng ta tìm hiểu ở các phần dưới đây nhé.

Vậy thì trong bài này chúng ta sẽ tìm hiểu cách truyền một tham số (variable) vào một Stored Procedure như thế nào? Nhưng trước tiên chúng ta tìm hiểu cú pháp của nó đã nhé.

Lưu ý trong bài này tôi sử dụng lại CSDL của bài trước đó là bảng Products nhé, nên nếu bạn chưa đọc bài tạo procedure đầu tiên thì vui lòng quay lại đọc để tạo CSDL. Mà thôi tôi đưa vào đây luôn cho tiện theo dõi.

1. Tạo Cơ sở dữ liệu Products

Bạn tạo mới một Database và chạy lệnh SQL tạo bảng sau lệnh này sẽ tạo một bảng products và thêm hai record:

CREATE TABLE IF NOT EXISTS `products` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL, `content` TEXT COLLATE utf8_unicode_ci, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ; -- -- Contenu de la table `products` -- INSERT INTO `products` (`id`, `title`, `content`) VALUES (1, 'Học lập trình online tại freetuts.net', 'Gioi thieu website Học lập trình online tại freetuts.net'), (2, 'Tutorials học Stored Procedure', 'Website Tutorials học Stored Procedure');

2. Các loại tham số trong Mysql Stored Procedure

Chúng ta có hai loại tham số chính trong Procedure đó là:

  • IN: Đây là chế độ mặc định (nghĩa là nếu bạn không định nghĩa loại nào thì nó sẽ hiểu là IN). Khi bạn sử dụng mức này thì nó sẽ được bảo vệ an toàn, có nghĩa là sẽ không bị thay đổi nếu như trong Procedure có tác động đến
  • OUT: Chế độ này nếu như trong Procedure có tác động thay đổi thì nó sẽ thay đổi theo. Nhưng có điều đặc biệt là dù trước khi truyền vào mà bạn gán giá trị cho biến đó thì vẫn sẽ không nhận được vì mặc định nó luôn hiểu giá trị truyền vào là NULL.
  • INOUT: Đây là sự kết hợp giữa IN và OUT. Nghĩa là có thể gán giá trị trướccó thể bị thay đổi nếu trong Procedure có tác động tới

Ví dụ:

DELIMITER $$ CREATE PROCEDURE getById(IN id INT(11)) BEGIN /*Code*/ END; $$ DELIMITER;

Nếu muốn truyền vào nhiều hơn một tham số thì ta sẽ ngăn cách nó bởi dấu phẩy. Ví dụ:

DELIMITER $$ DROP PROCEDURE IF EXISTS getById $$ CREATE PROCEDURE getById(IN id INT(11), IN title VARCHAR(255)) BEGIN /*Code*/ END; $$ DELIMITER;

Thông thường chúng ta viết các tham số xuống hàng để nhìn đẹp hơn. Ví dụ:

DELIMITER $$ DROP PROCEDURE IF EXISTS getById $$ CREATE PROCEDURE getById( IN id INT(11), IN title VARCHAR(255) ) BEGIN /*Code*/ END; $$ DELIMITER;

3. Tham số loại IN trong Mysql Stored Procedure

Như trình bày ở trên tham số này sẽ được bảo vệ và không bị thay đổi trong quá trình sử dụng trong Procedure.

Ví dụ: Viết Store lấy chi tiết sản phẩm theo ID

DELIMITER $$ DROP PROCEDURE IF EXISTS getById $$ CREATE PROCEDURE getById(IN idVal INT(11)) BEGIN SELECT * FROM products WHERE id = idVal; END; $$ DELIMITER;

Chạy Procedure này:

Và ta có giao diện kết quả trả về:

4. Tham số loại OUT trong Mysql Stored Procedure

Loại out nếu trong quá trình thực thi mà Procedure có tác động đến tham số này thì bên ngoài nó ảnh hưởng theo. Khi nhận tham số này thì Procedure sẽ hiểu đó là giá trị NULL nên dù bạn có gán giá trị cho biến trước khi truyền vào nó vẫn lấy NULL.

  • Biến truyền vào phải có chữ @ đằng trước, ví dụ @title

Ví dụ: Truyền tham số title kiểu OUT vào Procedure và đổi giá trị cho nó, sau đó bên ngoài Procedure hiển thị giá trị của title.

DELIMITER $$ DROP PROCEDURE IF EXISTS changeTitle $$ CREATE PROCEDURE changeTitle(OUT title VARCHAR(255)) BEGIN SET title = 'Hoc lap trinh online tai freetuts.net'; END; $$ DELIMITER;

Bây giờ ta gọi Procedure này như sau:

CALL changeTitle(@title); SELECT @title;

Thì kết quả sẽ như sau:

Như vậy ra rút ra kết luận như sau:

  • Khi truyền tham số dạng OUT mục đích là lấy dữ liệu trong Proedure và sử dụng ở bên ngoài.
  • Khi truyền tham số vào dạng OUT phải có chữ @ đằng trước biến
  • Hoạt động giống tham chiếu nên biến truyền vào dạng OUT không cần định nghĩa trước, chính vì vậy khởi đầu nó có giá trị NULL

5. Tham số dạng INOUT trong Mysql Stored Procedure

INOUT là sự kết hợp giữa IN và OUT, nghĩa là:

  • Nó có thể được định nghĩa trước và gán gia trị trước rồi truyền vào Procedure, điều này với dạng OUT thì không thể được nhưng IN thì được.
  • Sau khi thực thi xong nếu trong Procedure có tác động đến thì ảnh hưởng theo. Điêu này dạng IN không được nhưng OUT thì không được.

Ví dụ: Tạo Procedure

DELIMITER $$ DROP PROCEDURE IF EXISTS counter $$ CREATE PROCEDURE counter(INOUT number INT(11)) BEGIN SET number = number + 1; END; $$ DELIMITER;

Gọi sử dụng:

SET @counter = 1; CALL counter(@counter); SELECT @counter;

Và kết quả là 2.

Nhưng nếu ta dùng dạng OUT thì kết quả sẽ là NULL. Lý do là bên trong có tăng lên 1 nhưng nó lấy giá trị truyền vào dạng OUT là NULL nên 1 + NULL sẽ là NULL.

Lời kết:

Bài này bắt đầu thấy căng rồi phải không nào 😀 Thực sự thì với ba loại tham số này rất hay và rất giống với hàm trong các ngôn ngữ lập trình khác đó là tồn tại tham chiếu và tham trị nhưng cách thể hiện khác nhau. Bài tiếp theo chúng ta sẽ tìm hiểu về lệnh IF ELSE trong MySql nhé.