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 PROCEDURE
và CREATE 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 FUNCTION
và CREATE 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_name
2 của cơ sở dữ liệu db_name.sp_name
3. 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_name
6 để thay đổi dấu phân cách câu lệnh từ db_name.sp_name
7 thành db_name.sp_name
8 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_name
7 đượ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_name
6 command to change the statement delimiter from db_name.sp_name
7 to db_name.sp_name
8 while the procedure is being defined. This enables the db_name.sp_name
7 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 FUNCTION
0 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 FUNCTION
2. Nếu câu lệnh CREATE FUNCTION
3 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 FUNCTION
4 hoặc CREATE FUNCTION
5 trong mệnh đề CREATE FUNCTION
0, nhưng câu lệnh CREATE FUNCTION
3 trả về một số nguyên, giá trị được trả về từ hàm là chuỗi cho thành viên CREATE FUNCTION
4 tương ứng của các thành viên CREATE FUNCTION
5. 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_name
6 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_name
7 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 CALL
2 có thể được sử dụng nếu có trước thông số kỹ thuật CALL
3.
CALL
4 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ư CALL
5 hoặc CALL
6 hoặc một câu lệnh ghép được viết bằng cách sử dụng CALL
7 và CALL
8. 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 FUNCTION
3 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 PROCEDURE
0 và CREATE PROCEDURE
1. 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 PROCEDURE
2. 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ố CALL
5 không có mệnh đề CREATE PROCEDURE
4 và các tuyên bố khác như CREATE PROCEDURE
5, CREATE PROCEDURE
6 và CREATE PROCEDURE
7. Đố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 PROCEDURE
8 [CREATE PROCEDURE
9]. Đố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 FUNCTION
0 [CREATE FUNCTION
1].
CREATE FUNCTION
2 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 FUNCTION
3 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 FUNCTION
4 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 FUNCTION
5 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 FUNCTION
6 và CREATE FUNCTION
7.
Đặc tính CREATE FUNCTION
8 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 FUNCTION
9 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 FUNCTION
9 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 FUNCTION
9 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 FUNCTION
9 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 FUNCTION
9 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 FUNCTION
9 is free of statements that produce nondeterministic results. However, misdeclaring a routine might affect results or affect performance. Declaring a nondeterministic routine as CREATE FUNCTION
9 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 FUNCTION
9 ả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.
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ặcmysql> 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ụ: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]
CALL
5], nhưng không phải là câu lệnh ghi dữ liệu.
17 chỉ ra rằng thói quen chứa các câu lệnh có thể ghi dữ liệu [ví dụ: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]
CALL
6 hoặc
19].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]
Đặ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 CALL
5 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 CALL
5 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ư
65 không hợp 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]
Đối với các loại dữ liệu ký tự, nếu
CALL
3 đượ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ínhCALL
2 cũng có mặt, đối chiếu đó được sử dụng thay vì đối chiếu mặc định.Nếu
CALL
3 vàCALL
2 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ínhCALL
3 vàCALL
2 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
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.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]