一、前言
我们知道在plsql里可以通过下面方式执行存储过程,
begin P_ACCOUNT(202004270000) ; end; --或者 call P_ACCOUNT(202004270000)
但是在代码里如何调用存储过程呢,我试了一些网上大家提供的方法,基本没用效果,包括在@Query后面加{call P_ACCOUNT(?,?)} 什么存储过程名称的,或者各种接口、实现类互相调用的,都是千篇一律,不知道哪家copy哪家的,都没有任何效果 。
或者这些方法对他们的项目可能有用,亦是我的姿势可能不对,但是总的来说,下面这个方法是我亲测可用的,而且实现起来相对更简单,十行代码都不到就能实现
二、调用存储过程Demo
//公众号灵儿的笔记:zygxsq @Transactional @Modifying @Query public void callProcedureSend(Long Id){ logger.info("调用存储过程P_ACCOUNT({})",new Object[]{Id}); StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("P_ACCOUNT"); storedProcedure.registerStoredProcedureParameter("A_ID", Long.class, ParameterMode.IN); storedProcedure.registerStoredProcedureParameter("result", String.class, ParameterMode.OUT); storedProcedure.setParameter("A_ID", Id); boolean execute = storedProcedure.execute(); //博客原帖链接:https://blog.csdn.net/qq_27471405/article/details/105794591 //获取返回结果 String result = storedProcedure.getOutputParameterValue("result").toString(); }
三、代码说明
P_ACCOUNT :就是在oracle中的存储过程名称
A_ID :就是入参,如果还有其他入参,就再写一行,
storedProcedure.registerStoredProcedureParameter("xxx参数", 参数类型, ParameterMode.IN);
我这里的入参id是一个number类型,所以这里用Long.class,如果是char类型,这里就用String.class
result:这里是自定义一个返回值的参数名称,如果存储过程有返回值返回,就加这行代码,如果没有的话,就不需要加这两行了
storedProcedure.registerStoredProcedureParameter("result", String.class, ParameterMode.OUT);
String result = storedProcedure.getOutputParameterValue("result").toString();