2012-05-04 2 views
3

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

Один из способов сделать это - сохранить переменную, содержащую SQL-запрос в виде строки, а затем обернуть каждый запрос в блоке PL/SQL обработчиком исключений и, если возникнет исключение, вернуть строку запроса с помощью статус отказа для компонента пользовательского интерфейса.

Есть ли лучший способ сделать это? Объект исключений Oracle или любой другой пакет поддерживают эту функцию?

Этот вопрос кажется дубликатом для резьбы: Obtain the Query/CommandText that caused a SQLException

Однако я не нашел решение проблемы в этой теме, и я хотел бы знать, если есть какие-либо новые пакеты, поддерживаемые Oracle, которые дает нам строку запроса, вызвавшую возникновение исключения.

+1

http://stackoverflow.com/a/493590/409172 может быть полезно. Хотя, если вы вызываете процедуру, которая запускает SQL, она может регистрировать этот вызов процедуры вместо SQL, который действительно вызвал сбой. –

+0

Вы хотите сделать это _outside_ блоком PL/SQL или внешним блоком справа? т. е. если вы запустили 'select * from duala;' в SQL * Plus, он будет где-нибудь зарегистрирован? – Ben

+0

@jonearles, я прочитаю его и дам вам знать, если он работает, спасибо! – Shankar

ответ

1

Когда вы вызываете базу данных с внешнего языка (Java, C#), вы, вероятно, можете это сделать, внедряя свой собственный драйвер JDBC (или что-то еще).

Вы сделали бы это, делегируя реальный мир нормальному драйверу, но всякий раз, когда оператор отправляется в базу данных, вы помните инструкцию, а если вызывает исключение, вы создаете новое исключение, которое также включает оператор sql (и, возможно, связывать переменные).

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

+0

Да, я пытаюсь вызвать хранимую процедуру. Итак, я не знаю, как получить сбойный запрос – Shankar

Смежные вопросы