mysql存储过程创建与注意事项

mysql教程存储过程创建与注意事项
第一 mysql存储过程跟之前写sqlserver 2005 的存储过程有点区别;

第二,用的mysql第三方企业管理器 sqlyogent.exe 调试的时候,写存储过程和一般的查询语句要分开的,我是后来才意识到的,气得要命(可能也是用sqlserver 2005企业管理器的编辑器的习惯导致的)。 废话少说,写存储过程,要注意如下几点:

第一 要定义delimiter //,意思是用//作为一段语句的结束符(这个很重要,我写的存储过程语法一点也没错,但是,就是通不过,原来分号:;分隔符是通知mysql客户端已经输入完成的符号,而我的存储过程里边很多都有分号;结果运行的时候,就是把我一段存储过程分成很多段执行)

第二 如果你想我一样“不幸”选择了第三方mysql客户端sqlyogent.exe ,一定要在数据库教程目录里边的存储过程右键选择新建存储过程,然后在右边弹出的窗口里键入你的存储过程语句,在普通查询分析器输入无效,这是惨痛教训

第三,如果存储过程的参数如果是输入中文的话,要在定义存储过程的后面加上character set gbk这个编码,不然调用存储过程使用中文参数的时候会出错,如:

 

create  procedure countpro(out a_out int,in b_date date, in unit_name varchar(45) character set gbk)
第四,如果你的存储过程里边需要模糊查询,用到 like '%内容%' 不要在select 语句的where后边写'%';定义一个参数,用: set wherestr = "'%"+wherestr+"%'";拼接语句第五,最后要还原结束符:delimiter ; 为;作为语句的结束符

下面来看mysql存储过程实例

1. 创建实例数据库
   create database db5;
   use db5;

2.创建一个简单的工作表,并插入数据
   create table t(s1 int);
   insert into t values(5);

3.创建程序实例 create procedure example
   create procedure p1() select * from t;
      sql语句存储过程的第一部分是 create procedure
      第二部分是过程名:上面新存储过程的名字是p1。
      第三部分书参数列表(),第四部分是程序的主体,“select * from t”

*****什么样的mysql语句在存储过程体中是合法的?
       在存储过程体中可以包含所有的合法sql数据库定义语言,insert,update,delete,drop,create,replace等等语句
包括(set,commit,rollback)但是,在代码中如果包含mysql的扩充功能,那么代码将不能移植。
   
4. 调用存储过程,所需要输入的就是call和你过程名以及一个括号。
    call p1();

5.过程中的特征子句
    create procedure p2()language sql
                         not deterministic
    sql security definer
    comment ''
     select current_date,rand() from t;

6.parameters参数
    create procedure p5()------; //参数列表是空的
    create procedure p5([in] name data-type)---- //输入参数in可选,默认为参数为in
    create procedure p5(out name data-type)----- //输出参数out
    create procedure p5(inout 那么data-type)----- //即可以做输入参数也可以做输出参数

   ----输入参数in 例子。
       create procedure p5(p int) set @x=p;
       call p5(12345);
       select @x;

   ----输出参数out 例子
       create procedure p6(out p int)set p=-5;
       call p6(@y);
       select @y;

7. 复合语句:如果你的过程中有多条语句,那么你需要begin/end块。在这里你可以进行变量的定义和流程的控制
       首先执行命令 delimiter //
       create procedure p7()
           begin
              set  @a=6;
       set  @b=5;
       insert into t values (@a);
       select s1 * @a from t where s1>= @b;
    end;//

   -----在复合语句中申明变量
       create procedure p8()
            begin
       declare a int;
       declare b int;
       set a=5;
       set b=5;
       insert into t values (a);
       select s1*a from t where s1>=b;
            end;//

       含有default默认语句舌设定语句的例子
       create procedure p9()
       begin
          declare a ,b int default 5;
   insert into t values(a);
   select s1*a from t where s1>=b;
       end;//

8. scope作用域的问题:内部的变量在其作用域范围内享有更高的优先权,当执行到end
        变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
 过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
 给会话变量来保存其值。
   create procedure p11()
   begin
      declare x1 char(5) default 'outer';
      begin
        declare x1 char(5) default 'inner';
 select x1;
      end;
      select x1;
   end;//
  
/*********************************  存储过程中的条件式语句  ***************************************/

1. if-then -else语句
    create procedure p12(in parameter int)
    begin
      declare var int;
      set var=parameter+1;
      if var=0 then
        insert into t values(17);
      end if;
      if parameter=0 then
        update t set s1=s1+1;
      else
        update t set s1=s1+2;
      end if;
    end;//

