数据库 - 存储过程

1、使用状况java

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

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

 

3、建立语法session

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

      END
    //
  DELIMITER;

说明:oop

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

   三、存储过程参数spa

     至关于java的变量,用于存储过程当中的使用。hibernate

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

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

   四、过程体

    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 判断语句

      一、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 循环语句

      一、while 条件  do   SQL   end while;

       例子:while  var<6  do  

          insertinto t values(var);

          set <var=var+1;

        end  while;

        二、  loop  SQL   end loop;

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

 

4、调用存储过程

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

  参数:若是是in参数,直接写参数便可。若是是out参数,格式:@参数名

  例如:

    CALL pro_second(@a);

    SELECT @a;

  一、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();

  二、Mybatis调用存储过程

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

 

5、删除存储过程

  drop procedure product;

6、查看存储过程

  一、SHOW  CREATE  PROCEDURE 存储过程名称

  二、SELECT * FROM information_schema.ROUTINES

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

 

7、修改存储过程

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

 

8、参数类型

    一、数值类型

   

   二、日期和时间类型

  

    三、字符串类型