2009-05-14 2 views
7

Я использую Spring persistence framework для моего проекта. Я хочу вызвать функцию oracle или хранимую процедуру из этой структуры.Как вызвать функцию Oracle или хранимую процедуру, используя фреймворк весов?

Может ли кто-нибудь предложить, как я могу это достичь.

Пожалуйста, дайте решение как для функции oracle, так и для хранимой процедуры.

Спасибо.

+0

Spring имеет рамки настойчивость? Вы имеете в виду Spring JdbcTemplate? Или спящий? –

+0

Я использовал DPTK для создания основы сохранения и фабрики запросов Spring. Теперь вы хотите вызвать функцию oracle или хранимую процедуру, используя существующую функциональность, можете помочь мне отсортировать это. – 2009-05-14 11:06:43

+0

DPTK представляется продуктом IBM: http://www.alphaworks.ibm.com/tech/dptk –

ответ

32

Предполагая, что вы имеете в виду 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 
     } 
    } 
); 

Вызов функции практически идентичны:

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

здесь мы вызываем SP, как мы можем назвать функцию Oracle ... Я не ссылаюсь на JdbcTemplate, я повторяю структуру persistence с помощью DPTK .. – 2009-05-14 11:10:30

+0

Второй пример - вызов функции. К сожалению, я не знаком с ДПТК. У него есть веб-сайт? –

+0

хорошо, я постараюсь реализовать это с помощью моего кода ... надеюсь, что это сработает. Спасибо Адаму, дадут вам знать результат. – 2009-05-14 11:16:08

17

простой способ вызова функции Oracle в Spring является подклассов StoredProcedure, как показано ниже

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; 
    } 
} 

И назовите это так

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

Функция Oracle, используемая здесь, просто принимает числовой параметр и возвращает числовой параметр.

+0

как я понимаю, код SQL должен выглядеть так: '{: param_out = вызов schema.package.MY_FUNCTION (: param_in)}' – mmoossen

+0

мой последний комментарий неправильный. константа SQL должна содержать только имя процедуры/функции, например 'schema.package.MY_FUNCTION', и имена параметров в Java ** HAVE ** для соответствия именам параметров, как определено в процедуре/функции. – mmoossen

0

На мой взгляд, это один из самых простых подходов:

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); 
     } 
} 
Смежные вопросы