CftClub.ru
Клуб специалистов ЦФТ-Банк

Подставить вместо условия запроса значение переменной

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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? Это вы сейчас думаете - да пофик, что система две десятых секунды над запросом думает, компилирует.
А потом кто-нибудь будет писать отчёт и для _каждого_ документа будет вызывать вашу функцию...

Зверский случай описан Smile
Вообще, поддерживаю, и считаю, что динамика - зло!
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru