一、navicat图形界面查看创建存储过程函数
二、sql语句创建存储过程
#如果存在则删除
drop procedure if exists proc_count_test1;
delimiter$$ #声明分隔符
create procedure proc_count_test1()
READS SQL DATA
begin #过程体开始
select count(*) count from test1;
end$$ #过程体结束
delimiter; #恢复默认分割符
#调用存储过程
call proc_count_test1();
三、sql语句创建函数
DROP FUNCTION IF EXISTS fun_add2;
DELIMITER$$ #声明分隔符
CREATE FUNCTION fun_add2 (x INT, y INT)
RETURNS INT
DETERMINISTIC #函数特性 characteristic,(确定性的)
BEGIN
RETURN x+y;
END$$
DELIMITER; #还原默认分隔符
#调用函数
SELECT fun_add2(2, 3);
四、sql语句查看存储过程和函数
#查看存储过程
#show procedure status;
show procedure status like '%proc_count_test1%' \G;
show create procedure proc_count_test1;
select * from information_schema.ROUTINES where ROUTINE_SCHEMA='test' and ROUTINE_TYPE='PROCEDURE';
#查看函数
#show function status;
show function status like '%fun_add2%' \G;
show create function fun_add2;
select * from information_schema.ROUTINES where ROUTINE_SCHEMA='test' and ROUTINE_TYPE='FUNCTION';
#存储过程和函数都在information_schema.ROUTINES表内
五、创建存储过程和函数的语法
13.1.17 CREATE PROCEDURE and CREATE FUNCTION Statements
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
characteristic 特性
1、COMMENT特性是MySQL的扩展,可以用来描述存储的例程。该信息由SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION语句显示。
2、LANGUAGE 特性表示编写例程的语言。服务器忽略了这一特性;仅支持SQL例程。
3、如果例程总是对相同的输入参数产生相同的结果,则它被认为是“确定性的”,否则它被认为“不确定性的”。如果例程定义中既没有给出确定性,也没有给出非确定性,则默认值为非确定性。若要声明函数是确定性的,必须显式指定deterministic。
4、CONTAINS SQL表示例程不包含读取或写入数据的语句。如果没有明确给出这些特征,则这是默认值。此类语句的示例有SET@x=1或DO RELEASE_LOCK('abc'),它们执行但既不读取也不写入数据。
NO SQL表示该例程不包含SQL语句。
READS SQL DATA表示例程包含读取数据的语句(例如SELECT),但不包含写入数据的语句。
MODIFIES SQL DATA表示例程包含可以写入数据的语句(例如,INSERT或DELETE)。
5、SQL SECURITY特性可以是DEFINER或INVOKER,以指定安全上下文;也就是说,例程是否使用例程DEFINER子句中指定的帐户或调用它的用户的权限执行。此帐户必须具有访问与例程关联的数据库的权限。默认值为DEFINER。调用例程的用户必须具有该例程的EXECUTE权限,如果例程在DEFINER安全上下文中执行,则DEFINER帐户也必须具有该权限。
如:root@%
修改characteristic特性
alter function functionName [characteristic ...]
六、报错处理
1、This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
此函数的声明中没有DETERMINISTIC、NO SQL或READS SQL DATA,并且启用了二进制日志记录(您可能想要使用不太安全的log_bin_trust_function_creators变量)
log_bin_trust_function_creators:当启用二进制日志记录时,此变量适用。它控制是否可以信任存储函数创建者不创建可能导致不安全事件写入二进制日志的存储函数。如果设置为0(默认值),则不允许用户创建或更改存储函数,除非用户除了具有create ROUTINE或alter ROUTINE权限外,还具有SUPER权限。设置为0还强制执行一项限制,即函数必须使用DENTISTIC特性声明,或者使用READS SQL DATA或NO SQL特性声明。如果变量设置为1,MySQL不会对存储函数的创建强制执行这些限制。此变量也适用于触发器的创建。请参阅第25.7节“存储程序二进制日志记录”。
处理方式1、指定characteristic特性
处理方式2、在 MySQL 数据库中执行以下语句,临时生效,重启数据库后失效
set global log_bin_trust_function_creators=ON;
处理方式3、在配置文件 my.cnf的 [mysqld] 配置,重启数据库,永久生效
#信任存储函数创建者
log_bin_trust_function_creators=ON