Текущий архив: 2003.04.03;
Скачать: CL | DM;
ВнизПередача списка значений в параметре (Delphi + Oracle) Найти похожие ветки
← →
Михаил Баринов (2003-03-17 10:48) [0]Наша фирма работает на базе Oracle в трехзвенной архитектуре.
Возникло желание избавляться от динамически формируемых запросов (типа " FIELD1 = " + IntToStr(Value1)) и переделать их на запросы с параметрами ("FIELD 1 = :PAR_FIELD1").
Все бы хорошо, если бы не одна проблема: как преобразовать такую конструкцию: "FIELD1 IN (1, 2, 3)"?
Может быть кто-то уже справилися с этим?
Заранее спасибо.
← →
PONTIY (2003-03-17 10:53) [1]а количество параметров в предложении IN как я понимаю непостоянно?
← →
Johnmen (2003-03-17 10:55) [2]В общем случае - нет.
Ничего не сказано о компонентах доступа...
← →
Михаил Баринов (2003-03-17 10:58) [3]Ага. В этом и проблема.
Ну т.е. как вариант на форме что-то вроде TCheckListBox.
Или в гриде несколько строк выделяется...
Да даже если есть набор строк ("1, 2, 3", "1, 5"). Не очень понятно как это передать.
← →
Михаил Баринов (2003-03-17 11:02) [4]В настоящий момент:
на сервере приложений BDE (TQuery, TStoredProc) + TDataSetProvider.
На клиенте: TSocketConnection, TClientDataSet.
← →
Nikolay M. (2003-03-17 13:16) [5]Если все заточено под BDE, то в данном случае можно вместо TQuery сделать TRXQuery - там есть макроподстановки.
← →
Val (2003-03-17 13:50) [6]хм. а как эта конструкция формируется сейчас?
может быть, попробовать вариантные массивы и .AsVariant?
← →
Val (2003-03-17 13:59) [7]хотя, про .AsVariant я погорячился.
← →
Geka (2003-03-17 14:05) [8]А может не стоит избавляться от всех динамических запросов?..
← →
petr_v_a (2003-03-17 14:27) [9]В Direct Oracle Access есть ComplexVariable
← →
Михаил Баринов (2003-03-17 15:16) [10]2 Nikolay M. ©
TRXQuery - гляну
2 Val ©
Да сейчас-то это дело формируется элементарно. Ну например по чекам в TCheckListBox формируется строка ID-шек.
Ну и потом
vSQLString := Format(" STATUS_ID IN (%s) ", StatusesList);
2 Geka ©
Выгода от параметров в том (извините если банально :), что запросы на орацле одинаковые будут. Т.е.
SELECT * FROM ... WHERE FIELD1 = 1 и
SELECT * FROM ... WHERE FIELD1 = 2 - разные запросы
а SELECT * FROM ... WHERE FIELD1 = :PAR_FIELD - один :)
Тут дело такое - сейчас колбашу компонент, которому можно указать список контролов (с условиями фильтра), поляны по каждому контролу и вид операции (типа > < like...).
А потом, чтобы автоматицки формировалась строка запроса/заполнялись параметры. Хочеться чтобы все единообразно было.
Все получается, затык только с операцией IN.
Видать пока придется IN без параметров оставить..
← →
Val (2003-03-17 15:20) [11]Видать пока придется IN без параметров оставить..
угу, раз уж динамически количество меняется, даже без "пока"
← →
Val (2003-03-17 15:26) [12]хотя, хотя...
кто мешает по известому ведь! количеству тех же id-шек, приклеивать к тексту запроса в квери кусочки типа ",:p<порядковый № параметра>" (ну а к последнему еще и скобочку) ?
← →
Михаил Баринов (2003-03-17 15:30) [13]Val ©
Думаю всетаки "пока". Один вариант, который в будущем думаю обыграть - если перейдем на DOA (который упоминал petr_v_a), то там вид параметра есть Substitute. Вот если в него передам строчку, то гуд.
Спасибо большое всем!
Не ожидал такой быстрой реакции. :)
← →
Михаил Баринов (2003-03-17 15:38) [14]2 Val ©
Запросы для орацла разные будут
SELECT * ... WHERE DOC_ID IN (:PAR1, :PAR2) и
SELECT * ... WHERE DOC_ID IN (:PAR1, :PAR2, :PAR3)
хотя конечно вариант - подготовить 100 параметров и забить их нереальными условиями (-1)
:)
← →
id_privin (2003-03-17 15:48) [15]можно написать маленькую функцию, которая будет брать значение поля и строку, в которой через запятую перечислены параметры для IN. и тогда запрос будет выглядеть так
WHERE MYIN(COLUMN,:VAL_LIST)
Страницы: 1 вся ветка
Текущий архив: 2003.04.03;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.008 c