The OpenNET Project / Index page

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



"Выпуск документ-ориентированной СУБД Apache CouchDB 2.3.0"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Заметили полезную информацию ? Пожалуйста добавьте в FAQ на WIKI.
. "Выпуск документ-ориентированной СУБД Apache CouchDB 2.3.0" +1 +/
Сообщение от Аноним (21), 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-запроса, убеждаешься в корректности запросов и только потом деплоишься.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск документ-ориентированной СУБД Apache CouchDB 2.3.0, opennews, 17-Дек-18, 23:29  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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