Hướng dẫn how do i create a stored function in mysql? - làm cách nào để tạo một chức năng được lưu trữ trong mysql?

Cải thiện bài viết

Lưu bài viết

Tuyên bố chức năng tạo được sử dụng để tạo chức năng được lưu trữ và các hàm do người dùng xác định. 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ố hoạt động và trả về một giá trị duy nhất.CREATE FUNCTION statement is used for creating a stored function and user-defined functions. A stored function is a set of SQL statements that perform some operation and return a single value.

Giống như hàm được xây dựng của MySQL, nó có thể được gọi từ trong câu lệnh MySQL.

Theo mặc định, hàm được lưu trữ được liên kết với cơ sở dữ liệu mặc định.

Tuyên bố chức năng tạo yêu cầu tạo đặc quyền cơ sở dữ liệu thường xuyên.CREATE FUNCTION statement require CREATE ROUTINE database privilege.

Cú pháp: & nbsp; Cú pháp để tạo câu lệnh chức năng trong mysql là: & nbsp; & nbsp; 
The syntax for CREATE FUNCTION statement in Mysql is: 
 

CREATE FUNCTION function_name(func_parameter1, func_parameter2, ..)
          RETURN datatype [characteristics]
          func_body

Các tham số được sử dụng:

  1. function_name: & nbsp; nó là tên mà hàm được lưu trữ được gọi. Tên không được giống như hàm gốc (build_in). Để liên kết thường xuyên một cách rõ ràng với một tên chức năng cơ sở dữ liệu cụ thể phải được đưa ra dưới dạng cơ sở dữ liệu_name.func_name. 
    It is the name by which stored function is called. The name should not be same as native(built_in) function. In order to associate routine explicitly with a specific database function name should be given as database_name.func_name.
  2. func_parameter: & nbsp; đó là đối số có giá trị được sử dụng bởi hàm bên trong cơ thể của nó. Bạn có thể chỉ định cho các tham số này trong, ra, ra. Tuyên bố tham số bên trong ngoặc đơn được cung cấp dưới dạng loại func_parameter. Ở đây, loại đại diện cho một kiểu dữ liệu MySQL hợp lệ. 
    It is the argument whose value is used by the function inside its body. You can’t specify to these parameters IN, OUT, INOUT. The parameter declaration inside parenthesis is provided as func_parameter type. Here, type represents a valid Mysql datatype.
  3. Kiểu dữ liệu: & nbsp; nó là kiểu dữ liệu của giá trị được trả về bởi hàm. 
    It is datatype of value returned by function.
  4. Đặc điểm: & nbsp; Câu lệnh Hàm tạo chỉ được chấp nhận nếu ít nhất một trong các đặc điểm {xác định, không có SQL hoặc đọc dữ liệu SQL} được chỉ định trong khai báo của nó. 
    The CREATE FUNCTION statement is accepted only if at least one of the characteristics { DETERMINISTIC, NO SQL, or READS SQL DATA } is specified in its declaration.

Func_body là tập hợp các câu lệnh MySQL thực hiện hoạt động. Cấu trúc của nó như sau: is the set of Mysql statements that perform operation. It’s structure is as follows:

BEGIN

        Mysql Statements

        RETURN expression;
END

Cơ quan chức năng phải chứa một câu lệnh trả về. & Nbsp; & nbsp;
 

Example:

Xem xét bảng nhân viên sau-

emp_idfnameLNAMEstart_date
1 Michaelthợ rèn2001-06-22
2 SusanVỏ cây2002-09-12
3 RobertTvler2000-02-09
4 SusanVỏ cây2002-09-12

Robert

DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;

Tvler

Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;

Output:  

emp_idfnameLNAMEMichael
1 Michaelthợ rèn18
2 SusanVỏ cây17
3 RobertTvler19
4 SusanVỏ cây17

13.1.17 & nbsp; Tạo quy trình và tạo các câu lệnh chức năng

CREATE
    [DEFINER = user]
    PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = user]
    FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

routine_body:
    Valid SQL routine statement

Các câu lệnh này được sử dụng để tạo ra một thói quen được lưu trữ (một quy trình hoặc chức năng được lưu trữ). Đó là, thói quen được chỉ định được biết đến với máy chủ. Theo mặc định, một thói quen được lưu trữ được liên kết với cơ sở dữ liệu mặc định. Để liên kết rõ ràng một cách rõ ràng với một cơ sở dữ liệu đã cho, chỉ định tên là db_name.sp_name khi bạn tạo nó.

Câu lệnh

