При вызове хранимой процедуры я использую этот код:
connection = getConnection();
stmt = connection.prepareCall("{call MPLOGIN (?, ?, ?, ?, ?, ?)}");
stmt.setString("VUSCD", uscd);
stmt.setString("VPWD", pwd);
stmt.setString("VPCSQ", pcsq);
stmt.setString("VHWID", hwid);
stmt.registerOutParameter("VLOGID", OracleTypes.VARCHAR);
stmt.registerOutParameter("VKQ", OracleTypes.VARCHAR);
stmt.execute();
String vlogid = stmt.getString("VLOGID");
String vkq = stmt.getString("VKQ");
напишите эту скучную обертку для нескольких процедур, это не проблема, но если есть сотни процедур, это действительно кошмар Есть ли более простой способ вызвать процедуру хранилища, чем этот способ? Редактирование: я думаю, что генератор кода, который использует параметры процедуры из БД, является способом elagant, но я ничего не понимаю в java
Мне нравится использовать MyBatis структуру данных для таких проблем. Подробный пример работы с MyBatis и хранимыми процедурами можно найти на http://loianegroner.com/2011/03/ibatis-mybatis-working-with-stored-procedures/
Возможно, вы можете создать общую оболочку, что-то вроде следующих строк:
public Map<String, String> SPWrapper(String call, Map<String, String> inParams, Map<String, OracleTypes> outParams)
{
connection = getConnection();
try
{
stmt = connection.prepareCall(call);
for(String inParam : inParams.keys())
{
stmt.setString(inParam, inParams.get(inParam));
}
for(String outParam : outParams.keys())
{
stmt.registerOutParameter(outParam, outParams.get(outParam));
}
stmt.execute();
Map<String,String> results = new HashMap<String, String>();
for(String outParam : outParams.keys())
{
results.put(outParam, stmt.getString(outParam));
}
return results;
}
catch (Exception e)
{
//LOG Exception
return new HashMap<String, String>();
}
finally
{
connection.close(); //Do not leave connections open.
}
}
Вам все равно нужно передать call
и объявить переменные, но по крайней мере у вас теперь есть одна универсальная оболочка для обработки всех ваших вызовов.
HashMap<String, String> inMap = HashMap<String, String>(); HashMap<String, String> outMap = HashMap<String, String>(); inMap.put("VUSCD", uscd); inMap.put("VPWD", pwd); inMap.put("VPCSQ", pcsq); inMap.put("VHWID", hwid);
Установка значения для inMap так же странна, как и обычно :(
Нет другого пути. Да, это скучно, но количество процедур конечно. Эти процедуры похожи на методы на Java, поэтому вы должны работать с ними в установленных правилах. Только одна удобная вещь, которую вы могли бы сделать - создать специальный класс, который будет содержать обернутые методы для каждой процедуры. В этом случае будет более элегантно называть их в бизнес-коде, что-то вроде этого:
String[] result = DAO.MPLOGIN(uscd, pwd, pcsq, hwid);
Но внутри этого метода вам нужно скопировать код, упомянутый выше.
В клиенте базы данных хранимая процедура, такая как myproc (10,20), вызывается просто по инструкции выберите myproc (10,20);
Итак, в вашей программе JDBC вы можете просто сделать: connection = getConnection(); stmt = connection.createStatement(); stmt.executeQuery( "select myproc (10,20)" );
Если процедура возвращает что-то, то положите ее в ResultSet