Oracle: Как я могу параметризовать список? - PullRequest
3 голосов
/ 17 февраля 2010

У меня есть запрос с предложением where, которое выглядит так:

WHERE field IN ( 1, 2, 3 )

Возможно параметризовать это так, чтобы это выглядело примерно так:

ГДЕ поле в (: список)?

Как создать параметр: list, предполагая, что это список целых чисел, который может быть в диапазоне от 1 до 10?

ASP.net, веб-формы, если это имеет значение.

Ответы [ 4 ]

2 голосов
/ 18 февраля 2010

Существует два способа размещения списков динамического ввода:

  1. Преобразование списка через запятую в производную таблицу (встроенное представление AKA)
  2. Использовать динамический SQL

Non-Dynamic


Большинство предпочитает нединамический подход SQL - эта ссылка предоставляет различные способы сделать это . Самая большая причина использовать это снова:

WHERE :list LIKE '%,' || t.column || ',%'

... что выше:

  1. Никогда не сможет использовать индекс
  2. Не удастся сопоставить первый или последний параметр в списке, потому что для совпадения необходимы запятые на обоих концах

Простой факт: он не будет работать так, как задумано. Регулярное выражение, поддерживаемое в Oracle 10g +, допускает условную проверку столбца, но все еще сталкивается с проблемой отображения индекса как moot

Динамический SQL


Упомяните "динамический SQL", и вы, вероятно, будете преследованы по поводу атак с использованием SQL-инъекций . Использование переменной связывания устраняет проблему.

При этом динамический SQL требует наименьшего изменения запроса.

0 голосов
/ 18 февраля 2010

Этот вопрос «как связать список», похоже, часто возникает.

Самый простой способ сделать это в Oracle - использовать ответ, который я разместил здесь:

Динамический запрос с HibernateCritera API & Oracle - производительность

Я не могу притвориться, что это мой трюк, поскольку он пришел из блога Тома Кайта, гуру Oracle!

0 голосов
/ 17 февраля 2010

Насколько я знаю, вы не можете. Вы бы смешивали значения и операторы в одном месте.

Однако должно быть довольно просто автоматически создать массив параметров в ASP.NET и получить его динамически:

WHERE field IN (:list1, :list2, :list3, :list4)
0 голосов
/ 17 февраля 2010

Тот же ответ, что и для SQL Server, уже задаваемый здесь: Параметризация предложения SQL IN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...