Hướng dẫn can you create functions in mysql? - bạn có thể tạo các hàm trong mysql không?

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ó.

Tuyên bố CREATE FUNCTION 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 CALL [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.

CREATE PROCEDURECREATE FUNCTION yêu cầu đặc quyền

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]
0. Nếu điều khoản
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]
1 có mặt, các đặc quyền cần thiết phụ thuộc vào giá trị
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]
2, 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, CREATE FUNCTION có thể yêu cầu đặc quyền
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]
4, 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

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]
5 và
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 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
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. 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

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]
1 và
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]
9 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ế độ

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 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ể
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 có được bật hay khô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]
2 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ả CREATE FUNCTIONCREATE PROCEDURE 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

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]
5 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
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 mà không chỉ đị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.

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

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 thành công với cảnh báo. Điều này giống như không chỉ đị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.

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

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
0. Tên tham số không nhạy cảm trường hợp.

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

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
1 theo mặc định. Để chỉ định khác cho một tham số, hãy sử dụng từ khóa
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2 hoặc
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
3 trước tên tham số.

Ghi chú

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

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
1,
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2 hoặc
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
3 chỉ có giá trị đối với
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
7. Đối với
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
8, các tham số luôn được coi là tham số
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
1.

Một tham số

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
1 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ố
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2 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 = 'admin'@'localhost' PROCEDURE account_count[]
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2 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ố
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
3 đượ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ố

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2 hoặc
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
3, hãy truyền một biến do người dùng xác định trong câu lệnh CALL 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ố
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2 hoặc
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
3. 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
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
SQL SECURITY INVOKER
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
9 dưới dạng tham số
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2 hoặc
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
3.

Để 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 db_name.sp_name2 của cơ sở dữ liệu db_name.sp_name3. Mã quốc gia được truyền bằng tham số

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
1 và số lượng thành phố được trả về bằng tham số
CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
2:

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 db_name.sp_name6 để thay đổi dấu phân cách câu lệnh từ db_name.sp_name7 thành db_name.sp_name8 trong khi quy trình đang được xác định. Điều này cho phép dấu phân cách db_name.sp_name7 đượ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 db_name.sp_name6 command to change the statement delimiter from db_name.sp_name7 to db_name.sp_name8 while the procedure is being defined. This enables the db_name.sp_name7 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 CREATE FUNCTION0 chỉ có thể được chỉ định cho một

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count[]
BEGIN
  SELECT 'Number of accounts:', COUNT[*] FROM mysql.user;
END;
8, 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 CREATE FUNCTION2. Nếu câu lệnh CREATE FUNCTION3 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ị CREATE FUNCTION4 hoặc CREATE FUNCTION5 trong mệnh đề CREATE FUNCTION0, nhưng câu lệnh CREATE FUNCTION3 trả về một số nguyên, giá trị được trả về từ hàm là chuỗi cho thành viên CREATE FUNCTION4 tương ứng của các thành viên CREATE FUNCTION5.

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 db_name.sp_name6 là không cần thiết vì định nghĩa chức năng không chứa các phân định câu lệnh db_name.sp_name7 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 CALL2 có thể được sử dụng nếu có trước thông số kỹ thuật CALL3.

CALL4 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ư CALL5 hoặc CALL6 hoặc một câu lệnh ghép được viết bằng cách sử dụng CALL7 và CALL8. 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 CREATE FUNCTION3 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 PROCEDURE0 và CREATE PROCEDURE1. 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 PROCEDURE2. 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ố CALL5 không có mệnh đề CREATE PROCEDURE4 và các tuyên bố khác như CREATE PROCEDURE5, CREATE PROCEDURE6 và CREATE PROCEDURE7. Đố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 CREATE PROCEDURE8 [CREATE PROCEDURE9]. Đố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 CREATE FUNCTION0 [CREATE FUNCTION1].

CREATE FUNCTION2 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 CREATE FUNCTION3 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 CREATE FUNCTION4 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 CREATE FUNCTION5 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 CREATE FUNCTION6 và CREATE FUNCTION7.

