【www.gdgbn.com--mysql教程】

文章提供一款mysql教程 存储过程语法创建与查看哦,关于一个存储过程包括名字,参数列表,以及可以包括很多sql语句的sql语句集,下面来看看创建存储过程和查看存储过程吧。

创建存储过程:

查询数据库教程中的存储过程

 

方法一:

       select `name` from mysql.proc where db = "your_db_name" and `type` = "procedure"

 

方法二:

         show procedure status;

 

 

查看存储过程或函数的创建代码

 

show create procedure proc_name;
show create function func_name;

 


语法:

create procedure p()

begin

/*此存储过程的正文*/

end 
create procedure productpricing()

begin

    select avg(pro_price) as priceaverage

    from products;

end;

# begin…end之间是存储过程的主体定义

# mysql的分界符是分号(;) 

                        

调用存储过程的方法是:

 

# call加上过程名以及一个括号

# 例如调用上面定义的存储过程

call productpricing();

# 哪怕是不用传递参数,存储过程名字后面的括号“()”也是必须的 

删除存储过程的方法是:

 

drop procudure productpricing; 

创建带参数的存储过程:

 

create procudure productpricing(

out p1 decimal(8,2),

out ph decimal(8,2),

out pa decimal(8,2)

)

begin

select min(prod_price) into pl from products;

select max(prod_price) into ph from products;       

select avg(prod_price) into pa from products;

end;

# decimal用于指定参数的数据类型

# out用于表明此值是用于从存储过程里输出的

# mysql支持 out, in, inout 

  调用带参数的存储过程:

 

call productpricing(@pricelow,

                    @pricehigh,

                     @priceaverage);

# 所有的参数必须以@开头

# 要想获取@priceaverage的值,用以下语句

select @priceaverage;

# 获取三个的值,用以下语句

select @pricehigh, @pricelow, @priceaverage; 

另一个带in和out参数的存储过程:

 

create procedure ordertotal(

   in onumber int,

   out ototal decimal(8,2)

)

begin

   select sum(item_price*quantity)

   from orderitems

   where order_num = onumber

   into ototal;

end;

call ordertotal(20005, @total);

select @total;

mysql存储过程2008-09-16 12:34 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”
       在存储过程体中可以包含所有的合法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;//

本文来源:http://www.gdgbn.com/shujuku/27562/