从PL/SQL块返回值

Bac*_*ash 5 java oracle oracle11g mybatis

我需要从MyBatis中的PL/SQL块返回一个值.

PL/SQL块是这样的:

DECLARE
BEGIN
    <foreach collection="params" item="param">
        UPDATE PRIORITIES
        SET PRIORITY = #{param.priority}
        WHERE ID = #{param.id};
    </foreach>
END
Run Code Online (Sandbox Code Playgroud)

我需要返回一个值的原因是我希望能够获得受影响的行数.

我知道我可以这样做:

<update id="updateAll" parameterType="map">
    { call
    DECLARE
    BEGIN
        <foreach collection="params" item="param">
            UPDATE PRIORITIES
            SET PRIORITY = #{param.priority}
            WHERE ID = #{param.id};
        </foreach>

        #{affected_rows, jdbcType=DECIMAL, mode=OUT} := sql%rowcount;
    END
    }
</update>
Run Code Online (Sandbox Code Playgroud)

但这意味着我必须在java mapper中有这样的方法:

public void updateAll(Map<String, String> parameters);
Run Code Online (Sandbox Code Playgroud)

我改为:

public int updateAll(@Param("params") List<PriorityModel> model);
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有地图的情况下返回该值?

小智 1

我认为您无法从过程调用中返回值。可以在像 pojo 这样的对象或像您的示例一样的地图中设置一个值,但是,我认为如果您在同一个 sql 事务中在更新后执行查询,如下所示:

SELECT sql%rowcount FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

您可以像 ResultSet 一样获取受影响的行数。