Đặc tính CREATE FUNCTION8 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ả CREATE FUNCTION9 và

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]
00 đều không được đưa ra trong định nghĩa thường quy, mặc định là
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]
01. Để tuyên bố rằng một hàm là xác định, bạn phải chỉ định rõ ràng ____999.deterministic if it always produces the same result for the same input parameters, and not deterministic otherwise. If neither CREATE FUNCTION9 nor
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]
00 is given in the routine definition, the default is
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]
01. To declare that a function is deterministic, you must specify CREATE FUNCTION9 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ố CREATE FUNCTION9 có 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à CREATE FUNCTION9 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à

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]
05 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 CREATE FUNCTION9 is free of statements that produce nondeterministic results. However, misdeclaring a routine might affect results or affect performance. Declaring a nondeterministic routine as CREATE FUNCTION9 might lead to unexpected results by causing the optimizer to make incorrect execution plan choices. Declaring a deterministic routine as
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]
05 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 CREATE FUNCTION9 ả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

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]
07 [hoặc từ đồng nghĩa của nó] hoặc
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]
08 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
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]
07, nhật ký nhị phân bao gồm dấu thời gian và sao chép chính xác.
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]
08 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.

  • 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]
    11 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à
    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]
    12 hoặc
    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]
    13, thực thi nhưng không đọc hay ghi 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]
    14 chỉ ra rằng thói quen không chứa câu lệnh SQL.

  • 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]
    15 chỉ ra rằng thông thường chứa các câu lệnh đọc dữ liệu [ví dụ: CALL5], nhưng không phải là câu lệnh ghi 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]
    17 chỉ ra rằng thói quen chứa các câu lệnh có thể ghi dữ liệu [ví dụ: CALL6 hoặc
    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]
    19].

Đặc tính

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]
9 có thể là
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]
1 hoặc
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]
22 để 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
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]
1 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à
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]
1. Người dùng gọi thói quen phải có đặc quyền
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 cho nó, vì phải tài khoản
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]
1 nếu thông thường thực thi trong bối cảnh bảo mật của Definer.

Điều khoản

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]
1 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
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]
28.

Nếu điều khoản

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]
1 có mặt, giá trị
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]
2 phải là tài khoản MySQL được chỉ định là ________ 131 '@' ________ 132 ',
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]
33 hoặc
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]
34. Các giá trị
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]
2 đượ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 đề

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]
1 bị bỏ qua, Deforer mặc định là người dùng thực thi câu lệnh
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]
37 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]
6. Điều này giống như chỉ định
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]
39 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

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]
40, hàm
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]
33 trả về giá trị
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]
1 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

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]
43:

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

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]
1 của
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]
45 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à
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]
1]. 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
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 cho nó và
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]
45 có đặc quyền CALL5 cho 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]
43.

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

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]
51:

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ó

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]
1 là
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]
45, 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
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 cho nó và đặc quyền CALL5 cho 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]
43.

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

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]
28 đượ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 đề
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]
1, chỉ có vai trò mặc định. Ngoại lệ là nếu biến hệ thố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]
59 đượ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
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]
1, 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 tuyên bố CREATE PROCEDURE hoặc CREATE FUNCTION được ban hành. Đối với các chương trình được lưu trữ, nếu việc 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
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]
63 để 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

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]
64 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ư

    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]
    65 không hợp lệ.

  • Đối với các loại dữ liệu ký tự, nếu CALL3 đượ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 CALL2 cũng có mặt, đối chiếu đó được sử dụng thay vì đối chiếu mặc định.

    Nếu CALL3 và CALL2 không có mặt, bộ ký tự cơ sở dữ liệu được đặt và đối chiế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 CALL3 và CALL2 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

    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]
    72 và
    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]
    73. Để 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 cách nào để tạo một chức năng được lưu trữ trong MySQL?

Hàm được lưu trữ trong MySQL là một tập hợp các câu lệnh SQL thực hiện một số tác vụ/hoạt động và trả về một giá trị duy nhất ...
Phân đoạn $$.
Tạo hàm fun_name [fun_parameter [s]].
Trả về kiểu dữ liệu ..
[Không] {đặc điểm}.
fun_body;.

Làm thế nào để bạn tạo một chức năng trong cơ sở dữ liệu?

Xác định câu lệnh CREATE Hàm [vô hướng]:..
Chỉ định tên cho chức năng ..
Chỉ định tên và kiểu dữ liệu cho từng tham số đầu vào ..
Chỉ định từ khóa trả về và kiểu dữ liệu của giá trị trả về vô hướng ..
Chỉ định từ khóa bắt đầu để giới thiệu chức năng-Body. ....
Chỉ định cơ thể chức năng. ....
Chỉ định từ khóa kết thúc ..

Làm cách nào để chạy một chức năng trong mysql?

Tạo hàm isodd [input_number int] return int bearn fear v_isodd int;Nếu mod [input_number, 2] = 0 sau đó đặt v_isodd = false;Khác đặt v_isodd = true;Kết thúc nếu;Trả lại [v_isodd];CHẤM DỨT ;Từ dòng lệnh MySQL, chúng ta có thể gọi chức năng được lưu trữ đơn giản của mình theo một số cách. From the MySQL command line, we can invoke our simple stored function in a number of ways.

Hai loại chức năng trong MySQL là gì?

Trong MySQL, chúng ta có các loại chức năng khác nhau: Chuỗi chuỗi.Các chức năng số.String functions. Numeric functions.

Bài Viết Liên Quan

Chủ Đề