1.自定义函数,函数可以返回任意类型的值,同样可接说这些类型的参数。
CREATE FUNCTION function_name RETURNS {STRING|INTER|REAL|DECIMAL} routine_body
函数体由合法的SQL语句构成。
函数体可以是简单的SELECT或INSERT语句。
函数体如果为复合结构使用BEGIN_END语句。
复合结构可以包含声明,循环,控制结构。
2.创建函数
如果开启了bin-log, 我们就必须为我们的function指定一个参数。
我们先不指定参数,解决办法
set global log_bin_trust_function_creators=TRUE;
创建一个不带参的简单函数
CREATE FUNCTION f1() RETURNS VARCHAR(30) RETURN NOW();
现在运行,可得到现在时间
SELECT f1()
删除函数
DROP FUNCTION f1;
创建带有参数的自定义函数
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
复合结构函数体的自定义函数
CREATE FUNCTION f3(name VARCHAR(20)) RETURNS INT UNSIGNED
BEGIN
INSERT Persons VALUES('A','B','C',name);
RETURN LAST_INSERT_ID();
END$$
3.存储过程,SQL语句和控制语句的预编译集合。
增强SQL语句的功能和灵活,实现较快的执行速度,减少网络流量。
创建一个简单的不带参数存储过程
CREATE PROCEDURE sp1() SELECT VERSION();
调用我们创建的存储过程
CALL sp1()
有参数的存储过程
CREATE PROCEDURE sp2(IN uid INT UNSIGNED) BEGIN DELETE FROM tdb_goods WHERE id=uid; END
IN表示输入参数,向存储过程传递一个参数。必须在调用存储过程时指定。存储过程中修改该参数得值不能被返回。
CREATE PROCEDURE removeAndUser(IN p_id INT UNSIGNED,OUT userId INT UNSIGNED) BEGIN DELETE FROM tdb_goods WHERE id=p_id; SELECT COUNT(goods_id) FROM tdb_goods INTO userId; END
OUT该值可以在存储过程内被改变,并可返回
调用removeAndUser
CALL removeAndUser(50,@unms);
@nums是全局变量,跟DECLARE不同,DECLARE是在BEGIN和END之间有效,为局部变量。
删除存储过程
DROP PROCEDURE removeAndUser;
存储过程和自定义函数的区别
存储过程实现的功能复杂一些,而函数针对性更强。
存储过程可以返回多个值,函数只能有一个返回值。
存储过程一般独立执行,而函数可以作为其他SQL语句的组成部分来实现。
持续更新。。。