2. case指令:如果需要进行更多条件真假的判断我们可以使用case语句
   create procedure p13(in parameter int)
    begin
       declare var int;
       set var=parameter+1;
       case var
         when 0 then insert into t values(17);
  when 1 then insert into t values(18);
  else insert into t values(19);
       end case;
    end;//

/*****************************  循环语句  ************************************/
1. while ···· end while; 循环语句
  create procedure p14()
   begin
     declare var int;
     set var=0;
     while var<6 do
        insert into t values(var);
 set var=var+1;
     end while;
   end;//

2. repeat···· end repeat ;它在执行操作后检查结果,而while则是执行前进行检查
  create procedure p15()
   begin
     declare v int;
     set v=0;
     repeat
       insert into t values(v);
       set v=v+1;
       until v>=5
     end repeat;
   end;//

3. loop ·····end loop; loop 循环不需要初始条件,这点和while 循环相似,同时和repeat
       循环一样不需要结束条件, leave语句的意义是离开循环,
  create procedure p16()
   begin
      declare v int;
      set v=0;
      loop_lable:loop
         insert into t values(v);
  set v=v+1;
  if v >=5 then
     leave loop_lable;
  end if;
      end loop;
   end;//

4. lables 标号:标号可以用在begin repeat while 或者loop 语句前,语句标号只能在
      合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。

/*****************************  iterate迭代  ***************************************/

1. iterate:通过引用复合语句的标号,来从新开始复合语句
    create procedure p20()
      begin
        declare v int;
 set v=0;
 loop_lable:loop
          if v=3 then
      set v=v+1;
      iterate loop_lable;
   end if;
   insert into t values(v);
   set v=v+1;
   if v>=5 then
     leave loop_lable;
   end if;
 end loop;
      end;//

时间: 2024-10-31 01:59:12

mysql存储过程创建与注意事项的相关文章

MySql存储过程 创建删除与实例

mysql教程存储过程是带参数的存储过程(动态执行sql语句),该mysql存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式: mysql 5.0 新特性教程是为需要了解5.0版本新特性的mysql老用户而写的.简单的来说是介绍了"存储过程.触发器.视图.信息架构视图",   call getusersdynamic('age<=30','');   /********动态查询用户的信息********/    create procedure ge

在MySQL中创建带有IN和OUT参数的存储过程的方法_Mysql

 在 MySQL 中创建储存过程的语法很难记,除非你经常跟储存过程打交道,原因很简单,语法不是什么小笑话.如果你通过命令行控制 MySQL,你需要记住准确的语法.一个快速示例可以很好的帮助你做到这点.在MySQL 入门教程中,我们能够看到很多关于如何创建储存过程 和如何利用 IN 和 OUT 参数调用存储过程的示例.这些示例都很简单,能够很好的帮助你理解 MySQL 中创建带参数存储过程的语法.这些示例已在 MySQL 5.5 中通过测试.我们将用下面的雇员表创建并测试这些储存过程:   mys

mysql存储过程总结详解

1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以

MySQL存储过程详解 mysql 存储过程

mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的

mysql存储过程入门

mysql存储过程详解 1.     存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数

mysql存储过程详解_Mysql

1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编程中面

php调用mysql存储过程会员登录验证实例分析

本文实例分析了php调用mysql存储过程的方法.分享给大家供大家参考.具体分析如下: Mysql存储过程创建语法,代码如下:  代码如下 复制代码 CREATE PROCEDURE和CREATE FUNCTION : CREATE PROCEDURE sp_name ([proc_parameter[,...]])       [characteristic ...] routine_body   CREATE FUNCTION sp_name ([func_parameter[,...]])

php调用mysql存储过程实例分析_php技巧

本文实例分析了php调用mysql存储过程的方法.分享给大家供大家参考.具体分析如下: Mysql存储过程创建语法,代码如下: CREATE PROCEDURE和CREATE FUNCTION : 复制代码 代码如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]])       [characteristic ...] routine_body   CREATE FUNCTION sp_name ([func_parameter[,...]])

php程序中调用mysql存储过程实例

Mysql存储过程创建语法  代码如下 复制代码 CREATE PROCEDURE和CREATE FUNCTION CREATE PROCEDURE sp_name ([proc_parameter[,...]])     [characteristic ...] routine_body   CREATE FUNCTION sp_name ([func_parameter[,...]])     RETURNS type     [characteristic ...] routine_bod