BEGIN

        Mysql Statements

        RETURN expression;
END
0 cũng được sử dụng trong MySQL để hỗ trợ các chức năng có thể tải. Xem Phần & NBSP; 13.7.4.1, Tạo câu lệnh Chức năng cho các chức năng tải. Một hàm có thể tải có thể được coi là một hàm được lưu trữ bên ngoài. Các chức năng được lưu trữ chia sẻ không gian tên của họ với các chức năng có thể tải. Xem Phần & NBSP; 9.2.5, Phân tích tên chức năng và độ phân giải của Hồi giáo, cho các quy tắc mô tả cách máy chủ diễn giải các tham chiếu đến các loại chức năng khác nhau.

Để gọi một quy trình được lưu trữ, hãy sử dụng câu lệnh

BEGIN

        Mysql Statements

        RETURN expression;
END
1 (xem Phần & NBSP; 13.2.1, Tuyên bố cuộc gọi của Hồi giáo). Để gọi một chức năng được lưu trữ, hãy tham khảo nó trong một biểu thức. Hàm trả về một giá trị trong quá trình đánh giá biểu thức.

BEGIN

        Mysql Statements

        RETURN expression;
END
2 và
BEGIN

        Mysql Statements

        RETURN expression;
END
0 yêu cầu đặc quyền
BEGIN

        Mysql Statements

        RETURN expression;
END
4. Nếu điều khoản
BEGIN

        Mysql Statements

        RETURN expression;
END
5 có mặt, các đặc quyền cần thiết phụ thuộc vào giá trị
BEGIN

        Mysql Statements

        RETURN expression;
END
6, như đã thảo luận trong Phần & NBSP; 25.6, điều khiển truy cập đối tượng được lưu trữ. Nếu ghi nhật ký nhị phân được bật,
BEGIN

        Mysql Statements

        RETURN expression;
END
0 có thể yêu cầu đặc quyền
BEGIN

        Mysql Statements

        RETURN expression;
END
8, như được thảo luận trong Phần & NBSP; 25.7, chương trình lưu trữ của chương trình đăng nhập nhị phân.

Theo mặc định, MySQL tự động cấp cho các đặc quyền

BEGIN

        Mysql Statements

        RETURN expression;
END
9 và
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
0 cho người tạo thông thường. Hành vi này có thể được thay đổi bằng cách vô hiệu hóa biến hệ thống
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
1. Xem Phần & NBSP; 25.2.2, Các thói quen được lưu trữ và đặc quyền MySQL.

Các điều khoản

BEGIN

        Mysql Statements

        RETURN expression;
END
5 và
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
3 chỉ định bối cảnh bảo mật sẽ được sử dụng khi kiểm tra các đặc quyền truy cập tại thời gian thực hiện thông thường, như được mô tả sau trong phần này.

Nếu tên thông thường giống như tên của hàm SQL tích hợp, lỗi cú pháp xảy ra trừ khi bạn sử dụng khoảng trống giữa tên và dấu ngoặc đơn sau khi xác định thói quen hoặc gọi nó sau. Vì lý do này, tránh sử dụng tên của các hàm SQL hiện có cho các thói quen được lưu trữ của riêng bạn.

Chế độ

DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
4 SQL áp dụng cho các chức năng tích hợp, không phải cho các thói quen được lưu trữ. Luôn luôn được phép có không gian sau một tên thường xuyên được lưu trữ, bất kể
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
4 có được bật hay không.

DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
6 Ngăn chặn lỗi xảy ra nếu đã tồn tại một thói quen có cùng tên. Tùy chọn này được hỗ trợ với cả
BEGIN

        Mysql Statements

        RETURN expression;
END
0 và
BEGIN

        Mysql Statements

        RETURN expression;
END
2 bắt đầu bằng MySQL 8.0,0,29.

Nếu một hàm tích hợp có cùng tên đã tồn tại, cố gắng tạo ra một hàm được lưu trữ với

DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
9 thành công với cảnh báo cho thấy nó có cùng tên với hàm gốc; Điều này không khác gì khi thực hiện cùng một câu lệnh
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
0 mà không chỉ định
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
1.

Nếu một hàm có thể tải có cùng tên đã tồn tại, cố gắng tạo chức năng được lưu trữ bằng cách sử dụng

Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
1 thành công với cảnh báo. Điều này giống như không chỉ định
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
6.

Xem độ phân giải tên chức năng, để biết thêm thông tin.

Danh sách tham số được đặt trong ngoặc đơn phải luôn luôn có mặt. Nếu không có tham số, nên sử dụng danh sách tham số trống của

Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
4. Tên tham số không nhạy cảm trường hợp.

