Весенний шаблон JDBC. Как получить переменные результата скрипта pl / sql - PullRequest
1 голос
/ 12 февраля 2012

Я использую NamedParameterJdbcTemplate для запуска сценария pl / sql. Но я не знаю, как я могу получить значения переменных (: id_out ). Заранее спасибо.

String script = "declare 
                   begin 
                     if myFunc(:id_in) is null then 
                        :id_out := 0; 
                     else 
                        :id_out := 1; 
                     end if; 
                   end;";
Map<String,Object> bindVars = new HashMap<String, Object>();
bindVars.put(id_in,1);
bindVars.put(id_out,2);


jdbcTmpl.execute(script, bindVars, new PreparedStatementCallback<Object>() {
    @Override public Object doInPreparedStatement(PreparedStatement cs)
        throws SQLException, DataAccessException {
        cs.execute();
        return null;
                }
       }
       );

Ответы [ 3 ]

5 голосов
/ 02 мая 2012

Это можно сделать с помощью простого JdbcTemplate, как в следующем примере, но обратите внимание на то, как значение OUT должно быть указано в анонимном блоке plsql с помощью "?: ='Thing ';

Параметры 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<String>() {
            @Override
            public String doInCallableStatement(CallableStatement callablestatement) throws SQLException,
                    DataAccessException {
                callablestatement.executeUpdate();
                return (String) callablestatement.getObject(2);
            }
        });
4 голосов
/ 12 февраля 2012

Я не верю, что вы можете использовать NamedParameterJdbcTemplate (или любой другой подкласс JdbcTemplate) с анонимными блоками PL / SQL, такими как описанные выше.Вы должны будете обернуть свой анонимный блок PL / SQL в хранимую процедуру или функцию.

Spring предназначен для переноса между базами данных.Насколько я знаю, ни в MySQL, ни в SQL Server нет концепции, аналогичной анонимным блокам Oracle PL / SQL (хотя я рад, что оказался не прав в этом вопросе).Поскольку эта функция не переносится между базами данных, Spring не может поддерживать ее только для Oracle.

0 голосов
/ 13 июня 2013
List<SqlParameter> params = new LinkedList<SqlParameter>();
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<String, Object> 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...