找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 1719|回复: 0

[【推荐】] MySQL存储过程学习

[复制链接]
发表于 2009-7-30 14:49:45 | 显示全部楼层 |阅读模式
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;//
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-5-18 17:08 , Processed in 0.315919 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表