Mỗi tham số là một tham số

Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
5 theo mặc định. Để chỉ định khác cho một tham số, hãy sử dụng từ khóa
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
6 hoặc
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
7 trước tên tham số.

Ghi chú

Chỉ định một tham số là

Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
5,
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
6 hoặc
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
7 chỉ có giá trị đối với
CREATE
    [DEFINER = user]
    PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = user]
    FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

routine_body:
    Valid SQL routine statement
1. Đối với
CREATE
    [DEFINER = user]
    PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = user]
    FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

routine_body:
    Valid SQL routine statement
2, các tham số luôn được coi là các tham số
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
5.

Một tham số

Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
5 chuyển một giá trị vào một thủ tục. Quy trình có thể sửa đổi giá trị, nhưng việc sửa đổi không hiển thị cho người gọi khi thủ tục trả về. Một tham số
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
6 chuyển một giá trị từ quy trình trở lại người gọi. Giá trị ban đầu của nó là
CREATE
    [DEFINER = user]
    PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = user]
    FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

routine_body:
    Valid SQL routine statement
6 trong quy trình và giá trị của nó được hiển thị cho người gọi khi thủ tục trả về. Một tham số
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
7 được người gọi khởi tạo, có thể được sửa đổi theo quy trình và bất kỳ thay đổi nào được thực hiện bởi quy trình đều có thể nhìn thấy cho người gọi khi thủ tục trả về.

Đối với mỗi tham số

Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
6 hoặc
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
7, hãy truyền một biến do người dùng xác định trong câu lệnh
BEGIN

        Mysql Statements

        RETURN expression;
END
1 gọi quy trình để bạn có thể nhận được giá trị của nó khi thủ tục trả về. Nếu bạn đang gọi quy trình từ trong một quy trình hoặc chức năng được lưu trữ khác, bạn cũng có thể truyền một tham số thường quy hoặc biến thường xuyên cục bộ dưới dạng tham số
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
6 hoặc
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
7. Nếu bạn đang gọi quy trình từ trong một kích hoạt, bạn cũng có thể vượt qua
mysql> delimiter //

mysql> CREATE PROCEDURE citycount (IN country CHAR(3), OUT cities INT)
       BEGIN
         SELECT COUNT(*) INTO cities FROM world.city
         WHERE CountryCode = country;
       END//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

mysql> CALL citycount('JPN', @cities); -- cities in Japan
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|     248 |
+---------+
1 row in set (0.00 sec)

mysql> CALL citycount('FRA', @cities); -- cities in France
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|      40 |
+---------+
1 row in set (0.00 sec)
3 dưới dạng tham số
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
6 hoặc
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
7.

Để biết thông tin về ảnh hưởng của các điều kiện chưa được xử lý đối với các tham số thủ tục, xem Phần & NBSP; 13.6.7.8, Xử lý điều kiện và ra các tham số hoặc ra các tham số.

Các tham số thông thường không thể được tham chiếu trong các câu lệnh được chuẩn bị trong thói quen; Xem Phần & NBSP; 25.8, Hạn chế trên các chương trình được lưu trữ.

Ví dụ sau đây cho thấy một quy trình được lưu trữ đơn giản, được đưa ra một mã quốc gia, đếm số lượng thành phố cho quốc gia đó xuất hiện trong bảng

mysql> delimiter //

mysql> CREATE PROCEDURE citycount (IN country CHAR(3), OUT cities INT)
       BEGIN
         SELECT COUNT(*) INTO cities FROM world.city
         WHERE CountryCode = country;
       END//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

mysql> CALL citycount('JPN', @cities); -- cities in Japan
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|     248 |
+---------+
1 row in set (0.00 sec)

mysql> CALL citycount('FRA', @cities); -- cities in France
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|      40 |
+---------+
1 row in set (0.00 sec)
6 của cơ sở dữ liệu
mysql> delimiter //

mysql> CREATE PROCEDURE citycount (IN country CHAR(3), OUT cities INT)
       BEGIN
         SELECT COUNT(*) INTO cities FROM world.city
         WHERE CountryCode = country;
       END//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

mysql> CALL citycount('JPN', @cities); -- cities in Japan
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|     248 |
+---------+
1 row in set (0.00 sec)

mysql> CALL citycount('FRA', @cities); -- cities in France
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|      40 |
+---------+
1 row in set (0.00 sec)
7. Mã quốc gia được truyền bằng tham số
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
5 và số lượng thành phố được trả về bằng tham số
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
6:

