Oracle проверить запрос, не выполняя его

6yrop

Есть запрос (insert/update/delete) с bind variables. Как проверить его, не выполняя? Желательно привести полный код вызова из Java/.Net/Pythin/PHP.
В postgresql это делается через EXPLAIN. Использовать для Oracle EXPLAIN PLAN FOR у меня не получилось, ругается на bind variables.

Gasparfx

мб просто добавить в where 1=2 и всётаки выполнить?

luna89

Разве просто отпрепарить недостаточно? В джаве это java.sql.Connection#prepareStatement

katrin2201

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

6yrop

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

6yrop

а куда вставлять?

6yrop

может хранимку создавать и удалять?

luna89

Большинство реализаций драйверов забивают на препейр, и отдают строку уже когда ты экзекьютишь, полагаясь на кэш планов в бд.
И что, можно отпрепарить невалидный sql?

katrin2201

Вариант. Только афаир медленный.
А че, сделать explain с забинденными переменными не?

katrin2201

Вроде да.

6yrop

А че, сделать explain с забинденными переменными не?
Как? Напиши код, плиз.

katrin2201

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

6yrop

Что-то я подумал, без знания типа каждого вопросика тяжело будет.
Тип каждого вопросика известен.
Я в оракле нуб, поэтому могу тупить.

katrin2201

Тогда просто текстуально (регэкспом например) заменить каждый вопросик любым значением в соответствии с его типом и результат уже в эксплейн?
Я с ораклом последний раз тоже давно имел дело, так что... :)

freezer

А зачем это могло понадобиться?

Maurog

ты уже пробовал prepared statement? на практике пробовал?
код из гугла: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared....

mbolik1

Использовать для Oracle EXPLAIN PLAN FOR у меня не получилось, ругается на bind variables.
Попробуй выполнять
 begin execute immediate 'explain plan for <query>'; end; 

kokoc88

Попробуй выполнять
Все понимают, что они сейчас совместными форумными усилиями портируют КоКу под Oracle?

Gasparfx

а куда вставлять?
в конце запроса, если есть условие where то добавить 'and 1=2', если нет, то 'where 1=2'
если есть GROUP BY и ORDER BY то перед ними
хотя в случае наличия вложенных подзапросов такой вариант не прокатит...

freezer

ну какой where для insert?

6yrop

ты уже пробовал prepared statement? на практике пробовал?
код из гугла: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared....
из .Net не сработало, из Java пока не пробовал (Java не установлена)

6yrop

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

freezer

объяснение не очень понятное =(
Что мешает сделать клон базы и на нём проверять? Или в рамках транзакции, которую сразу откатывать?

6yrop

Что мешает сделать клон базы и на нём проверять? Или в рамках транзакции, которую сразу откатывать?
Тот же insert потребует предоставить not null значения, а хочется просто проверить запрос. Другие констренты на данных тоже дадут ложные срабатывания.

6yrop

объяснение не очень понятное =(
а что не понятно? SQL статически типизированный язык, вот и хочется статической проверки ошибок. Хорошо же, когда при создании хранимок делается проверка. Так и тут хочется того же. Тулза находит все варианты для динамических запросов. Остается либо создать из них хранимки, либо прочекать еще как-то.

psm-home

Может быть DBMS_SQL.PARSE поможет?
Да, это только для DML, с DDL там будет грустно. Но тебе вроде и не надо.

freezer

а что не понятно? SQL статически типизированный язык, вот и хочется статической проверки ошибок.
мне вся задача не понятна =) Хочется автоматически верифицировать все SQL-запросы в коде?

6yrop

Хочется автоматически верифицировать все SQL-запросы в коде?
да

Andbar

ну какой where для insert?
в большинстве кода под Oracle, с которым мне приходилось работать, преимущественно используется конструкция insert into xxx(...) select ...

Andbar

в конце запроса, если есть условие where то добавить 'and 1=2', если нет, то 'where 1=2'
если есть GROUP BY и ORDER BY то перед ними
Такая практика будет в два раза быстрее забивать кеш запросов на сервере. Впрочем, для несильно нагруженных проектов прокатит.

psm-home

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

Teteshnik

все верно.
потом селект из табцицы куда пишется explain
http://dba.stackexchange.com/questions/18639/how-do-you-get-...
Оставить комментарий
Имя или ник:
Комментарий: