Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сформировать красиво запрос. / 11 сообщений из 11, страница 1 из 1
07.09.2017, 15:28
    #39517460
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
Привет всем.

Есть такая задача:
Процедура, на вход которой подается набор параметров, должна возвращать результат запроса. Передаваемые параметры по сути это условия для where. Т.е. нужно динамически сформировать запрос, который будет использовать передаваемые параметры (параметры либо имеют значения либо пустые) как бинд переменные.
Такие варианты как конкатенация и использование case с кучей вариантов запроса не желательна. Может есть средства oracle реализующие такое формирование запроса?
...
Рейтинг: 0 / 0
07.09.2017, 15:34
    #39517473
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
orcl_1989,

p_id - входящий параметр.
Код: plsql
1.
Where (id = p_id or p_id is null)



Динамические запросы в неумелых руках потенциальный sql injection
...
Рейтинг: 0 / 0
07.09.2017, 15:40
    #39517479
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
p_id - входящий параметр.
Where (id = p_id or p_id is null)

Если параметр null, то в условии where его вообще не должно быть.
...
Рейтинг: 0 / 0
07.09.2017, 15:48
    #39517498
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
orcl_1989,

если Вы правильно прочтете написанное выше, то скобка всегда выдаст True если p_id is null - и как следствие выражение в скобках не будет влиять на запрос (как будто ее и нет вовсе)
...
Рейтинг: 0 / 0
07.09.2017, 15:58
    #39517508
Vint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
MaximaXXL,
представь что параметров десяток. и представь как будут использоваться индексы при таком написании?

orcl_1989
pipelined функции в которых динамически строится и выполняется запрос, если я правильно понял набор столбцов не меняется. поэтому pipe пройдет без проблем.
второй вариант ref cursorы возвращаемые клиенту.
...
Рейтинг: 0 / 0
07.09.2017, 16:30
    #39517548
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
при использовании Where (id = p_id or p_id is null)

запрос выполняется дольше на порядок, по с равнению с запросом где условия указаны жестко.
...
Рейтинг: 0 / 0
07.09.2017, 16:32
    #39517550
п_ид ор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
MaximaXXLp_id - входящий параметр.
Код: plsql
1.
Where (id = p_id or p_id is null)

поосторожнее с идентификаторами и предикатами.
...
Рейтинг: 0 / 0
07.09.2017, 16:53
    #39517579
Takurava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
orcl_1989, в общем случае можно написать для правильного использования индексов
Код: plsql
1.
2.
3.
select * from table where p1_val = p1 and p1 is not null
union all
select * from table where p2_val = p2 and p2 is not null


а в данном случае задача вменяемого решения не имеет.
...
Рейтинг: 0 / 0
07.09.2017, 17:01
    #39517589
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
Была такая идея, но отказались.
Почитаю про pipelined функции, может так получится.
...
Рейтинг: 0 / 0
07.09.2017, 18:59
    #39517691
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
orcl_1989при использовании Where (id = p_id or p_id is null)

запрос выполняется дольше на порядок, по с равнению с запросом где условия указаны жестко.

т.к. задача поставленна про сфирического коня в вакууме, попробуйте так
Код: plsql
1.
Where id = nvl(p_id,id)
...
Рейтинг: 0 / 0
08.09.2017, 00:55
    #39517856
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сформировать красиво запрос.
orcl_1989Привет всем.

Есть такая задача:
Процедура, на вход которой подается набор параметров, должна возвращать результат запроса. Передаваемые параметры по сути это условия для where. Т.е. нужно динамически сформировать запрос, который будет использовать передаваемые параметры (параметры либо имеют значения либо пустые) как бинд переменные.
Такие варианты как конкатенация и использование case с кучей вариантов запроса не желательна. Может есть средства oracle реализующие такое формирование запроса?
соберите WHERE где-то снаружи, где пустые параметры в массив не попадают
и передайте сразу WHERE
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как сформировать красиво запрос. / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]