mysql> delimiter //

mysql> CREATE PROCEDURE citycount (IN country CHAR(3), OUT cities INT)
       BEGIN
         SELECT COUNT(*) INTO cities FROM world.city
         WHERE CountryCode = country;
       END//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

mysql> CALL citycount('JPN', @cities); -- cities in Japan
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|     248 |
+---------+
1 row in set (0.00 sec)

mysql> CALL citycount('FRA', @cities); -- cities in France
Query OK, 1 row affected (0.00 sec)

mysql> SELECT @cities;
+---------+
| @cities |
+---------+
|      40 |
+---------+
1 row in set (0.00 sec)

Ví dụ sử dụng lệnh MySQL Client

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
0 để thay đổi dấu phân cách câu lệnh từ
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
1 thành
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
2 trong khi quy trình đang được xác định. Điều này cho phép dấu phân cách
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
1 được sử dụng trong thân quy trình được truyền qua máy chủ thay vì được chính MySQL giải thích. Xem Phần & NBSP; 25.1, Xác định các chương trình được lưu trữ.mysql client
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
0 command to change the statement delimiter from
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
1 to
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
2 while the procedure is being defined. This enables the
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
1 delimiter used in the procedure body to be passed through to the server rather than being interpreted by mysql itself. See Section 25.1, “Defining Stored Programs”.

Điều khoản

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
4 chỉ có thể được chỉ định cho một
CREATE
    [DEFINER = user]
    PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = user]
    FUNCTION [IF NOT EXISTS] sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

routine_body:
    Valid SQL routine statement
2, mà nó là bắt buộc. Nó chỉ ra loại trả về của hàm và thân hàm phải chứa câu lệnh
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
6. Nếu câu lệnh
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
7 trả về giá trị của một loại khác, giá trị bị ép theo loại thích hợp. Ví dụ: nếu một hàm chỉ định giá trị
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
8 hoặc
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
9 trong mệnh đề
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
4, nhưng câu lệnh
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
7 trả về một số nguyên, giá trị được trả về từ hàm là chuỗi cho thành viên
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
8 tương ứng của các thành viên
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
9.

Hàm ví dụ sau đây có tham số, thực hiện thao tác bằng hàm SQL và trả về kết quả. Trong trường hợp này, việc sử dụng

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
0 là không cần thiết vì định nghĩa hàm không chứa dấu phân cách câu lệnh
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
1 nội bộ:

mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)

Các loại tham số và các loại trả về chức năng có thể được khai báo để sử dụng bất kỳ loại dữ liệu hợp lệ nào. Thuộc tính

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
6 có thể được sử dụng nếu có trước thông số kỹ thuật
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
7.

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
8 bao gồm một tuyên bố thường xuyên SQL hợp lệ. Đây có thể là một tuyên bố đơn giản như
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
9 hoặc
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
0 hoặc một câu lệnh ghép được viết bằng cách sử dụng
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
1 và
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
2. Các câu lệnh ghép có thể chứa các tuyên bố, vòng lặp và các câu lệnh cấu trúc kiểm soát khác. Cú pháp cho các câu lệnh này được mô tả trong Phần & NBSP; 13.6, Syntax của Tuyên bố Hợp chất. Trong thực tế, các chức năng được lưu trữ có xu hướng sử dụng các câu lệnh ghép, trừ khi cơ thể bao gồm một câu
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT hello('world');
+----------------+
| hello('world') |
+----------------+
| Hello, world!  |
+----------------+
1 row in set (0.00 sec)
7 duy nhất.

MySQL cho phép các thói quen chứa các câu lệnh DDL, chẳng hạn như

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
4 và
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
5. MySQL cũng cho phép các quy trình được lưu trữ (nhưng không được lưu trữ các chức năng) để chứa các báo cáo giao dịch SQL như
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
6. Các chức năng được lưu trữ có thể không chứa các câu lệnh thực hiện cam kết hoặc rollback rõ ràng. Hỗ trợ cho các tuyên bố này không được yêu cầu bởi tiêu chuẩn SQL, trong đó nêu rõ rằng mỗi nhà cung cấp DBMS có thể quyết định có nên cho phép chúng hay không.

