1. 程式人生 > >【mybatis】mybatis呼叫sqlserver儲存過程和表值函式

【mybatis】mybatis呼叫sqlserver儲存過程和表值函式

儲存過程和表值函式的區別

最簡單的區別是儲存過程是pr開頭的,而儲存過程是fn開頭的,表值函式返回的是一個表結構的結果。如果mybatis用呼叫儲存過程的方式去呼叫表值函式,就會丟擲以下的異常:

exception:不能呼叫'xxxxx',因為'xxxx'是表值函式物件。

呼叫儲存過程

如果要呼叫一個叫做“pr_test_a”的儲存過程,需要傳入引數並且有返回值。如下所示,resultMap中存的是返回值的欄位名和型別,在select中呼叫儲存過程,傳入對應的引數

<resultMap type="java.util.HashMap" id="resultMap">
	<result column="id" property="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
	<result column="code" property="code" javaType="java.lang.String" jdbcType="VARCHAR"/>
	<result column="name" property="name" javaType="java.lang.String" jdbcType="VARCHAR"/>
	<result column="modified_time" property="modifiedTime" javaType="java.sql.Timestamp" jdbcType="TIMESTAMP"/>
</resultMap>

<select id="selectA" parameterType="java.util.HashMap" statementType="CALLABLE" resultMap="resultMap">
	{
    	call pr_test_a(
    	#{id,mode=IN,jdbcType=INTEGER},
    	#{card_no,mode=IN,jdbcType=VARCHAR}
	}
</select>

呼叫表值函式

就當做一張表來查詢即可。如呼叫一個表值函式fn_test_b,返回結果到resultMap中。

<resultMap type="java.util.HashMap" id="resultMap">
    <result column="fullid" property="fullid" javaType="java.lang.String" jdbcType="VARCHAR"/>
    <result column="seq" property="seq" javaType="java.lang.String" jdbcType="VARCHAR"/>
    <result column="material_id" property="materialId" javaType="java.lang.Integer" jdbcType="INTEGER"/>
</resultMap>

<select id="fn_bom_decomposition" parameterType="java.util.HashMap" resultMap="resultMap">
    select * from fn_test_b(
        #{material_id,mode=IN,jdbcType=INTEGER},
        #{quantity,mode=IN,jdbcType=NUMERIC},
        #{start_time,mode=IN,jdbcType=TIMESTAMP}
    )
</select>