在编写存储过程时,有一些地方值得注意:
1)一个存储过程与特定的数据库相联系~存储过程中不能使用use 'database_name'语句~在调用存储过程时,要么是当前数据库中的存储过程,要么使用db_name.procedure_name来指定~删除数据库时,数据库中的存储过程也一并被删除~
2)在编写一个存储过程前,最好使用delimiter 指令把Mysql的默认分隔符分号'';"改为其他在过程体中不会出现的符号,一般来说会使用delimiter // ~
3)存储过程的参数类型分为三种,IN,OUT,INOUT~~IN型是输入参数,过程体对IN型参数的任何修改在过程体外是无效的,类似于C语言中的传值操作,不会改变值;OUT型是输出参数,过程体中,在未对OUT型参数进行任何修改时,Mysql认为参数值是未确定的,为NULL,在对OUT型参数进行的修改,在过程体外是有效的;INOUT型是输入输出参数,在过程体中可以使用传入的值,过程体中对参数的修改在过程体外也是有效的~
4)过程体中定义的局部变量和会话变量是不同的~对会话变量的使用前面必须要加@符号,且会话变量的作用域是整个会话;过程体可以使用declare语句来定义局部变量,存储过程的参数也被认作是局部变量,对局部变量的使用不能在前加@符号~~
5)过程体中的变量的作用域由begin...end来限定,如果使用了类似begin...begin...end...end的过程体,则内层begin...end中定义的变量在外层中不能识别,外层中定义的变量可以在内层中使用,如果在外层和内层中定义了相同名字的变量,则在内层中,内层变量会取代外层变量~~这和C语言中是类似的
6)可以使用set语句或select..into..来给变量赋值~~可以用select语句来查看变量的值~~无论是局部变量还是会话变量,注意局部变量和会话变量的使用是不同的
7)创建过程使用create procedure,修改过程使用alter procedure,但是对过程的修改,局限于对过程特征的修改,不能对过程体进行修改~删除过程可以使用drop procedure~关于存储过程的修改可参考http://ddguihui.blog.163.com/blog/static/2115808320104124435938/
8)过程体中可以使用各种条件控制语句,例如IF...THEN...ELSE...,CASE...,REPEAT...UNTIL...,WHILE...,LOOP...(设定一个标号)以及在LOOP中的ITERATE(返回到标号处)~
9)过程体中可以使用declare语句来声明条件(为错误状态命名)和对应的错误处理语句,错误处理分为两种,一种是终止(EXIT),另一种是跳过继续(CONTINUE)~在错误发生时,会激活对应的错误处理语句~
10)过程体中可以使用declare语句来声明光标(CURSOR),光标指向select语句返回的结果集的行,是只读的而且不能滚动,只能一行一行的读取,声明光标后,可以使用open来打开光标,close来关闭光标,fetch语句从光标中提取一行赋值给变量,然后光标前进一步,指向下一行~