一、使用情况

    对于复杂业务、简单sql无法解决问题、操作大量表的时候使用存储过程。

二、优缺点
  优点:1、减少访问数据库连接次数,这是数据库执行效率需要考虑的一个重点。
     2、易维护,相对于复杂的程序代码,直接修改存储过程,更加快捷。
          3、存储过程,只在创建时进行编译,之后就不用编译了。而普通sql,每次执行都需要编译(因为他们和代码放在一起)。
       4、减轻编码工作,可以少些很多代码。
  缺点: 1、开发调试不方便,相对于程序代码,存储过程打断点进行调试,只能开发者去查看存储过程。
      2、如果需要使用中间数据,则不能使用存储过程。
      3、编写比较困难,有许多固定格式需要注意。
      4、移植性差,不同数据库厂家,存储过程的语法不同。

 

三、创建语法

   DELIMITER //
     CREATE  PROCEDURE  存储过程名(参数)
       存储过程参数
      BEGIN
                    过程体

      END
    //
  DELIMITER;

说明:

  1、存储过程名:pro_**
  2、参数:参数有三种类型。
    IN: 输入参数。调用该存储过程,必须附带该参数
    OUT: 输出参数。调用该存储过程后,返回的结果。
    INOUT: 输入输出参数。结合IN、OUT特性
    格式:OUT p_out int。p_out为参数名称,int为参数类型。 参数类型

   3、存储过程参数

     相当于java的变量,用于存储过程中的使用。

     格式:declare param_name type(参数类型)

     例子:declare total decimal(8) default 6;

   4、过程体

    4.1 可以写多个SQL语句。封号“;”隔开

      INSERT INTO table1 VALUES (variable1);

      select Sum(item_price*quantity)  from orderitems  where order_num = onumber

    4.2 使用存储过程参数

      SQL into 参数

      SET  变量 = “”

      例子:select Sum(item_price*quantity)  from orderitems  >where order_num = onumber  into total;

         select total into ototal;

           SET variable1 = 'birds';

      4.3 判断语句

      1、if  条件  then  SQL   elseif   SQL   else   SQL   end if;

       例子:if   taxable   then

             select total+(total/100*taxrate) into total;

          end  if;

      2、case  when 条件 then SQL   when 条件  then  SQL  end case;

       例子:case

            when var=0 then insert into t values(30);

            when var>0 then ...

            when var<0 then

          end case;

      4.4 循环语句

      1、while 条件  do   SQL   end while;

       例子:while  var<6  do  

          insertinto t values(var);

          set <var=var+1;

        end  while;

        2、  loop  SQL   end loop;

       例子: LOOP
          IF  v_Hour>23  THEN
            v_Hour = 0;
          EXIT;
         END LOOP;

 

四、调用存储过程

  在其他存储过程中调用 或者【call  存储过程名称(参数);】

  参数:如果是in参数,直接写参数即可。如果是out参数,格式:@参数名

  例如:

    CALL pro_second(@a);

    SELECT @a;

  1、hibernate调用存储过程

    //1. 获得Session

      Session session = HibernateSessionFactory.getSession();

    //2. 设置查询过程字符串 

      String procName = "{Call   存储过程名(参数)}";

    //3. 创建本地查询对象,把查询字符串传入,加入参数

      SQLQuery sqlquery = session.createSQLQuery(procName);

      sqlquery.setString(0,"sdf");

      sqlquery.setString(1,"sdf");

    //4. 执行存储过程,返回集合

      List  list = sqlquery.list();

    //5. 关闭session

      session.close();

      HibernateSessionFactory.closeSession();

  2、Mybatis调用存储过程

    <select id="getUserCount" parameterMap="***" statementType="***">
       {CALL 存储过程名(参数)}
    </select>
    例子:
      {call hlj.customer_interview(
#{a,jdbcType=INTEGER,mode=IN},#{b,jdbcType=INTEGER,mode=IN})}

 

五、删除存储过程

  drop procedure product;

六、查看存储过程

  1、SHOW  CREATE  PROCEDURE 存储过程名称

  2、SELECT * FROM information_schema.ROUTINES

    WHERE routine_name='存储过程名称' AND routine_type='PROCEDURE'

 

七、修改存储过程

  MySQL目前不支持该功能。只能先drop删除后,再创建

 

八、参数类型

    1、数值类型

   

   2、日期和时间类型

  

    3、字符串类型