Các câu lệnh trả về một tập kết quả có thể được sử dụng trong một quy trình được lưu trữ nhưng không nằm trong hàm được lưu trữ. Sự cấm đoán này bao gồm các tuyên bố

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
9 không có mệnh đề
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
8 và các tuyên bố khác như
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
9, db_name.sp_name0 và db_name.sp_name1. Đối với các câu lệnh có thể được xác định tại thời gian định nghĩa chức năng để trả về một tập kết quả, xảy ra lỗi db_name.sp_name2 (db_name.sp_name3). Đối với các câu lệnh chỉ có thể được xác định trong thời gian chạy để trả về một tập kết quả, xảy ra lỗi db_name.sp_name4 (db_name.sp_name5).

db_name.sp_name6 Các tuyên bố trong các thói quen được lưu trữ không được phép. Khi một thói quen được gọi, một db_name.sp_name7 ngầm được thực hiện (và hoàn tác khi thông thường kết thúc). Nguyên nhân thường trình có cơ sở dữ liệu mặc định đã cho trong khi nó thực thi. Các tham chiếu đến các đối tượng trong cơ sở dữ liệu khác với cơ sở dữ liệu mặc định thường xuyên phải đủ điều kiện với tên cơ sở dữ liệu phù hợp.

Để biết thêm thông tin về các tuyên bố không được phép trong các thói quen được lưu trữ, xem Phần & NBSP; 25.8, Hạn chế đối với các chương trình được lưu trữ.

Để biết thông tin về việc gọi các quy trình được lưu trữ từ bên trong các chương trình được viết bằng ngôn ngữ có giao diện MySQL, xem Phần & NBSP; 13.2.1, Câu lệnh Call Call.

MySQL lưu trữ cài đặt biến hệ thống db_name.sp_name8 có hiệu lực khi một thói quen được tạo hoặc thay đổi và luôn thực hiện thói quen với cài đặt này có hiệu lực, bất kể chế độ SQL máy chủ hiện tại khi thói quen bắt đầu thực thi.regardless of the current server SQL mode when the routine begins executing.

Việc chuyển đổi từ chế độ SQL của Invoker sang phương thức thường xuyên xảy ra sau khi đánh giá các đối số và gán các giá trị kết quả cho các tham số thông thường. Nếu bạn xác định một thói quen ở chế độ SQL nghiêm ngặt nhưng gọi nó ở chế độ không thường xuyên, việc gán các đối số cho các tham số thông thường sẽ không diễn ra ở chế độ nghiêm ngặt. Nếu bạn yêu cầu các biểu thức được chuyển đến một thói quen được gán ở chế độ SQL nghiêm ngặt, bạn nên gọi thói quen có chế độ nghiêm ngặt có hiệu lực.

Đặc tính db_name.sp_name9 là tiện ích mở rộng MySQL và có thể được sử dụng để mô tả thói quen được lưu trữ. Thông tin này được hiển thị bởi các câu lệnh

BEGIN

        Mysql Statements

        RETURN expression;
END
00 và
BEGIN

        Mysql Statements

        RETURN expression;
END
01.

Đặc tính

BEGIN

        Mysql Statements

        RETURN expression;
END
02 chỉ ra ngôn ngữ mà thói quen được viết. Máy chủ bỏ qua đặc tính này; Chỉ các thói quen SQL được hỗ trợ.

Một thói quen được coi là xác định của người Viking nếu nó luôn tạo ra kết quả tương tự cho các tham số đầu vào tương tự và không phải là người xác định. Nếu cả

BEGIN

        Mysql Statements

        RETURN expression;
END
03 và
BEGIN

        Mysql Statements

        RETURN expression;
END
04 đều không được đưa ra trong định nghĩa thường quy, mặc định là
BEGIN

        Mysql Statements

        RETURN expression;
END
05. Để tuyên bố rằng một hàm là xác định, bạn phải chỉ định rõ ràng ____103.deterministic if it always produces the same result for the same input parameters, and not deterministic otherwise. If neither
BEGIN

        Mysql Statements

        RETURN expression;
END
03 nor
BEGIN

        Mysql Statements

        RETURN expression;
END
04 is given in the routine definition, the default is
BEGIN

        Mysql Statements

        RETURN expression;
END
05. To declare that a function is deterministic, you must specify
BEGIN

        Mysql Statements

        RETURN expression;
END
03 explicitly.

Đánh giá bản chất của một thói quen dựa trên sự trung thực của người Hồi giáo: MySQL không kiểm tra xem thông thường được tuyên bố

BEGIN

        Mysql Statements

        RETURN expression;
END
03 không có tuyên bố tạo ra kết quả không. Tuy nhiên, việc xác nhận sai một thói quen có thể ảnh hưởng đến kết quả hoặc ảnh hưởng đến hiệu suất. Tuyên bố một thói quen không phải là
BEGIN

        Mysql Statements

        RETURN expression;
