Фактический оператор SQL после указанных переменных связывания

StackOverflow https://stackoverflow.com/questions/4693926

  •  11-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь регистрировать каждый оператор SQL, выполненный из моих сценариев. Однако я обдумываю одну проблему, которую я не могу преодолеть.

Есть ли способ вычисления фактического оператора SQL после указания переменных связывания. В SQLite мне пришлось вычислить оператор для выполнения вручную, используя код ниже:

def __sql_to_str__(self, value,args):
    for p in args:
        if type(p) is IntType or p is None:
            value = value.replace("?", str(p) ,1)
        else:
            value = value.replace("?",'\'' + p + '\'',1)
    return value

Кажется, у CX_ORACL cursor.parse () удобства. Но я не могу понять, как обмануть cx_oracle, чтобы вычислить мой запрос до его выполнения.

Это было полезно?

Решение

Запрос есть никогда вычисляется как одна строка. Фактический текст запроса и параметров никогда Интерполирован и не Создайте настоящую полную строку с обоими.

В этом весь смысл использования параметризованных запросов - вы отделяете запрос от данных - предотвращение инъекций и ограничений SQL за один раз, и позволяя легкой оптимизации запросов. База данных становится отдельно и делает то, что ей нужно, не объединяя их вместе.

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

Другие советы

Лучше всего сделать это на сервере базы данных, поскольку правильно реализованный разъем Oracle не помещает переменные Bind в строку перед отправкой запроса на сервер. Посмотрите, сможете ли вы найти настройку сервера Oracle, которая заставляет его регистрировать запросы, которые он выполняет.

Вы можете рассмотреть возможность использования расширенной функции SQL Trace Oracle. Я бы порекомендовал начать здесь: http://carymillsap.blogspot.com/2011/01/new-paper-mastering-performance-with.html.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top