How to call Oracle function or stored procedure using spring persistence framework?

后端 未结 4 1491
忘掉有多难
忘掉有多难 2020-12-13 15:57

I am using Spring persistence framework for my project. I want to call oracle function or stored procedure from this framework.

Can anybody suggest how can I achieve

相关标签:
4条回答
  • 2020-12-13 16:37

    In my opinion this is one of the easiest approaches:

    public class ServRepository {
    
        private JdbcTemplate jdbcTemplate;
        private SimpleJdbcCall functionGetServerErrors;
    
        @Autowired
        public void setDataSource(DataSource dataSource) {
            this.jdbcTemplate = new JdbcTemplate(dataSource);
            JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
            jdbcTemplate.setResultsMapCaseInsensitive(true);
            this.functionGetServerErrors = new SimpleJdbcCall(jdbcTemplate).withFunctionName("THIS_IS_YOUR_DB_FUNCTION_NAME").withSchemaName("OPTIONAL_SCHEMA_NAME");
        }
    
            public String callYourFunction(int parameterOne, int parameterTwo) {
                SqlParameterSource in = new MapSqlParameterSource().addValue("DB_FUNCTION_INCOMING_PARAMETER_ONE", parameterOne).addValue("DB_FUNCTION_INCOMING_PARAMETER_TWO", parameterTwo);
                return functionGetServerErrors.executeFunction(String.class, in);
            }
    }
    
    0 讨论(0)
  • 2020-12-13 16:42

    Calling function using NamedParameterJdbcTemplate:

    final String query = "select MY_FUNCTION(:arg1, :arg2, :arg3) from dual";
    Map<String, Object> argMap = new HashMap<>();
    argMap.put("arg1", "value1");
    argMap.put("arg2", 2);
    argMap.put("arg3", "value3");
    final String result = new NamedParameterJdbcTemplate(dataSource)
            .queryForObject(query, argMap, String.class);
    

    Calling procedure using JdbcTemplate:

    final String query = "call MY_PROCEDURE(?, ?, ?)";
    final Object[] args = {"arg1", "arg2", "arg3"};
    new JdbcTemplate(dataSource).execute(query, args, String.class);
    

    Calling function using SimpleJdbcCall:

    final String result = new SimpleJdbcCall(dataSource)
            .withCatalogName("MY_PACKAGE")
            .withFunctionName("MY_FUNCTION")
            .executeFunction(String.class, "arg1", "arg2");
    

    Calling procedure using SimpleJdbcCall:

    new SimpleJdbcCall(dataSource)
            .withCatalogName("MY_PACKAGE")
            .withProcedureName("MY_PROCEDURE")
            .execute("arg1", arg2);
    
    0 讨论(0)
  • 2020-12-13 16:45

    Assuming you are referring to JdbcTemplate:

    jdbcTemplate.execute(
        new CallableStatementCreator() {
            public CallableStatement createCallableStatement(Connection con) throws SQLException{
                CallableStatement cs = con.prepareCall("{call MY_STORED_PROCEDURE(?, ?, ?)}");
                cs.setInt(1, ...); // first argument
                cs.setInt(2, ...); // second argument
                cs.setInt(3, ...); // third argument
                return cs;
            }
        },
        new CallableStatementCallback() {
            public Object doInCallableStatement(CallableStatement cs) throws SQLException{
                cs.execute();
                return null; // Whatever is returned here is returned from the jdbcTemplate.execute method
            }
        }
    );
    

    Calling a function is almost identical:

    jdbcTemplate.execute(
        new CallableStatementCreator() {
            public CallableStatement createCallableStatement(Connection con) {
                CallableStatement cs = con.prepareCall("{? = call MY_FUNCTION(?, ?, ?)}");
                cs.registerOutParameter(1, Types.INTEGER); // or whatever type your function returns.
                // Set your arguments
                cs.setInt(2, ...); // first argument
                cs.setInt(3, ...); // second argument
                cs.setInt(4, ...); // third argument
                return cs;
            }
        },
        new CallableStatementCallback {
            public Object doInCallableStatement(CallableStatement cs) {
                cs.execute();
                int result = cs.getInt(1);
                return result; // Whatever is returned here is returned from the jdbcTemplate.execute method
            }
        }
    );
    
    0 讨论(0)
  • 2020-12-13 16:57

    Simpler way of calling a Oracle function in Spring is subclassing StoredProcedure like below

    public class MyStoredProcedure extends StoredProcedure{
        private static final String SQL = "package.function";
    
        public MyStoredProcedure(DataSource ds){
            super(ds,SQL);
            declareParameter(new SqlOutParameter("param_out",Types.NUMERIC));
            declareParameter(new SqlParameter("param_in",Types.NUMERIC));
            setFunction(true);//you must set this as it distinguishes it from a sproc
            compile();
        }
    
        public String execute(Long rdsId){
            Map in = new HashMap();
            in.put("param_in",rdsId);
            Map out = execute(in);
            if(!out.isEmpty())
                return out.get("param_out").toString();
            else
                return null;
        }
    }
    

    And call it like this

    @Autowired DataSource ds;
    MyStoredProcedure sp = new MyStoredProcedure(ds);
    String i = sp.execute(1l);
    

    The Oracle function used here just takes in a numeric parameter and returns a numeric paramter.

    0 讨论(0)
提交回复
热议问题