END
03 có thể dẫn đến kết quả bất ngờ bằng cách khiến trình tối ưu hóa đưa ra các lựa chọn kế hoạch thực thi không chính xác. Tuyên bố một thói quen xác định là
BEGIN

        Mysql Statements

        RETURN expression;
END
09 có thể làm giảm hiệu suất bằng cách gây ra các tối ưu hóa có sẵn không được sử dụng.honesty of the creator: MySQL does not check that a routine declared
BEGIN

        Mysql Statements

        RETURN expression;
END
03 is free of statements that produce nondeterministic results. However, misdeclaring a routine might affect results or affect performance. Declaring a nondeterministic routine as
BEGIN

        Mysql Statements

        RETURN expression;
END
03 might lead to unexpected results by causing the optimizer to make incorrect execution plan choices. Declaring a deterministic routine as
BEGIN

        Mysql Statements

        RETURN expression;
END
09 might diminish performance by causing available optimizations not to be used.

Nếu ghi nhật ký nhị phân được bật, đặc tính

BEGIN

        Mysql Statements

        RETURN expression;
END
03 ảnh hưởng đến định nghĩa thông thường mà MySQL chấp nhận. Xem Phần & NBSP; 25.7, Chương trình lưu trữ của chương trình ghi nhật ký nhị phân.

Một thói quen chứa hàm

BEGIN

        Mysql Statements

        RETURN expression;
END
11 (hoặc từ đồng nghĩa của nó) hoặc
BEGIN

        Mysql Statements

        RETURN expression;
END
12 là không có tính tự nhiên, nhưng nó vẫn có thể an toàn sao chép. Đối với
BEGIN

        Mysql Statements

        RETURN expression;
END
11, nhật ký nhị phân bao gồm dấu thời gian và sao chép chính xác.
BEGIN

        Mysql Statements

        RETURN expression;
END
12 cũng sao chép chính xác miễn là nó chỉ được gọi là một thời gian duy nhất trong quá trình thực hiện một thói quen. .

Một số đặc điểm cung cấp thông tin về bản chất của việc sử dụng dữ liệu theo thói quen. Trong MySQL, những đặc điểm này chỉ là tư vấn. Máy chủ không sử dụng chúng để hạn chế loại câu lệnh nào được phép thực thi.

  • BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    15 chỉ ra rằng thói quen không chứa các câu lệnh đọc hoặc ghi dữ liệu. Đây là mặc định nếu không có đặc điểm nào được đưa ra rõ ràng. Ví dụ về các tuyên bố như vậy là
    BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    16 hoặc
    BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    17, thực thi nhưng không đọc hay ghi dữ liệu.

  • BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    18 chỉ ra rằng thói quen không chứa các câu lệnh SQL.

  • BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    19 chỉ ra rằng thói quen chứa các câu lệnh đọc dữ liệu (ví dụ:
    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    9), nhưng không phải là câu lệnh ghi dữ liệu.

  • BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    21 chỉ ra rằng thói quen chứa các câu lệnh có thể ghi dữ liệu (ví dụ:
    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    SQL SECURITY INVOKER
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    0 hoặc
    BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    23).

Đặc tính

DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
3 có thể là
BEGIN

        Mysql Statements

        RETURN expression;
END
5 hoặc
BEGIN

        Mysql Statements

        RETURN expression;
END
26 để chỉ định bối cảnh bảo mật; Đó là, cho dù thường trình thực thi bằng cách sử dụng các đặc quyền của tài khoản có tên trong mệnh đề thường trình
BEGIN

        Mysql Statements

        RETURN expression;
END
5 hay người dùng gọi nó. Tài khoản này phải có quyền truy cập cơ sở dữ liệu mà thói quen được liên kết. Giá trị mặc định là
BEGIN

        Mysql Statements

        RETURN expression;
END
5. Người dùng gọi thói quen phải có đặc quyền
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
0 cho nó, như tài khoản
BEGIN

        Mysql Statements

        RETURN expression;
END
5 nếu thường trình thực thi trong bối cảnh bảo mật của Definer.

Điều khoản

BEGIN

        Mysql Statements

        RETURN expression;
END
5 chỉ định tài khoản MySQL sẽ được sử dụng khi kiểm tra các đặc quyền truy cập tại thời gian thực hiện thông thường cho các thói quen có đặc tính
BEGIN

        Mysql Statements

        RETURN expression;
END
32.

Nếu mệnh đề

BEGIN

        Mysql Statements

        RETURN expression;
