存储过程

 

一:

例如:

  客户----服务器   进行信息交流(数据库)

1)         insert  into

2)         update

3)         select

  优点:

1、    批处理,减少客户和服务器之间的交流次数

2、    服务器端运行,移植性好;

3、    安全要求高的行业;

4、    包含流程控制结构的SQL语句的集合

 

二、创建存储过程

语法格式:

  ;---每条语句的结束

  声明新的结束符(任选,避免在MYSQL环境下有特殊含义):

    delimiter(分隔符)  //

    create  procedure(过程)  p_name(in  c_name  数据类型)

    [特征描述1、使用什么语言创建存储过程2、结果的确定性3、4、权限5、注释]

    SQL语句集合(一条,多条)

例如:

   create  procedure  p1()  select * from  t2;

或 create  procedure  p1()

    begin

      流程控制结构

      SQL语句集合

    end//

 

   练习1:创建存储过程,显示“Hello World”;

      步骤:1、检验mysql 版本  

                 select  version()

                 select  @@version

2、存储过程是属于数据库的

               show  databases;

               create  databases  db1;

                 use  db1;

            3、声明结束符

                  delimiter  //

4、创建存储过程

          create  procedure  p1()  select “hello,world”//

            5、调用存储过程

                  call  p1()//

            6、恢复结束符

                  delimiter  ;

 

练习2:

       创建表t1(s1  int)

        insert  into  数据:5

        根据以上内容创建存储过程,显示t1当中的记录信息

2、参数的应用

        in  输入参数的使用

        set  @x=3;

        select  @x;

 

        调用必须有对应的实参(类型、数量)将信息带入到存储过程

 

        create  procedure  p2(in  para1  int)  set  @x=para1;

        call  p2(18);

        select  @x;

       

  用户定义变量:声明开始set @x=3;

               到断开连接结束

               不能和其他用户共享

  作用域:

     存储过程的局部变量:临时结果

      作用范围:从声明位置开始,到end结束

     语法格式

       1)分步

          declare(声明)  var_name  type;

          var_name  初值是null

          set  var_name=值;

       2)declare  var_name  type  default  值;

       3)declare  v1,v2  int  default  6;

 

     out 输出参数的使用

         create  procedure  p8(out  para1  int)

          begin

          set  para1=10;

          end//

          call  p8(x)----à错   x 在end就结束了

          call  p8(@x)--à对   @x在end还没结束

          select  @x;

          select  @y

 

1、         嵌套

create  procedure  p9()

begin

declare  v1  char(10)  default  ‘outer’;

begin

declare  v1  char(10)  default  ‘inner’;

select  v1;

end;

       select  v1;

       end//

       call  p9()//

      结果:inner  outer从里往外显示

 

三、流程控制结构

  第一组:条件分支结构(if、case)

  语法:

      if      条件    then     语句集合

      elseif   条件    then     语句集合

      else    语句集合

      end  if;  注意有空格

   注意:

形参中的变量如果和存储过程中的局部变量同名,局部变量把形参中的变量会“覆盖”;

       形参变量在存储过程中无大小写的要求;

 练习:创建存储过程,如果参数<60,给表tb1插入数据

 

 

          if  para1>=60  then

            insert  into  tb1  values(2);

          else

            insert  into  tb1  values(0);

          end  if;

         end//

         call  tb1_add();

 

 

   case

     语法

      case  变量

        when  变量取值1  then  语句集合

        when  变量取值2  then  语句集合

       else  语句集合

       end  case;

 

  case

    when  变量取值1  表达式  then  语句集合

    when  变量取值2  表达式  then  语句集合

   else

  end case;

 

…………..

 if  str=’M’  then

set  sex=’男’;

 else  if  str=’F’  then

set  sex=’女’;

else

set  sex=’无’;

end if;

end//

 

循环结构

   while…..end  while

   loop….end   loop

   repeat….end   repeat

   goto(不推荐使用,流程混乱,淘汰)

 

 

create  procedure  p10()

begin

  declare  v1  int;

  set  v1=0;

  while  v1<5  do  -----à循环的入口(必须满足的条件)

insert  into  tb1  values(v1);

set  v1=v1+1;   ----à循环的出口(退出循环的条件)

