[toc]
– 什么是存储过程
– 创建存储过程
– 语法格式
– 修改结束符
– demo
– 创建不带参数的存储过程
– 创建带参数的存储过程
– 修改存储过程
– 语法格式
删除存储过程
– 语法格式
– 封装性
在存储过程被创建后,可以在程序中多次被调用,而不用多次写sql语句。
– 增强灵活性
类似于将代码的方法块进行提取,提高解耦性。
– 高性能
存储过程执行一次后,就会产生二进制代码在缓冲区,以后再调用的话,就去缓冲区中执行二进制代码,提高了效率
语法格式
CREATE PROCEDURE <过程名> ([过程参数[,…]])<过程体>
[过程参数[,…]] 格式
[in | out | inout]<参数名><类型>
下面我们对刚刚的模版参数进行解释:
– 过程名:存储过程的名称,尽量不要和mysql内置函数相同的名称重复。
– 过程参数:也就是参数类型(可以是任何有效的mysql数据类型)。当有多个参数时,参数列表中用逗号分隔,也可以没有参数,但还是要有一对括号。mysql存储过程支持三种数据类型的参数,即
– 输入参数:用IN表示,可以传递给一个存储过程。
– 输出参数:用OUT表示,可以存储过程中返回一个操作结果的情形。
– 输入/输出参数:分别用INOUT表示,既可以充当输入参数也可以充当输出参数。需要注意的是,参数的取名不要与数据表的列名重复。
– 过程体:存储过程的主要部分,也就是要执行的sql语句。但是这部分需要以关键字BEGIN开始,以关键字END结束。若存储过程中只有一条sql语句,则可以省略BEGIN-END标志。
在存储过程中,常会用到DELIMITER命令。
简单说,存储过程本身就是将大量的sql整合到一块。对于数据库而言,默认遇到分号就结束当前sql过程。显然不可以的,因为咱们是大量的sql语句,因为用DELIMITER命令修改结束字符
– \$$是说定义特殊符号,来取缔默认;来作为结束符号
– 当使用DELIMITER命令时,尽量避免使用反斜杠
DELIMITER ??
— 当执行执行这条后,任何命令,语句都会将结束符替换为??
— 若希望再换回默认的分号,则输入
DELIMITER ;
DELIMITER ??
-- 当执行执行这条后,任何命令,语句都会将结束符替换为??
-- 若希望再换回默认的分号,则输入
DELIMITER ;
注意:
– DELIMITER与特殊符号之间一定要有空格
– 在创建存储过程时,必须要有 CREATE ROUTINE 权限
– 查看数据库都有哪些存储过程:SHOW PROCEDURE STATUS
– 若要查看某个存储过程的具体信息:SHOW CREATE PROCEDURE <存储过程名>
> 创建名称为ShowStuScore的存储过程。
存储过程的作用是从学生成绩信息表中查询出学生的成绩信息。
mysql> DELIMITER //
mysql> CREATE PROCEDURE ShowStuScore()
-> BEGIN
-> SELECT * FROM tb_students_score;
-> END //
创建完成后,要用CALL语句进行调用
mysql> DELIMITER ;
mysql> CALL ShowStuScore();
+--------------+---------------+
| student_name | student_score |
+--------------+---------------+
| Dany | 90 |
| Green | 99 |
| Henry | 95 |
| Jane | 98 |
| Jim | 88 |
| John | 94 |
| Lily | 100 |
| Susan | 96 |
| Thomas | 93 |
| Tom | 89 |
+--------------+---------------+
输入的参数是学生姓名,然后输出的是学生成绩
mysql> DELIMITER //
mysql> CREATE PROCEDURE GetScoreByStu
-> (IN name VARCHAR(30))
-> BEGIN
-> SELECT student_score FROM tb_students_score
-> WHERE student_name=name;
-> END //
创建完存储过程后就开始用CALL语句进行调用
mysql> DELIMITER ;
mysql> CALL GetScoreByStu('Green');
+---------------+
| student_score |
+---------------+
| 99 |
+---------------+
修改存储过程
语法格式
ALTER PROCEDURE 语句修改存储过程的某些特征
语法格式:
ALTER PROCEDURE <过程名> [<特征>…]
仅适用于修改存储过程的某些特征,如果要修改内容,先删除后创建。
注意:
修改存储过程的内容:先删除原存储过程,再创建相同名称的存储过程。
修改存储过程的名称:先删除原存储过程,再创建不相同名称的存储过程
语法格式
DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>
注意:
要确定该存储过程与其他没有存储依赖,类似于azkaban的脚本依赖。
mysql> DROP PROCEDURE GetScoreByStu;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL GetScoreByStu('Green');
ERROR 1305 (42000): PROCEDURE test_db.GetScoreByStu does not exist
转载请注明:XAMPP中文组官网 » MySQL存储过程_什么是存储过程?