END
5 có mặt, giá trị
BEGIN

        Mysql Statements

        RETURN expression;
END
6 phải là tài khoản MySQL được chỉ định là ________ 135 '@' ________ 136 ',
BEGIN

        Mysql Statements

        RETURN expression;
END
37 hoặc
BEGIN

        Mysql Statements

        RETURN expression;
END
38. Các giá trị
BEGIN

        Mysql Statements

        RETURN expression;
END
6 được phép phụ thuộc vào các đặc quyền bạn nắm giữ, như được thảo luận trong Phần & NBSP; 25.6, Điều khiển truy cập đối tượng được lưu trữ. Cũng xem phần đó để biết thêm thông tin về bảo mật thường xuyên được lưu trữ.

Nếu mệnh đề

BEGIN

        Mysql Statements

        RETURN expression;
END
5 bị bỏ qua, Deforer mặc định là người dùng thực thi câu lệnh
BEGIN

        Mysql Statements

        RETURN expression;
END
41 hoặc
Select emp_id, fname, lname, no_of_years(start_date) as 'years' from employee;
0. Điều này giống như chỉ định
BEGIN

        Mysql Statements

        RETURN expression;
END
43 một cách rõ ràng.

Trong phần thân của một thói quen được lưu trữ được xác định với đặc tính

BEGIN

        Mysql Statements

        RETURN expression;
END
44, hàm
BEGIN

        Mysql Statements

        RETURN expression;
END
37 trả về giá trị
BEGIN

        Mysql Statements

        RETURN expression;
END
5 của thói quen. Để biết thông tin về kiểm toán người dùng trong các thói quen được lưu trữ, xem Phần & NBSP; 6.2.23, Kiểm toán hoạt động tài khoản dựa trên SQL SQL.

Xem xét quy trình sau, hiển thị số lượng tài khoản MySQL được liệt kê trong bảng hệ thống

BEGIN

        Mysql Statements

        RETURN expression;
END
47:

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;

Quy trình được gán tài khoản

BEGIN

        Mysql Statements

        RETURN expression;
END
5 của
BEGIN

        Mysql Statements

        RETURN expression;
END
49 bất kể người dùng nào định nghĩa nó. Nó thực thi với các đặc quyền của tài khoản đó bất kể người dùng nào gọi nó (vì đặc tính bảo mật mặc định là
BEGIN

        Mysql Statements

        RETURN expression;
END
5). Quy trình thành công hoặc thất bại tùy thuộc vào việc Invoker có đặc quyền
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
0 cho nó và
BEGIN

        Mysql Statements

        RETURN expression;
END
49 có đặc quyền
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
9 cho bảng
BEGIN

        Mysql Statements

        RETURN expression;
END
47.

Bây giờ giả sử rằng quy trình được xác định với đặc tính

BEGIN

        Mysql Statements

        RETURN expression;
END
55:

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;

Quy trình vẫn có

BEGIN

        Mysql Statements

        RETURN expression;
END
5 là
BEGIN

        Mysql Statements

        RETURN expression;
END
49, nhưng trong trường hợp này, nó thực thi với các đặc quyền của người dùng gọi. Do đó, thủ tục thành công hoặc thất bại tùy thuộc vào việc Invoker có đặc quyền
DELIMITER //

CREATE FUNCTION no_of_years(date1 date) RETURNS int DETERMINISTIC
BEGIN
 DECLARE date2 DATE;
  Select current_date()into date2;
  RETURN year(date2)-year(date1);
END 

//

DELIMITER ;
0 cho đặc quyền
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;
9 cho bảng
BEGIN

        Mysql Statements

        RETURN expression;
END
47.

Theo mặc định, khi một thói quen có đặc tính

BEGIN

        Mysql Statements

        RETURN expression;
END
32 được thực thi, máy chủ MySQL không đặt bất kỳ vai trò hoạt động nào cho tài khoản MySQL có tên trong mệnh đề
BEGIN

        Mysql Statements

        RETURN expression;
END
5, chỉ có vai trò mặc định. Ngoại lệ là nếu biến hệ thống
BEGIN

        Mysql Statements

        RETURN expression;
END
63 được bật, trong trường hợp đó, máy chủ MySQL đặt tất cả các vai trò được cấp cho người dùng
BEGIN

        Mysql Statements

        RETURN expression;
END
5, bao gồm các vai trò bắt buộc. Do đó, bất kỳ đặc quyền nào được cấp thông qua các vai trò đều không được kiểm tra theo mặc định khi câu lệnh
BEGIN

        Mysql Statements

        RETURN expression;
