Подтвердить что ты не робот

Хранимые процедуры как запросы: CallableStatement vs. PreparedStatement

Документация PostgreSQL рекомендует использовать CallableStatement для вызова хранимых процедур.

В случае хранимой процедуры, которая возвращает набор строк, каковы различия между использованием CallableStatement:

String callString = "{ call rankFoos(?, ?) }";
CallableStatement callableStatement = con.prepareCall(callString);
callableStatement.setString(1, fooCategory);
callableStatement.setInt(2, minimumRank);
ResultSet results = statement.executeQuery();

И используя обычный PreparedStatement:

String queryString = "SELECT FooUID, Rank FROM rankFoos(?, ?);";
PreparedStatement preparedStatement = connection.prepareStatement(queryString);
preparedStatement.setString(1, fooCategory);
preparedStatement.setInt(2, minimumRank);
ResultSet results = statement.executeQuery();

Как я понимаю, CallableStatement предлагает язык-агностический способ вызова хранимых процедур. Для меня это не имеет значения, поскольку я знаю, что использую PostgreSQL. Насколько я вижу, очевидным преимуществом использования PreparedStatement является более универсальный запрос, рассматривающий хранимую процедуру как таблицу, на которой я могу использовать WHERE, JOIN, ORDER BY и т.д.

Есть ли аспекты или различия между методами, которые мне не хватает? В случае хранимой процедуры, используемой в качестве запроса, которая рекомендуется?

4b9b3361

Ответ 1

Я уверен, что второй подход вообще не работает с некоторыми РСУБД, но поскольку вы собираетесь использовать PostgreSQL, это не имеет большого значения. Для вашего простого случая, действительно, не так уж много недостатка. Есть две проблемы, которые я вижу:

  • В зависимости от того, как записываются хранимые процедуры, для выполнения процедуры может потребоваться регистрация параметров. Это не будет возможным с подготовленными заявлениями. Если вы контролируете создание хранимой процедуры и вызывающего кода, вам, вероятно, не стоит беспокоиться об этом.

  • Это ограничивает эффективность вызова хранимых процедур в первую очередь. Одним из основных преимуществ хранимой процедуры является инкапсуляция логики запросов на уровне базы данных. Это позволяет настраивать запрос или в некоторых случаях добавлять функциональные возможности без внесения изменений в код. Если вы планируете добавлять, где клаузулы присоединяются к результатам вызова хранимой процедуры, почему бы просто не поместить исходный запрос в ваш java-слой?

Ответ 2

Основное отличие - независимость и инкапсулированный способ программирования.

Представьте, что вы программист на Java, и вы не знаете, как использовать базу данных, таким образом, вы не можете использовать второй метод, и u встретит проблемы во втором случае.

Первый метод позволяет вам выполнить свой Java-код и попросить кого-нибудь написать для вас quires как хранимую процедуру, поэтому вы можете легко их использовать.

Я согласен с @dlawrence