The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск документ-ориентированной СУБД Apache CouchDB 2.3.0"
Отправлено Аноним, 18-Дек-18 11:39 
Вот уж нет. Лови минус. Тоже частично жабист, но больше быдлоораклоид. Запросы тоже можно сначала обкатать, до деплоя. И, если тебя не пугает привязка к конкретной БД (как упомянул выше - Oracle),внезапно, даже при "генерировании аргументов из кода", при использовании динамического SQL (на стороне БД) таки можно использовать PreparedStatement и переменные привязки. Просто передаешь с морды все возможные аргументы (их же не бесконечное число? а ненужные передаешь со значением null) в метод EJB-бина (или откуда ты собрался дергать БД), а дальше можно ручками низкоуровнево:


...
OracleCallableStatement stmt = null;
try {
  // подготавливаешь запрос
  stmt = (OracleCallableStatement)connection.prepareCall(
            "begin :result := porders.GetOrders(:p_offset,:p_limit,:p_client_id,:p_order_type_id,:p_order_state_id,:p_order_date_begin, ... <все аргументы, которые тебе нужны>");
...
// далее привязываешь параметры
stmt.registerOutParameter("result", OracleTypes.CURSOR);
stmt.setInt("p_offset", offset);
stmt.setInt("p_limit", limit);
...
// выполняешь хранимку на стороне БД
stmt.execute();
// обрабатываешь курсор                
OracleResultSet rs = (OracleResultSet) stmt.getObject("result");
...
----------

а на сервере БД (Oracle), в хранимке (которая в пакете), используешь динамический SQL с ПЕРЕМЕННЫМИ ПРИВЯЗКИ, а не со склеиванием значений аргументов:

function GetOrders( p_offset in integer,
                    p_limit in integer,
                    p_client_id in clients.id%type default null,
                    ...
   return SYS_REFCURSOR
is
  v_result SYS_REFCURSOR;
...
begin

  v_sql := 'SELECT .....'; -- Пишешь кусок SQL, НО НЕ СКЛЕИВАЕШЬ значения переданных в функцию аргументов, а пишешь конструкции типа:

  if p_client_id is not null then
    v_sql := v_sql || ' and ca.client_id = :p_client_id';
  else
    v_sql := v_sql || ' and :p_client_id is null';
  end if;
  ...
  open v_result
  for v_sql
  using -- "привязанные" переменные
     p_client_id,
   ...
   ;
  return v_result;
end;
--------------

можно вместо вышеприведенной конструкциии спользовать "EXECUTE IMMEDIATE..." или пакет DBMS_SQL (тогда не нужен будет IF ... ELSE..., достаточно будет просто IF... ) - главное, что SQL будет динамическим и аргументы привязываются, а не склеиваются их значения.
Пишешь хранимку в БД, выполняешь ее со всеми интересными тебе значениями параметров (ненужные передаешь со значением NULL), можешь логгировать в отдельную табличку каждый раз меняющийся текст  SQL-запроса, убеждаешься в корректности запросов и только потом деплоишься.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру