Как получить ошибки ограничения из OCIErrorGet? - PullRequest
4 голосов
/ 03 декабря 2011

Наша программа на C ++ использует Oracle и OCI для работы с базами данных.Иногда пользователь вызывает нарушение ограничения, которое мы обнаруживаем, а затем показывает сообщение об ошибке от OCIErrorGet.OCIErrorGet возвращает такие строки:

ORA-02292: integrity constraint (MYSCHEMA.CC_MYCONSTRAINT) violated - child record found
ORA-06512: at line 5

Я ищу самый чистый способ извлечь "MYSCHEMA.CC_MYCONSTRAINT" из ошибки Oracle.Зная имя ограничения, я мог бы показать лучшее сообщение об ошибке (наш код мог бы найти очень значимое сообщение об ошибке, если бы у него был доступ к имени ограничения).

Я мог бы использовать регулярное выражение или что-то подобное и предположить,что сообщение Oracle никогда не изменится, но это кажется мне немного хрупким.Или я мог бы найти конкретные коды ORA и затем взять любой текст, попадающий в скобки.Но я надеялся, что у OCI есть более чистый / более надежный способ, если ограничение не удается, определить фактическое имя неудавшегося ограничения, не прибегая к жестко закодированным манипуляциям со строками.

Есть идеи?

1 Ответ

3 голосов
/ 06 декабря 2011

Согласно Oracle Docs , поиск строки - это именно то, что вам нужно сделать:

Распознавание переменного текста в сообщениях

Чтобы помочь вам найти и исправить ошибки, Oracle встраивает имена объектов, номера, и символьные строки в некоторых сообщениях. Эти встроенные переменные представлены строкой, числом или символом, в зависимости от ситуации. За Пример:

ORA-00020: maximum number of processes (number) exceeded

Предыдущее сообщение может выглядеть следующим образом:

ORA-00020: maximum number of processes (50) exceeded

В своих документах Oracle подчеркивает, что строки будут обновляться в разделе «Точность сообщений». Это довольно убедительное предположение, что они намерены выполнить поиск строк.

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

array(4) {
   ["code"]=>int(942)
   ["message"]=>string(40) "ORA-00942: table or view does not  exist"
   ["offset"]=>int(14)
   ["sqltext"]=>string(32) "select * from non_existing_table" 
}

Этот вывод показывает следующую информацию:

  • Переменная $ erris массив с четырьмя элементами.

  • Первый элемент доступен по ключу «код», а его значение - номер 942.

  • Второе значение доступно с помощью клавиши «message», а значением является строка «ORA-00942: таблица или представление не существует».

  • Третье значение доступно с помощью клавиши «смещение», а его значением является число 14. Это символ перед именем
    несуществующая таблица.

  • Четвертый член - это проблемное сообщение SQL, которое в первую очередь вызывает ошибку.

Я согласен с вами; было бы замечательно, если бы был лучший способ получить имя ограничения, которое вы нарушаете, но согласование строк, кажется, является намеченным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...