Я пытался найти способ выполнять сохраненные вызовы процессов из Spring 3.0 в Oracle 11.2, имея в виду следующие элементы:
- Многие вызовы выполняются хранимыми процедурами, которые имеют множество необязательных параметров (параметры, которые имеют значения по умолчанию).
- Существуют хранимые процедуры, которые могут содержать сочетание:
IN
,OUT
и / илиIN OUT
. - Мне не нужно обрабатывать
OUT
.
Я хотел бы иметь возможность вызывать сохраненную процедуру с необходимыми параметрами (обязательными и / или необязательными). Другими словами, я не хочу передавать значение (даже null
) необязательным параметрам на свой выбор (похоже, когда null
передается программно [хотя и не в PL / SQL] в сопоставитель параметров, значения по умолчанию не используются). Я попытался реализовать эти вызовы как можно большим количеством возможных способов, но ничего не помогло:
create or replace
procedure update_stored_proc (
h1 in boolean default false,
h2 in number,
h3 in varchar2 default 'H3',
h4 in varchar2 default 'H4',
h5 in varchar2 default 'H5',
h6 in out number
);
Для update_stored_proc()
есть только два обязательных параметра (h2
и h6
) и четыре необязательных. Моя конечная цель - вызвать update_stored_proc()
, передав h1
, h2
и h6
. Даже когда я вызываю сохраненную процедуру через SimpleJdbcCall
со всеми установленными значениями, я получаю исключение:
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(updatingDataSource)
.withProcedureName("update_stored_proc")
.withoutProcedureColumnMetaDataAccess();
simpleJdbcCall.declareParameters(new SqlParameter("h1", OracleTypes.BOOLEAN))
.declareParameters(new SqlParameter("h2", OracleTypes.NUMBER))
.declareParameters(new SqlParameter("h3", OracleTypes.VARCHAR))
.declareParameters(new SqlParameter("h4", OracleTypes.VARCHAR))
.declareParameters(new SqlParameter("h5", OracleTypes.VARCHAR))
.declareParameters(new SqlInOutParameter("h6", OracleTypes.NUMBER));
MapSqlParameterSource in = new MapSqlParameterSource()
.addValue("h1", false, OracleTypes.BOOLEAN)
.addValue("h2", 123, OracleTypes.NUMBER)
.addValue("h3", "h3", OracleTypes.VARCHAR)
.addValue("h4", "h4", OracleTypes.VARCHAR)
.addValue("h5", "h5", OracleTypes.VARCHAR)
.addValue("h6", "h6", OracleTypes.NUMBER);
simpleJdbcCall.compile();
simpleJdbcCall.execute(in);
Исключение, которое я получаю, указывает на то, что тип столбца каким-то образом недействителен:
org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL [{call update_stored_proc(?, ?, ?, ?, ?, ?)}]; SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type
Я заменил OracleTypes
на Types
и даже вынул withoutProcedureColumnMetaDataAccess()
, но ошибка не исчезла.