类似函数,批量处理
1、为什么使用存储过程
Mysql服务器在缓存机制做了改进,使用类似预处理的哪种方式,由于没有编译器,因此mysql存储过程不会向外部语言(c)编写的运行的那么快。提升mysql服务器速度最主要的方法有两种:降低网络的信息的流量,减少用户与服务器之间的交互
存储过程是在服务器端执行,所以使用存储过程就会减少客户与服务器之间的交互信息量
改变主机语言也可以,存储过程只是数据库逻辑而部署应用程序可移植性好,与操作系统主机型号无关;
2、要求:
Proc表
具有 Creat routine(历程)的权限
返回标量值
隐含调用库的名字,删除数据库,存储过程也被删除
3、语法格式 p130
Createprocedure 存储过程名(参数)
特征描述
SQL语句体
4、例如
1)use test;
2)Create procedure p1()
Begin
/*this is a firstprocedure*/
End;
注意:
begin。。。end 相当于{}的作用
如果SQL 预计只有一句可以省略begin。。。end
名称不区分大小写,尽量避免与内建函数重名,假如重名在存储过程名与()之间加空格
名称的长度限制在64字符
()不能省略,可以为空
通常情况下select不会出现在存储过程体内
大部分DDL. DML都是合法语句
Create procedure db.p() drop database db;
含有 use 库名等;
3)调用存储过程
Call 存储过程名(。。。);
4)带有描述信息的存储过程
Create procedure p3()
Language sql----声明用什么语言来来实现存储过程
目前只支持mysql,将来可能会使用php来代替mysql
Not deterministic返回的结果不确定
Sql security definer –创建者调 invoret用者
Comment ‘a procedure ’---给存储过程加注释
Select *。。。。sql 语句体
%)当语句体内容两条以上,结束符号
Sql;
Create procedure p4()
Begin
Select* from tb1;--会给出错误提示直接结束存储过程的声明
Select* from tb2;
End;
Delimiter—声明结束符
Delimiter//
Select * from tb1//
输入 输出
参数 :【in |ont| inout】参变量 数据类型
Declare:声明存储过程的局部变量
1)第一种方法:分两步
Declare变量名 数据类型;
定义的变量不进行初始化,默认为null该值进行的所有操作结果为空;
Set 变量=值(也可以是表达式); 赋值
mysql> delimiter //
mysql> create procedure p8(in para1 int)
-> begin
-> declare var1 int;
-> set var1=para1+var1;
-> insert into t1 values(var1);
-> end;//
Query OK, 0 rows affected (0.00 sec)
2)第二种方法
也可以用同一条语句完成变量的声明和初始化
Declare变量名 数据类型 default 值