美文网首页
存储过程

存储过程

作者: 蘋果_283e | 来源:发表于2017-03-19 19:23 被阅读0次

    获取刚存入的评论id
     set pid =(select last_insert_id());

    mysql变量:
     (1)用户变量:用户自己定义的变量
      a)定义:以@开始,形式:@变量名//@a
      b)赋值:set @a = 10;
      c)作用范围:整个客户端,当客户端退出时,用户变量消失,所以也叫会话变量
      d)访问:select @a;
     (2)局部变量:
      a)定义:declare b int;//没有default设置value值时,默认值是Null
        declare c int default 10;
      b)赋值:set b = 8;
      c)作用范围:在begin到end语句块之间。

    //mysql存储过程 = java封装方法
    定义:是一组为了完成特定功能的Sql语句,经过编译之后存在数据库中,用户通过指定存储过程的名称并给定参数(若有参数)来调用执行它

    //创建一个存储过程
    create procedure 存储过程名称([参数1],[参数2],...)
    begin
     要执行的sql语句;
    end

    //创建一个不带参数的存储过程
    //获取所有员工信息
    create procedure getStaff()
    begin
     select * from staff;
    end

    //调用存储过程
    call getStaff();

    //存储过程中的参数类型
    in:表示输入参数,默认为in,可以不写
    out:表示输出参数,mysql没有return,所以返回值要定义为out
    inout:既可以是输入参数,也可以是输出参数


    //创建一个带参数的存储过程
    create procedure pro_add(in a int,in b int)
    begin
     declare sum int;
     if a is null then
     set a = 0;
     end if;
     if b is null then
     set b = 0;
     end if;
     set sum = a+b;
     select sum;
    end
    //调用带参数的存储过程
    call pro_add(2,3);

    查询任意图书类型的图书信息
    注意:varchar,char类型需要定义长度
    select * from books where type_id = (select type_id from book_type where type_name = '黑客');

    方法一
    create procedure getBooksByName(in tname varchar(50))
    begin
     select * from books where type_id = (select type_id from book_type where type_name = tname);

    end

    方法二
    create procedure getBooksByName2(in tname varchar(50))
    begin
     declare tid int;
     set tid = (select type_id from book_type where type_name = tname);
     select * from books where type_id = tid;

    end

    在评论表insert一条评论之后,实现article表中的评论数量+1
    create procedure getComs(a int,b text,c datetime)
    begin
     declare pid int;//评论表id
     declare wid int;//文章表id

     //向评论表存入一条数据
     insert into comment(aid,com_content,com_time)
     values(a,b,c);

     //获取刚存入的评论id
     set pid =(select last_insert_id());

     //根据评论id获取到文章id
     set wid = (select aid from comment where cid = pid);

     //根据上一步获取到的文章id,更新文章表的评论数量
     update article set coms = coms + 1 where aid = wid;
    end

    call getComs(10,'太棒了','2017-1-1')

    //用存储过程向一个表中存入100条数据
    create procedure pro_add100()
    begin
     declare i int;
     declare max int;
     set i = 0;
     set max = 100;
     while i <= 100 do
      insert into course(co_name) values('course');
      set i = i+1;
     end while;
    end

    总结
    (1)存储过程包含单条或者多条sql,都需要写在begin end之间
    (2)在存储过程中的每条sql语句结束时都要加';';
    (3)存储过程中的参数没有默认值,在调用时,不能省略这个参数,可以用null代替

    1、概念类似于函数,就是把一段代码封装起来,

    当要执行这一段代码的时候,可以通过调用该存储过程来实现.在封装的语句体里面,可以用if/else, case,while等控制结构.可以进行sql编程.

    2、查看现有的存储过程:

    Show procedure status

    删除存储过程

    3、Drop procedure 存储过程的名字

    4、调用存储过程

    Call 存储过程名字();

    jdbc中调用

    CallableStatement cs=con.prepareCall("{call p5(?,?)}");//jdbc调用存储过程

    基本查询

    1创建存储过程

    mysql> delimiter$

    mysql> create procedure p1()

    -> begin

    -> select * from find;

    -> end$

    3执行存储过程

    mysql> call p1();

    有参数查询

    1创建存储过程

    delimiter $

    create procedure p2(n int)

    begin

    select * from orders where id>n;

    end$

    3执行存储过程

    mysql> call p2(8);

    有if控制结构

    1创建存储过程

    delimiter $  

    create procedure p3(n int,j varchar(10))  

    begin

    if j="电脑" then select * from orders where id>n and gid in(select id from goods where tradename=j);

    else select * from orders where id<n and gid in(select id from goods where tradename=j);

    end if;

    end$

    3执行存储过程

    mysql> call p3(8,"电脑");

    有while控制结构

    1创建存储过程

    delimiter$

    create procedure p4(n int,name varchar(10))

    begin

    declare i int;

    set i=1;

    while i<=n do

    insert into user values(null,concat(name,i));

    set i=i+1;

    end while;

    end$

    3执行存储过程

    mysql> call p4(8,"电脑");

    jdbc调用存储过程

    //调用存储过程只需18毫秒,不用十万条记录机器内存不够

    public void add2(int n,String name) throws SQLException{//查询用存储过程

    mysqlConnection();

    long a=System.currentTimeMillis();//开始时间

    cs=con.prepareCall("{call p5(?,?)}");//jdbc调用存储过程

    cs.setInt(1,n);

    cs.setString(2,name);

    cs.executeUpdate();

    long b=System.currentTimeMillis();//结束时间

    System.out.println("插入用存储过程用时:"+(b-a));

    }

    public void add1(int n,String name) throws SQLException{//插入不用存储过程

    mysqlConnection();

    int i=0;

    long a=System.currentTimeMillis();//开始时间

    while(i<=n){

    String sql="insert into user values(null,?)";

    pre=con.prepareStatement(sql);

    pre.setString(1,name+i);

    pre.executeUpdate();

    i++;

    }

    long b=System.currentTimeMillis();//结束时间

    System.out.println("插入不用存储过程用时:"+(b-a));

    }

    相关文章

      网友评论

          本文标题:存储过程

          本文链接:https://www.haomeiwen.com/subject/yklvnttx.html