Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
VasyaRyjikov Участник
Вступление в Клуб: 28.02.2013
|
Пн Мар 11, 2013 23:04  Подставить вместо условия запроса значение переменной |
|
Полезность: Нет оценки
|
Доброго времени суток!
Вопрос: можно ли в текстовую переменную записать все условие запроса, и затем подставить значение переменной в условие, например:
Код: |
s varchar2;
s:='a.[MAIN_V_ID] like ''20202%''';
select a( a.[MAIN_V_ID] :C_MAIN_V_ID ) in ::[AC_FIN] all where (s);
|
Пробовал в тексте операции писать так:
Код: |
s varchar2;
s:='a.[MAIN_V_ID] like ''20202%''';
pragma macro('s1',s);
debug_pipe(&s1,0);
select a( a.[MAIN_V_ID] :C_MAIN_V_ID ) in ::[AC_FIN] all where (&s1);
|
Debug выводит содержимое s1 правильно, т.е. a.[MAIN_V_ID] like '20202%', на запрос операция не ругается, но и курсор в итоге пустой. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Мар 12, 2013 06:30  Re: Подставить вместо условия запроса значение переменной |
|
Полезность: Нет оценки
|
VasyaRyjikov пишет: | Доброго времени суток!
Вопрос: можно ли в текстовую переменную записать все условие запроса, и затем подставить значение переменной в условие |
нельзя.
только так:
Код: |
declare
v varchar2(32767);
r utils.ref_cursor;
b boolean;
n number;
begin
v := 'select 1 from dual';
b := utils.open_cursor(r, v);
loop
r.fetch(n);
exit when r%notfound;
-- обработка
end loop;
r.close;
end;
|
Но этот запрос на языке SQL, а не PL/+ |
|
 |
lexus Профи
Вступление в Клуб: 28.09.2007
|
Вт Мар 12, 2013 07:17   |
|
Полезность: Нет оценки
|
Динамический PL+ может помочь. Посмотрите в Runtime библиотека есть (название не помню точно). Как-то раз пользовался ради интереса. Работает. |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Вт Мар 12, 2013 08:31  Re: Подставить вместо условия запроса значение переменной |
|
Полезность: Нет оценки
|
VasyaRyjikov пишет: | например:
Код: |
s varchar2;
s:='a.[MAIN_V_ID] like ''20202%''';
select a( a.[MAIN_V_ID] :C_MAIN_V_ID ) in ::[AC_FIN] all where (s);
|
|
А можно узнать глубокий смысл такого? Ну я бы понял ещё что то типа такого:
Код: |
s varchar2;
s:='20202%';
select a( a.[MAIN_V_ID] :C_MAIN_V_ID ) in ::[AC_FIN] all where a.[MAIN_V_ID] like (s);
|
|
|
 |
maestro Профи
Вступление в Клуб: 12.10.2010
|
Вт Мар 12, 2013 09:02   |
|
Полезность: Нет оценки
|
Библиотека PLP тебе в помощь |
|
 |
Alexsey Эксперт
Вступление в Клуб: 06.09.2007
|
Вт Мар 12, 2013 12:06   |
|
Полезность: Нет оценки
|
можно попробовать использовать технологию макросов. _________________ всегда есть как минимум 2 выхода |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Мар 12, 2013 13:56   |
|
Полезность: Нет оценки
|
Alexsey пишет: | можно попробовать использовать технологию макросов. |
Не нужно увлекаться макросами.
Очень легко утонуть. И зависимости ломаются.
К тому же в скомпилированном коде всё равно будет несколько вариантов запросов.
Лично я бы явно описал несколько курсоров, либо сделал динамический SQL (не PL/+!).
Почему не PLP? Это вы сейчас думаете - да пофик, что система две десятых секунды над запросом думает, компилирует.
А потом кто-нибудь будет писать отчёт и для _каждого_ документа будет вызывать вашу функцию... |
|
 |
maestro Профи
Вступление в Клуб: 12.10.2010
|
Вт Мар 12, 2013 14:17   |
|
Полезность: Нет оценки
|
Random пишет: |
Лично я бы явно описал несколько курсоров...
|
+1
И то только в случае необходимости садить на разные генеральные выборки.
Если генеральная выборка одна, то и запрос должен быть один.
Цитата: |
Почему не PLP? Это вы сейчас думаете - да пофик, что система две десятых секунды над запросом думает, компилирует.
А потом кто-нибудь будет писать отчёт и для _каждого_ документа будет вызывать вашу функцию...
|
Зверский случай описан
Вообще, поддерживаю, и считаю, что динамика - зло! |
|
 |
|