Hàm là một khối mã có tổ chức, có thể sử dụng lại được dùng để thực hiện một hành động đơn lẻ có liên quan. Các chức năng cung cấp tính mô-đun tốt hơn cho ứng dụng của bạn và mức độ tái sử dụng mã cao
MySQL cung cấp một bộ hàm dựng sẵn thực hiện các tác vụ cụ thể, ví dụ hàm CURDATE[] trả về ngày hiện tại
Bạn có thể tạo một hàm được lưu trữ bằng cách sử dụng câu lệnh CREATE FUNCTION
cú pháp
Sau đây là cú pháp câu lệnh CREATE FUNCTION -
CREATE FUNCTION function_Name[input_arguments] RETURNS output_parameter
Trong đó, function_name là tên hàm bạn cần tạo, input_arguments là giá trị đầu vào của hàm và output_parameter là giá trị trả về của hàm
ví dụ 1
Giả sử chúng ta đã tạo một bảng có tên Emp trong cơ sở dữ liệu bằng cách sử dụng câu lệnh CREATE như hình dưới đây -
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]
Và chúng tôi đã chèn ba bản ghi vào bảng Emp dưới dạng -
mysql> INSERT INTO Emp VALUES ['Amit', DATE['1970-01-08'], 'Hyderabad']; mysql> INSERT INTO Emp VALUES ['Sumith', DATE['1990-11-02'], 'Vishakhapatnam']; mysql> INSERT INTO Emp VALUES ['Sudha', DATE['1980-11-06'], 'Vijayawada'];
Truy vấn sau tạo một hàm có tên getDob[] chấp nhận tên của nhân viên, truy xuất và trả về giá trị của cột DOB
mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]] RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected [0.31 sec] mysql> DELIMITER ;
Nếu bạn gọi hàm, bạn có thể nhận được ngày sinh của một nhân viên như hình bên dưới -
mysql> SELECT getDob['Amit']; +----------------+ | getDob['Amit'] | +----------------+ | 1970-01-08 | +----------------+ 1 row in set [0.15 sec]
ví dụ 2
Giả sử chúng ta đã tạo một bảng khác như hình bên dưới -
CREATE TABLE student [Name VARCHAR[100], Math INT, English INT, Science INT, History INT]; INSERT INTO student values['Raman', 95, 89, 85, 81]; INSERT INTO student values['Rahul' , 90, 87, 86, 81]; INSERT INTO student values['Mohit', 90, 85, 86, 81]; INSERT INTO student values['Saurabh', NULL, NULL, NULL, NULL ];
Truy vấn sau tạo một hàm có tên tbl_Update −
mysql> DELIMITER // Create Function tbl_Update[S_name Varchar[50], M1 INT, M2 INT, M3 INT, M4 INT] RETURNS INT DETERMINISTIC BEGIN UPDATE student SET Math = M1, English = M2, Science = M3, History = M4 WHERE Name = S_name; RETURN 1; END // mysql> DELIMITER ;
Bạn có thể gọi hàm đã tạo ở trên như hình bên dưới -
mysql> Select tbl_update['Saurabh',85,69,75,82]; +-----------------------------------+ | tbl_update['Saurabh',85,69,75,82] | +-----------------------------------+ | 1 | +-----------------------------------+ 1 row in set [0.28 sec]
Nếu bạn lấy các bản ghi của bảng student bằng câu lệnh select, bạn có thể quan sát bản ghi đã sửa đổi -
Câu lệnh CREATE FUNCTION được sử dụng để tạo một hàm được lưu trữ và các hàm do người dùng định nghĩa. Hàm được lưu trữ là một tập hợp các câu lệnh SQL thực hiện một số thao tác và trả về một giá trị
Bản tóm tắt. trong hướng dẫn này, bạn sẽ học cách tạo các hàm được lưu trữ bằng cách sử dụng câu lệnh
mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]] RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected [0.31 sec] mysql> DELIMITER ;3
Hàm được lưu trữ là một chương trình được lưu trữ loại đặc biệt trả về một giá trị duy nhất. Thông thường, bạn sử dụng các hàm được lưu trữ để đóng gói các công thức hoặc quy tắc kinh doanh phổ biến có thể sử dụng lại giữa các câu lệnh SQL hoặc các chương trình được lưu trữ
Khác với một thủ tục được lưu trữ, bạn có thể sử dụng một hàm được lưu trữ trong các câu lệnh SQL ở bất cứ nơi nào một biểu thức được sử dụng. Điều này giúp cải thiện khả năng đọc và khả năng bảo trì của mã thủ tục
Để tạo một chức năng được lưu trữ, bạn sử dụng câu lệnh
mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]] RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected [0.31 sec] mysql> DELIMITER ;3
Cú pháp MySQL mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]]
RETURNS DATE
DETERMINISTIC
BEGIN
declare dateOfBirth DATE;
select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
return dateOfBirth;
END//
Query OK, 0 rows affected [0.31 sec]
mysql> DELIMITER ;
3
Sau đây minh họa cú pháp cơ bản để tạo một hàm được lưu trữ mới
________số 8Trong cú pháp này
Trước tiên, hãy chỉ định tên của hàm được lưu trữ mà bạn muốn tạo sau từ khóa
mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]] RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected [0.31 sec] mysql> DELIMITER ;3
Thứ hai, liệt kê tất cả các tham số của hàm được lưu trữ bên trong dấu ngoặc đơn theo sau là tên hàm. Theo mặc định, tất cả các tham số là tham số
90. Câu lệnh
DELIMITER $$ CREATE FUNCTION CustomerLevel[ credit DECIMAL[10,2] ] RETURNS VARCHAR[20] DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR[20]; IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]90 trả về một giá trị cho các chương trình đang gọi. Bất cứ khi nào đạt đến câu lệnh
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]90, việc thực thi chức năng được lưu trữ sẽ bị chấm dứt ngay lập tức
Ví dụ về MySQL mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]]
RETURNS DATE
DETERMINISTIC
BEGIN
declare dateOfBirth DATE;
select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
return dateOfBirth;
END//
Query OK, 0 rows affected [0.31 sec]
mysql> DELIMITER ;
3
Hãy lấy ví dụ về việc tạo một chức năng được lưu trữ. Chúng tôi sẽ sử dụng bảng
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]94 trong cơ sở dữ liệu mẫu để trình diễn
Câu lệnh
mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]] RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected [0.31 sec] mysql> DELIMITER ;3 sau đây tạo một hàm trả về cấp khách hàng dựa trên tín dụng
96 hiện tại bằng cách sử dụng
DELIMITER $$ CREATE FUNCTION CustomerLevel[ credit DECIMAL[10,2] ] RETURNS VARCHAR[20] DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR[20]; IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF [credit >= 50000 AND credit CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]97 như sau
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]9
Gọi hàm được lưu trữ trong câu lệnh SQL
Câu lệnh sau sử dụng hàm được lưu trữ
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]98
mysql> INSERT INTO Emp VALUES ['Amit', DATE['1970-01-08'], 'Hyderabad']; mysql> INSERT INTO Emp VALUES ['Sumith', DATE['1990-11-02'], 'Vishakhapatnam']; mysql> INSERT INTO Emp VALUES ['Sudha', DATE['1980-11-06'], 'Vijayawada'];8
Gọi một hàm được lưu trữ trong một thủ tục được lưu trữ
Câu lệnh sau đây tạo một thủ tục được lưu trữ mới gọi hàm được lưu trữ
mysql> CREATE TABLE Emp[Name VARCHAR[255], DOB DATE, Location VARCHAR[255]]; Query OK, 0 rows affected [2.03 sec]99
mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]] RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected [0.31 sec] mysql> DELIMITER ;0
Phần sau đây minh họa cách gọi thủ tục được lưu trữ
mysql> INSERT INTO Emp VALUES ['Amit', DATE['1970-01-08'], 'Hyderabad']; mysql> INSERT INTO Emp VALUES ['Sumith', DATE['1990-11-02'], 'Vishakhapatnam']; mysql> INSERT INTO Emp VALUES ['Sudha', DATE['1980-11-06'], 'Vijayawada'];80
mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob[emp_name VARCHAR[50]] RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected [0.31 sec] mysql> DELIMITER ;2
Điều quan trọng cần lưu ý là nếu một hàm được lưu trữ chứa các câu lệnh SQL truy vấn dữ liệu từ các bảng, thì bạn không nên sử dụng nó trong các câu lệnh SQL khác;
Trong hướng dẫn này, bạn đã học cách tạo một hàm được lưu trữ để đóng gói công thức chung hoặc quy tắc kinh doanh