Oracle проверить запрос, не выполняя его
мб просто добавить в where 1=2 и всётаки выполнить?
Разве просто отпрепарить недостаточно? В джаве это java.sql.Connection#prepareStatement
Большинство реализаций драйверов забивают на препейр, и отдают строку уже когда ты экзекьютишь, полагаясь на кэш планов в бд.
Большинство реализаций драйверов забивают на препейр, и отдают строку уже когда ты экзекьютишь, полагаясь на кэш планов в бд.они не совсем забивают, они откладывают ее до первого выполнения
а куда вставлять?
может хранимку создавать и удалять?
Большинство реализаций драйверов забивают на препейр, и отдают строку уже когда ты экзекьютишь, полагаясь на кэш планов в бд.И что, можно отпрепарить невалидный sql?
Вариант. Только афаир медленный.
А че, сделать explain с забинденными переменными не?
А че, сделать explain с забинденными переменными не?
Вроде да.
А че, сделать explain с забинденными переменными не?Как? Напиши код, плиз.
Что-то я подумал, без знания типа каждого вопросика тяжело будет.
Может выполнять запросы на пустой схеме-песочнице?
Может выполнять запросы на пустой схеме-песочнице?
Что-то я подумал, без знания типа каждого вопросика тяжело будет.Тип каждого вопросика известен.
Я в оракле нуб, поэтому могу тупить.
Тогда просто текстуально (регэкспом например) заменить каждый вопросик любым значением в соответствии с его типом и результат уже в эксплейн?
Я с ораклом последний раз тоже давно имел дело, так что...
Я с ораклом последний раз тоже давно имел дело, так что...

А зачем это могло понадобиться?
ты уже пробовал prepared statement? на практике пробовал?
код из гугла: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared....
код из гугла: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared....
Использовать для Oracle EXPLAIN PLAN FOR у меня не получилось, ругается на bind variables.Попробуй выполнять
begin execute immediate 'explain plan for <query>'; end;
Попробуй выполнятьВсе понимают, что они сейчас совместными форумными усилиями портируют КоКу под Oracle?

а куда вставлять?в конце запроса, если есть условие where то добавить 'and 1=2', если нет, то 'where 1=2'
если есть GROUP BY и ORDER BY то перед ними
хотя в случае наличия вложенных подзапросов такой вариант не прокатит...
ну какой where для insert?
ты уже пробовал prepared statement? на практике пробовал?из .Net не сработало, из Java пока не пробовал (Java не установлена)
код из гугла: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared....
А зачем это могло понадобиться?есть тулза, которая находит все динамические запросы, хочется их проверять на валидность. Например, это дает возможность поменять что-нибудь в базе и посмотреть, что в приложении на это завязано.
объяснение не очень понятное =(
Что мешает сделать клон базы и на нём проверять? Или в рамках транзакции, которую сразу откатывать?
Что мешает сделать клон базы и на нём проверять? Или в рамках транзакции, которую сразу откатывать?
Что мешает сделать клон базы и на нём проверять? Или в рамках транзакции, которую сразу откатывать?Тот же insert потребует предоставить not null значения, а хочется просто проверить запрос. Другие констренты на данных тоже дадут ложные срабатывания.
объяснение не очень понятное =(а что не понятно? SQL статически типизированный язык, вот и хочется статической проверки ошибок. Хорошо же, когда при создании хранимок делается проверка. Так и тут хочется того же. Тулза находит все варианты для динамических запросов. Остается либо создать из них хранимки, либо прочекать еще как-то.
Может быть DBMS_SQL.PARSE поможет?
Да, это только для DML, с DDL там будет грустно. Но тебе вроде и не надо.
Да, это только для DML, с DDL там будет грустно. Но тебе вроде и не надо.
а что не понятно? SQL статически типизированный язык, вот и хочется статической проверки ошибок.мне вся задача не понятна =) Хочется автоматически верифицировать все SQL-запросы в коде?
Хочется автоматически верифицировать все SQL-запросы в коде?да
ну какой where для insert?в большинстве кода под Oracle, с которым мне приходилось работать, преимущественно используется конструкция insert into xxx(...) select ...
в конце запроса, если есть условие where то добавить 'and 1=2', если нет, то 'where 1=2'Такая практика будет в два раза быстрее забивать кеш запросов на сервере. Впрочем, для несильно нагруженных проектов прокатит.
если есть GROUP BY и ORDER BY то перед ними
Такая практика будет в два раза быстрее забивать кеш запросов на сервере.Топикстартер делает инструментальное средство, т.е это будет не прод и на кеш планов всем пофиг.
все верно.
потом селект из табцицы куда пишется explain
http://dba.stackexchange.com/questions/18639/how-do-you-get-...
потом селект из табцицы куда пишется explain
http://dba.stackexchange.com/questions/18639/how-do-you-get-...
Оставить комментарий
6yrop
Есть запрос (insert/update/delete) с bind variables. Как проверить его, не выполняя? Желательно привести полный код вызова из Java/.Net/Pythin/PHP.В postgresql это делается через EXPLAIN. Использовать для Oracle EXPLAIN PLAN FOR у меня не получилось, ругается на bind variables.