END
2 hoặc
BEGIN

        Mysql Statements

        RETURN expression;
END
0 được ban hành. Đối với các chương trình được lưu trữ, nếu thực thi sẽ xảy ra với các vai trò khác với mặc định, cơ thể chương trình có thể thực thi
BEGIN

        Mysql Statements

        RETURN expression;
END
67 để kích hoạt các vai trò cần thiết. Điều này phải được thực hiện một cách thận trọng vì các đặc quyền được gán cho vai trò có thể được thay đổi.

Máy chủ xử lý kiểu dữ liệu của tham số thường quy, biến thường xuyên cục bộ được tạo bằng

BEGIN

        Mysql Statements

        RETURN expression;
END
68 hoặc giá trị trả về chức năng như sau:

  • Bài tập được kiểm tra sự không phù hợp kiểu dữ liệu và tràn. Các vấn đề chuyển đổi và tràn dẫn đến cảnh báo hoặc lỗi ở chế độ SQL nghiêm ngặt.

  • Chỉ các giá trị vô hướng mới có thể được gán. Ví dụ, một tuyên bố như

    BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    69 không hợp lệ.

  • Đối với các loại dữ liệu ký tự, nếu

    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    7 được bao gồm trong khai báo, bộ ký tự được chỉ định và đối chiếu mặc định của nó được sử dụng. Nếu thuộc tính
    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    6 cũng có mặt, đối chiếu đó được sử dụng thay vì đối chiếu mặc định.

    Nếu

    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    7 và
    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    6 không có mặt, bộ ký tự cơ sở dữ liệu có hiệu lực tại thời gian tạo thông thường được sử dụng. Để tránh máy chủ sử dụng bộ và đối chiếu ký tự cơ sở dữ liệu, hãy cung cấp thuộc tính
    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    7 và
    CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
    BEGIN
      SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    END;
    6 rõ ràng cho các tham số dữ liệu ký tự.

    Nếu bạn thay đổi bộ ký tự mặc định cơ sở dữ liệu hoặc đối chiếu, các thói quen được lưu trữ sẽ sử dụng các mặc định cơ sở dữ liệu mới phải được bỏ và tái tạo.

    Bộ và đối chiếu ký tự cơ sở dữ liệu được đưa ra bởi giá trị của các biến hệ thống

    BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    76 và
    BEGIN
    
            Mysql Statements
    
            RETURN expression;
    END
    77. Để biết thêm thông tin, hãy xem Phần & NBSP; 10.3.3, Bộ ký tự cơ sở dữ liệu và đối chiếu.

Làm thế nào bạn có thể tạo quy trình lưu trữ trong MySQL?

Để tạo quy trình lưu trữ MySQL, hãy mở kết nối Workbench MySQL với cơ sở dữ liệu MySQL sao chép mã trong cửa sổ Trình soạn thảo truy vấn, nhấp vào thực thi.Bạn có thể xem thủ tục theo thủ tục được lưu trữ.open the MySQL workbench Connect to the MySQL Database copy-paste the code in the query editor window click on Execute. You can view the procedure under stored procedures.

Chúng ta có thể tạo chức năng trong MySQL không?

Tuyên bố chức năng tạo cũng được sử dụng trong MySQL để hỗ trợ các chức năng có thể tải.Xem Phần 13.7.4.1, Tạo Tuyên bố chức năng tạo cho các chức năng có thể tải.Một hàm có thể tải có thể được coi là một hàm được lưu trữ bên ngoài.. See Section 13.7. 4.1, “CREATE FUNCTION Statement for Loadable Functions”. A loadable function can be regarded as an external stored function.

Tại sao bạn sẽ sử dụng chức năng được lưu trữ trong MySQL?

Hàm lưu trữ MySQL về cơ bản là một loại chương trình được lưu trữ đặc biệt trả về một giá trị duy nhất.Chúng tôi có thể sử dụng các chức năng được lưu trữ trong MySQL để gói gọn các công thức đơn giản hoặc quy tắc kinh doanh có thể tái sử dụng giữa các câu lệnh SQL hoặc các chương trình được lưu trữ.to encapsulate mainly simple formulas or business rules that are reusable among SQL statements or stored programs.

Các chức năng MySQL được lưu trữ ở đâu?

Các thủ tục lưu trữ được lưu trữ ở đâu?Các quy trình được lưu trữ được lưu trữ trong các bảng mysql.routines và mysql.parameter, là một phần của từ điển dữ liệu.mysql. routines and mysql. parameters tables, which are part of the data dictionary.