Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.014 c
1-6609
Beastie
2003-03-14 11:44
2003.04.03
Как вывести на печать содержимое TStringGrid


3-6374
Gonta
2003-03-14 15:09
2003.04.03
Проблема с поиском в Dbase


14-6713
race1
2003-03-15 15:06
2003.04.03
c++


3-6395
SATAN aka NAPALM
2003-03-15 12:46
2003.04.03
Базы данных


1-6502
DenisLK
2003-03-24 15:54
2003.04.03
qtintf.dll ???