为什么使用自定义函数?
1.系统内置函数只能提供简单的、对数据库表字段的操作。
2.自定函数可以提高数据库中代码的可重用性,可以实现复杂功能,可以根据需要来获取返回值。
为什么使用存储过程?
1.存储过程是SQL语句和控制语句的预编译集合,以一个名称存储,并可以作为一个单位来处理。
2.procedure可实现复杂的操作,曾强SQL的功能具有很大的灵活性,可由Application调用执行,可以进行流程控制,可以接收和返回多个参数。
3.实现很大程度加快执行的速度
4.可以减少网络流量
mysql自定义函数:
UDF(用户自定义函数):
是对mysql扩展的一种途径。
说明:
自定义函数只能有一个返回值,复合结构的函数体需要用BEGIN和END来包含。
语法:
CREATE FUNCTION f_name[(parameters..)]
RETURNS parameter_type
BEGIN
SQL STATEMENT
...
RETURN values
END
函数的调用:
SELECT f_name(parameters..);
函数应用举例:
CREATE FUNCTION addUser //此函数实现向fx_user表插入一条记录,并返回插入的字段ID.
(u_name VARCHAR(20),u_p VARCHAR(20),u_c INT UNSIGNED)
RETRUNS INT UNSIGNED
BEGIN
INSERT INTO fx_test (name,password,companyId) VALUES (u_name,u_p,u_c);
RETURN LAST_INSERT_ID();
END
mysql客户端查看FUNCTION:
mysql客户端调用此FUNCTION:
SELECT addUser('admin','adminpassword',2);
php调用函数:
在浏览器端,运行执行后(数据插入成功):
mysql存储过程:
正常的SQL语句的执行过程是:
sql命令--》mysql引擎--》判断语法是否正确?--》(编译)生成mysql引擎可识别的命令--》生成执行结果--》结果返回客户端。
存储过程的执行过程是:
sql命令--》mysql引擎--》生成执行结果--》结果返回客户端。
优势:
其省略了语法分析和系统编译的过程,那么SQL的命令执行将会快速很多,大大提高了执行效率。
定义:
PROCEDURE 是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。
语法:
CREATE PROCEDURE procedure_name
[(
[IN|OUT] parameters... //形式参数,
)]
[charactristic..] PROCEDURE_BODY
说明:1.PROCEDURE的参数类型:[IN|OUT]
2.delimiter用来修改mysql的定界符
存储过程的调用:
CALL procedure_name;
存储过程应用举例:(此存储过程实现,删除用户,返回被删除用户的id,并且返回剩余用户的数量)
DELIMITER //
CREATE PROCEDURE deleteTestANDreturn
(IN p_id INT UNSIGNED,OUT r_id INT UNSIGNED,OUT NUMS INT)
BEGIN
DELETE FROM fx_test WHERE id=p_id;
SELECT id FROM fx_test WHERE id=p_id INTO r_id;
SELECT COUNT(id) FROM fx_test INTO NUMS;
END
mysql客户端查看PROCEDURE:
SHOW PROCEDURE status G; //显示所有存储过程并且以网格的形式显示
mysql客户端调用此PROCEDURE:
CALL deleteTestANDreturn(1,@id,@nums);
SELECT @id,@nums; //显示删除的id , 剩余的总数;
php调用存储过程:
在浏览器端,运行执行后(数据删除成功):