Spring JDBC模板。 如何获得pl / sql脚本的结果变量

我正在使用NamedParameterJdbcTemplate运行pl / sql脚本。 但我不知道如何获得out变量的值( :id_out )。 提前致谢。

String script = "declare begin if myFunc(:id_in) is null then :id_out := 0; else :id_out := 1; end if; end;"; Map bindVars = new HashMap(); bindVars.put(id_in,1); bindVars.put(id_out,2); jdbcTmpl.execute(script, bindVars, new PreparedStatementCallback() { @Override public Object doInPreparedStatement(PreparedStatement cs) throws SQLException, DataAccessException { cs.execute(); return null; } } ); 

我不相信你可以使用NamedParameterJdbcTemplate(或JdbcTemplate的任何其他子类)与上面的匿名PL / SQL块。 您必须将匿名PL / SQL块包装到存储过程或函数中。

Spring旨在跨数据库移植。 据我所知,MySQL和SQL Server都没有类似于Oracle的匿名PL / SQL块的概念(尽管我很高兴在这一点上被certificate是错误的)。 由于此function不能跨数据库移植,因此Spring不能仅仅支持Oracle。

它可以使用普通的JdbcTemplate来完成,如下例所示,但请注意必须在匿名plsql块中使用“?:=’something’指定OUT值的方式;

下面使用的java参数:String id =“12345”和String fixSql =

  declare p_id VARCHAR2(20) := null; p_status_message VARCHAR2(32767) := null; begin p_id := ?; p_status_message := ' Everything is possible: ' || p_id; ? := 'Return text.' || p_status_message; end; 

注意上面的两个问号 – 第一个是有效的IN参数,第二个是OUT参数。 此代码将调用它:

  public class Foo extends JdbcDaoSupport { ... public String doAnonymousPlSql(final String id, String fixSql) throws CustomerFixException { String resultValue = getJdbcTemplate().execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection connection) throws SQLException { CallableStatement sql = connection.prepareCall(fixSql); sql.setString(1, id); sql.registerOutParameter(2, Types.VARCHAR); return sql; } } , new CallableStatementCallback() { @Override public String doInCallableStatement(CallableStatement callablestatement) throws SQLException, DataAccessException { callablestatement.executeUpdate(); return (String) callablestatement.getObject(2); } }); 
 List params = new LinkedList(); params.add(new SqlParameter(Types.NUMERIC)); params.add(new SqlParameter(Types.NUMERIC)); params.add(new SqlOutParameter("out_param_1", Types.NUMERIC)); params.add(new SqlOutParameter("out_param_2", Types.NUMERIC)); Map ret = simpleJdbcTemplate.getJdbcOperations().call( new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { CallableStatement cs = con.prepareCall("DECLARE ..." + "BEGIN ... " + "delete from table where table_field_1 = ? and table_field_2 = ? " + "returning out_param_1, out_param_2 into ?, ?; " + "END;" cs.setInt(1, first_in_param_value); cs.setInt(2, second_in_param_value); cs.registerOutParameter(3, Types.NUMERIC); cs.registerOutParameter(4, Types.NUMERIC); return cs; } }, params); ret.get("out_param_1"); ret.get("out_param_1");