oracle存儲過程實例,mybatis調oracle存儲過程

----存儲過程   INSERT_MAT_ID_PROCEDURE實例

create or replace procedure      INSERT_MAT_ID_procedure (IN_PRD_PLAN_ID IN VARCHAR2,IN_MAT_ID IN VARCHAR2 ,results out varchar2)


IS
    v_str FLOAT;
    v_count number(10);
    v_results VARCHAR2(2000);
    v_order_num VARCHAR2(20);
    v_ORDER_ITEM_NUM VARCHAR2(20) default '-1';




CURSOR ORDER_ITEM_NUM(v_PRD_PLAN_ID VARCHAR2)
       IS


SELECT ORDER_ITEM_NUM
  FROM SC_ORDER_PLAN
 WHERE PRD_PLAN_ID = v_PRD_PLAN_ID;




 CURSOR SC_PLAN_DETAIL_standard(v_IN_MAT_ID VARCHAR2)
       IS


SELECT PRD_STANDARD
  FROM SC_PLAN_DETAIL SPD
 WHERE SPD.MAT_ID = (SELECT SP.PRD_PLAN_PRODUCTION_PRD_ID
                       FROM SC_PRD SP
                      WHERE SP.PRD_ID = v_IN_MAT_ID);
       
BEGIN
 --把投料的材料號插入SC_ORDER裏
        
      IF UPPER(SUBSTR(IN_MAT_ID,1,2))!=UPPER('KC') THEN  
            BEGIN
        SELECT count(distinct PRD_STANDARD) into v_count  FROM SC_ORDER WHERE ORDER_PK=IN_MAT_ID;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          v_count := 0;
      END;


        IF v_count=0 THEN


                SELECT  distinct order_num
                  INTO v_order_num
                  FROM SC_ORDER_PLAN
                 WHERE PRD_PLAN_ID = IN_PRD_PLAN_ID;
    


        FOR v_SC_prd_standard IN SC_PLAN_DETAIL_standard(IN_MAT_ID) LOOP
         
            begin
               SELECT ORDER_ITEM_NUM
               INTO v_ORDER_ITEM_NUM
                FROM SC_order  
                WHERE     order_num = v_order_num
               AND prd_standard = v_SC_prd_standard.PRD_STANDARD
               AND (order_pk IS NULL or order_pk='')
               AND ROWNUM = 1;
            
             EXCEPTION
            WHEN NO_DATA_FOUND THEN
              v_ORDER_ITEM_NUM := '-1';
            END;


            if v_ORDER_ITEM_NUM !='-1' then
              update sc_order set order_pk=IN_MAT_ID 
              where ORDER_ITEM_NUM=v_ORDER_ITEM_NUM; 
              results:='OK';
            end if;
            END LOOP;
            
          else
          results:='NO';


          END IF;
        
        else
          results:='NO';
   
          end IF;
        
     
END INSERT_MAT_ID_procedure;




----mybatis調用orcle存儲過程,參數類型是map

<select id="queryTableNum" statementType="CALLABLE" parameterType="java.util.Map">

  {call INSERT_MAT_ID_PROCEDURE(#{inPrdPlanId,mode=IN,jdbcType=VARCHAR},#{inMatId,mode=IN,jdbcType=VARCHAR},#{results,mode=OUT,jdbcType=VARCHAR})}

 </select>


---Mybatis調用存儲過程並獲取out參數

mapper調用存儲過程

<select id="updateName" statementType="CALLABLE" parameterType="java.util.Map" resultType="java.util.Map"> 
call UPDATE_PRO_NAME(#{oldName,mode=IN,jdbcType=VARCHAR},
#{newName,mode=IN,jdbcType=VARCHAR},
#{results,mode=OUT,jdbcType=VARCHAR})  
  </select>


service層傳參並獲取out參數

//測試調用存儲過程
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("oldName","張三");
map.put("newName","李四");
map.put("results","");//out參數,傳一個空串

                //這裏如果再用一個map來接收返回值,返回值會是null,直接調用就行了,過程會將out參數輸出到傳入的map參數裏

firstProductMapper.updateName(map);
String restrString = (String) map.get("results");



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章