хранимые процедуры как запросы: CallableStatement vs. PreparedStatement - PullRequest
13 голосов
/ 18 сентября 2011

Документация 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 и т. Д.

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

Ответы [ 2 ]

12 голосов
/ 18 сентября 2011

Я почти уверен, что второй подход вообще не работает с некоторыми RDBMS, но, поскольку вы собираетесь использовать только PostgreSQL, это не должно иметь большого значения.В вашем простом случае недостатка не так много.Могут появиться две проблемы:

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

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

7 голосов
/ 20 октября 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...