end  while;

end//

call  p10();//

select  *  from  tb1;//

提醒:执行结束后的系统返回是针对最后一条insert 语句

create  procedure  p11()

 begin

  declare  v  int;

  set  v=0;

  repeat

   insert  into  tb1  values(v);

   set  v=v+1;    -------出口条件

   until  v>5;     ------入口条件

end  repeat;

end//

 

create  procedure  p12()

 begin

   declare  v  int;

   set  v=0;

    loop_lable:loop

    insert  into  tb1  values(v);

set  v=v+1;

if  v>5  then

  leave  loop  label;

end if;

   end loop;

end//

删除存储过程

  drop  procedure  名;

四、select  ….into  变量列表

只能应用在存储过程

create  procedure  p12(out  para1  char(20))

begin

 select  s1  into  para1  from  tb1;

end//

select  返回结果:表、列、行、值

游标?

  步骤:

    创建游标:declare

    打开游标;open

    获取记录;fetch

    关闭游标;close

 

例题练习:

     

mysql> delimiter //
mysql> create procedure dele(in xh int)
    -> begin
    ->  delete from tb1 where s1=xh;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> call dele(6)//
Query OK, 1 row affected (0.00 sec)

mysql> select * from tb1;
    -> //
+------+
| s1   |
+------+
|   19 |
+------+
1 row in set (0.00 sec)

mysql> create procedure bianl()
    -> begin
    ->  declare num int(4);
    ->  declare str1,str2 varchar(6);
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> create procedure compare1(k1 int,k2 int,out k3 char(6))
    -> begin
    ->  if k1>k2 then set k3='大于';
    ->  elseif k1=k2 then set k3='等于';
    ->  else set k3='小于';
    ->  end if;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> call compare1(2,3,@x);
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> select @x;
    -> //
+------+
| @x   |
+------+
| 小于 |
+------+
1 row in set (0.00 sec)

mysql> call compare1(8,3,@x);
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> select @x;
    -> //
+------+
| @x   |
+------+
| 大于 |
+------+
1 row in set (0.00 sec)

mysql> create procedure sex1(in str char(6),out sex char(6))
    -> begin
    ->   case
    ->    when str='m' then set sex='男';
    ->    when str='f' then set sex='女';
    ->    else set sex='无';
    ->   end case;
    -> end//
Query OK, 0 rows affected (0.01 sec)

mysql> call sex1('m',@x)//
Query OK, 0 rows affected (0.00 sec)

mysql> select @x;
    -> //
+------+
| @x   |
+------+
| 男   |
+------+
1 row in set (0.00 sec)

mysql> create procedure dowhile()
    -> begin
    ->  declare v1 int default 5;
    ->  while v1>0 do set v1=v1-1;
    ->  select v1;
    ->  end while;
    -> end//
Query OK, 0 rows affected (0.03 sec)

mysql> call dowhile()//
+------+
| v1   |
+------+
|    4 |
+------+
1 row in set (0.00 sec)

+------+
| v1   |
+------+
|    3 |
+------+
1 row in set (0.01 sec)

+------+
| v1   |
+------+
|    2 |
+------+
1 row in set (0.03 sec)

+------+
| v1   |
+------+
|    1 |
+------+
1 row in set (0.05 sec)

+------+
| v1   |
+------+
|    0 |
+------+
1 row in set (0.06 sec)

Query OK, 0 rows affected (0.06 sec)

mysql> create procedure repe()
    -> begin
    ->  declare v1 int default 6;
    ->  repeat v1=v1-1;
    ->  until v1<1;
    ->  select v1;
    ->  end repeat;
    -> end//


mysql> create procedure doloop()
    -> begin
    ->  set @a=10;
    ->  label:loop
    ->   set @a=@a-1;
    ->   if @a<0 then
    ->     leave label;
    ->   end if;
    ->  end loop label;
    -> end//
Query OK, 0 rows affected (0.06 sec)

mysql> select @a;
    -> //
+------+
| @a   |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

mysql> call doloop()//
Query OK, 0 rows affected (0.01 sec)

mysql> select @a;
    -> //
+------+
| @a   |
+------+
| -1   |
+------+
1 row in set (0.00 sec)

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值