數據庫 - 存儲過程

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、參數類型

    一、數值類型

   

   二、日期和時間類型

  

    三、字符串類型

  

相關文章
相關標籤/搜索