-- ---------------------- 存储过程
-- ---------------------- 函数
-- ---------------------- 查看修改删除
-- ---------------------- 异常 小结 和 经典白学
-- ---------------------- 存储过程
DELIMITER // -- 结束符替换 DELIMITER
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
LANGUAGE SQL -- 说明存储过程执行体是由SQL语句组成的
[NOT] DETERMINISTIC -- 指明存储过程执行的结果是否确定( 每次执行存储过程时,相同的输入会得到相同的输出。)
-- 默认为NOT DETERMINISTIC。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
-- CONTAINS 不包含读写数据的SQL语句
-- NO 不包含任何SQL语句;
-- READS 读
-- MODIFIES 写
SQL SECURITY { DEFINER | INVOKER }
-- DEFINER 创建者或者定义者才能执行当前存储过程;
-- INVOKER 拥有当前存储过程的访问权限的用户能够执行当前存储过程。
COMMENT 'string' -- COMMENT 存储方式注释
BEGIN -- BEGIN...END 结构体 结束符;
DECLARE i INT DEFAULT 1; -- DECLARE 声明变量 局部
SET i = 0; -- SET 赋值语句,用于对变量进行赋值。
SELECT... INTO ... FROM ... -- SELECT... INTO 放出参 OUT
WHERE ...GROUP BY ...HAVING... ORDER BY...LIMIT
END//
DELIMITER ;
调用
SET @inname=值; SET @outname; -- 入参 IN 出参 OUT
CALL sp1(@inname,@outname); -- CALL 存储过程名
SELECT @inname; SELECT @outname; -- 查询 入参 出参
-- ---------------------- 函数
如何调试/语法分析/函数. RETURNS!!!!!
DELIMITER // -- 结束符替换 DELIMITER
CREATE FUNCTION 函数名(参数名 参数类型,...) -- 不需要 IN OUT
RETURNS 返回值类型 -- RETURNS 注意 返回值
LANGUAGE SQL -- 说明存储过程执行体是由SQL语句组成的
[NOT] DETERMINISTIC -- 指明存储过程执行的结果是否确定( 每次执行存储过程时,相同的输入会得到相同的输出。)
-- 默认为NOT DETERMINISTIC。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
-- CONTAINS 不包含读写数据的SQL语句
-- NO 不包含任何SQL语句;
-- READS 读
-- MODIFIES 写
SQL SECURITY { DEFINER | INVOKER }
-- DEFINER 创建者或者定义者才能执行当前存储过程;
-- INVOKER 拥有当前存储过程的访问权限的用户能够执行当前存储过程。
COMMENT 'string' -- COMMENT 存储方式注释
BEGIN
DECLARE i INT DEFAULT 1; -- DECLARE 声明变量 局部
SET i = 0; -- SET 赋值语句,用于对变量进行赋值。
SELECT ... FROM ... -- 不包含 SELECT 。。。 INTO
WHERE ...GROUP BY ...HAVING... ORDER BY...LIMIT
RETURN (
SELECT i -- 一定包含 RETURN 只有计算可以直接 SELECT
);
END //
DELIMITER ;
-- ---------------------- 查看修改删除
使用SHOW CREATE语句查看存储过程和函数的创建信息
SHOW CREATE {PROCEDURE | FUNCTION} 存储过程名或函数名
SHOW CREATE FUNCTION test_db.CountProc \G
使用SHOW STATUS语句查看存储过程和函数的状态信息
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']
SHOW PROCEDURE STATUS LIKE 'SELECT%' \G
从information_schema.Routines表中查看存储过程和函数的信息
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='存储过程或函数的名' [AND ROUTINE_TYPE = {'PROCEDURE|FUNCTION'}];
修改
ALTER {PROCEDURE | FUNCTION} 存储过程或函数的名 [characteristic ...]
[characteristic ...]:
LANGUAGE SQL -- 说明存储过程执行体是由SQL语句组成的
[NOT] DETERMINISTIC -- 指明存储过程执行的结果是否确定( 每次执行存储过程时,相同的输入会得到相同的输出。)
-- 默认为NOT DETERMINISTIC。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
-- CONTAINS 不包含读写数据的SQL语句
-- NO 不包含任何SQL语句;
-- READS 读
-- MODIFIES 写
SQL SECURITY { DEFINER | INVOKER }
-- DEFINER 创建者或者定义者才能执行当前存储过程;
-- INVOKER 拥有当前存储过程的访问权限的用户能够执行当前存储过程。
COMMENT 'string' -- COMMENT 存储方式注释
删除
DROP {PROCEDURE | FUNCTION} [IF EXISTS] 存储过程或函数的名
-- ---------------------- 异常 小结 和 经典白学
1.若在创建存储函数中报错“
you might want to use the less safe
log_bin_trust_function_creators variable
”,有两种处理方法:
1)加上必要的函数特性“[NOT] DETERMINISTIC”和“{CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA}”
2)SET GLOBAL log_bin_trust_function_creators = 1;
2.存储函数可以放在查询语句中使用,存储过程不行
3.经典白学
1、可移植性差。存储过程不能跨数据库移植,比如在 MySQL、Oracle 和 SQL Server 里编写的存储过 程,在换成其他数据库时都需要重新编写。
2、调试困难。只有少数 DBMS 支持存储过程的调试。对于复杂的存储过程来说,开发和维护都不容 易。虽然也有一些第三方工具可以对存储过程进行调试,但要收费。
3、存储过程的版本管理很困难。 比如数据表索引发生变化了,可能会导致存储过程失效。我们在开发 软件的时候往往需要进行版本管理,但是存储过程本身没有版本控制,版本迭代更新的时候很麻烦。
4、它不适合高并发的场景。 高并发的场景需要减少数据库的压力,有时数据库会采用分库分表的方 式,
而且对可扩展性要求很高,在这种情况下,存储过程会变得难以维护, 增加数据库的压力 ,显然就 不适用了。
网友评论