pl sql & java - создание динамического запроса - PullRequest
2 голосов
/ 23 сентября 2008

У меня есть дилемма, я использую Java и Oracle и пытаюсь поддерживать запросы на стороне PL / SQL. Все в порядке, пока у меня нет этих сложных запросов, которые могут иметь, а могут и не иметь условия.

В Java несложно составить предложение WHERE с условиями, но это нехорошо. А на стороне PL / SQL я также узнал, что единственная возможность для dynamic queries - это манипуляции со строками типа

IF inputname IS NOT NULL THEN    
    query := query ||' and NAME=' || inputname; 
END IF;

Теперь я думаю, что оставляю запрос в PL / SQL и отправляю предложение WHERE с параметром функции. Любые хорошие рекомендации или примеры, пожалуйста?

Ответы [ 5 ]

1 голос
/ 23 сентября 2008

PL / SQL не очень приятен для создания динамического SQL, как вы обнаружили, его работа со строками болезненна. Вы можете отправить предложение where от клиента, но вы должны убедиться, что проверка на SQL-инъекцию выполняется, т.е. убедитесь, что фраза начинается с «где», не имеет точки с запятой или только в конце (если это может произойти в середине вам нужно взглянуть из строкового разделителя и разрешить его только внутри них) и т. д. Другой вариант - это хранимая процедура, которая принимает предварительно определенный список параметров фильтров полей, применяя «лайк» для каждого столбца к полю параметра.

1 голос
/ 23 сентября 2008

SQLBuilder может быть полезен для вас со стороны Java. Это позволяет вам писать проверенный во время компиляции Java-код, который динамически создает sql:

String selectQuery =
  (new SelectQuery())
  .addColumns(t1Col1, t1Col2, t2Col1)
  .addJoin(SelectQuery.JoinType.INNER_JOIN, joinOfT1AndT2)
  .addOrderings(t1Col1)
  .validate().toString();
0 голосов
/ 23 сентября 2008

Я думаю, что лучше иметь всю логику создания запросов в одном месте, Java или Oracle. Я полагаю, что вы знаете, как сделать это на Java. В Oracle, если запрос извлекает только строку, вы можете использовать предложение EXECUTE IMMEDIATE ... INTO.

Если запрос возвращает несколько строк и имеет единственные параметры (без использования оператора IN), вы можете использовать стратегию REF CURSOR, чтобы зациклить результаты запроса или вернуть сам курсор в программу Java (вы должны импортировать Oracle java-предложения, если вы используй это). First Ref Cursor ответ в Google

Если вы должны использовать параметр IN (или в других редких случаях), вы должны проанализировать запрос с пакетом DBMS_SQL, который является СЛИШКОМ многословным и немного сложным в использовании, но он ОЧЕНЬ гибок. DBMS_SQL doc (смотрите схему перед тем, как читать методы)

0 голосов
/ 23 сентября 2008

Да, EXECUTE IMMEDIATE - тоже мой друг. Спасибо за предложения. Я думаю, что на этот раз я пытаюсь отправить только предложение WHERE с параметром

0 голосов
/ 23 сентября 2008

В PL / SQL используйте:

EXECUTE IMMEDIATE lString;

Это позволяет вам встроить lString (VARCHAR2) в большинство битов SQL, которые вы хотите использовать. например,

  EXECUTE IMMEDIATE 'SELECT  value
                     FROM    TABLE
                     WHERE   '||pWhereClause
  INTO    lValue;

Вы также можете вернуть несколько строк и выполнить операторы DDL в EXECUTE IMMEDIATE.

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