динамическая передача имени таблицы и столбца с помощью переменных связывания - PullRequest
3 голосов
/ 15 марта 2012

Есть ли способ динамически передавать имена столбцов и таблиц в запрос, используя переменные связывания? Это может быть сделано с помощью простого оператора конкатенации ||, но я бы хотел другой подход, с помощью которого это может быть достигнуто.

РЕДАКТИРОВАТЬ

OPEN abc_cur FOR 'Select :column_name
                  from :table_name' 
                USING column_name,table_name;

В этом примере я передаю column_name как empno,ename и table_name как emp

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

Ответы [ 2 ]

14 голосов
/ 15 марта 2012

Имена таблиц и столбцов нельзя передавать как переменные связывания, нет.Весь смысл переменных связывания заключается в том, что Oracle может сгенерировать план запроса один раз для оператора, а затем выполнить его много раз с различными значениями переменных связывания.Если оптимизатор не знает, к какой таблице осуществляется доступ или какие столбцы выбираются и фильтруются, он не может сгенерировать план запроса.

Если ваша проблема связана с атаками с использованием SQL-инъекций и с учетом того,SQL на самом деле необходим (в большинстве случаев необходимость прибегать к динамическому SQL подразумевает проблемы с моделью данных), вы можете использовать DBMS_ASSERT пакет , чтобы проверить, что имена таблиц и столбцов не имеютt содержит встроенный SQL.

4 голосов
/ 15 марта 2012

Нет, вы не можете.Изменение имен таблиц или столбцов в запросе изменяет семантику этого запроса, т. Е. Он становится другим запросом.

Переменные привязки предназначены для передачи различных значений такой же запрос.Оптимизатор может повторно использовать запрос с разными значениями без необходимости повторного его анализа и оптимизации.

...