Ошибка при обработке операции oracle
This chapter explains how to handle PL/SQL compile-time warnings and PL/SQL runtime errors. The latter are called exceptions .
The language of warning and error messages depends on the NLS_LANGUAGE parameter. For information about this parameter, see Oracle Database Globalization Support Guide .
If you have problems creating or running PL/SQL code, check the Oracle Database trace files. The USER_DUMP_DEST initialization parameter specifies the current location of the trace files. You can find the value of this parameter by issuing SHOW PARAMETER USER_DUMP_DEST . For more information about trace files, see Oracle Database Performance Tuning Guide .
Internally Defined Exceptions
Internally defined exceptions (ORA- n errors) are described in Oracle Database Error Messages . The runtime system raises them implicitly (automatically).
An internally defined exception does not have a name unless either PL/SQL gives it one (see "Predefined Exceptions") or you give it one.
If you know that your database operations might raise specific internally defined exceptions that do not have names, then give them names so that you can write exception handlers specifically for them. Otherwise, you can handle them only with OTHERS exception handlers.
To give a name to an internally defined exception, do the following in the declarative part of the appropriate anonymous block, subprogram, or package. (To determine the appropriate block, see "Exception Propagation".)
Declare the name.
An exception name declaration has this syntax:
For semantic information, see "Exception Declaration".
Associate the name with the error code of the internally defined exception.
For semantic information, see "EXCEPTION_INIT Pragma".
An internally defined exception with a user-declared name is still an internally defined exception, not a user-defined exception.
Example 11-5 gives the name deadlock_detected to the internally defined exception ORA-00060 (deadlock detected while waiting for resource) and uses the name in an exception handler.
Example 11-5 Naming Internally Defined Exception
Advantages of Exception Handlers
Using exception handlers for error-handling makes programs easier to write and understand, and reduces the likelihood of unhandled exceptions.
Without exception handlers, you must check for every possible error, everywhere that it might occur, and then handle it. It is easy to overlook a possible error or a place where it might occur, especially if the error is not immediately detectable (for example, bad data might be undetectable until you use it in a calculation). Error-handling code is scattered throughout the program.
With exception handlers, you need not know every possible error or everywhere that it might occur. You need only include an exception-handling part in each block where errors might occur. In the exception-handling part, you can include exception handlers for both specific and unknown errors. If an error occurs anywhere in the block (including inside a sub-block), then an exception handler handles it. Error-handling code is isolated in the exception-handling parts of the blocks.
In Example 11-3, a procedure uses a single exception handler to handle the predefined exception NO_DATA_FOUND , which can occur in either of two SELECT INTO statements.
Example 11-3 Single Exception Handler for Multiple Exceptions
Invoke procedure (there is a DEPARTMENTS table, but it does not have a LAST_NAME column):
Invoke procedure (there is no EMP table):
If multiple statements use the same exception handler, and you want to know which statement failed, you can use locator variables, as in Example 11-4.
Example 11-4 Locator Variables for Statements that Share Exception Handler
You determine the precision of your error-handling code. You can have a single exception handler for all division-by-zero errors, bad array indexes, and so on. You can also check for errors in a single statement by putting that statement inside a block with its own exception handler.
Compile-Time Warnings
While compiling stored PL/SQL units, the PL/SQL compiler generates warnings for conditions that are not serious enough to cause errors and prevent compilation—for example, using a deprecated PL/SQL feature.
To see warnings (and errors) generated during compilation, either query the static data dictionary view *_ERRORS (described in Oracle Database Reference ) or, in the SQL*Plus environment, use the command SHOW ERRORS .
The message code of a PL/SQL warning has the form PLW- nnnnn . For the message codes of all PL/SQL warnings, see Oracle Database Error Messages .
Table 11-1 summarizes the categories of warnings.
Table 11-1 Compile-Time Warning Categories
Condition might cause unexpected action or wrong results.
Aliasing problems with parameters
Condition might cause performance problems.
Passing a VARCHAR2 value to a NUMBER column in an INSERT statement
Condition does not affect performance or correctness, but you might want to change it to make the code more maintainable.
Code that can never run
By setting the compilation parameter PLSQL_WARNINGS , you can:
Enable and disable all warnings, one or more categories of warnings, or specific warnings
Treat specific warnings as errors (so that those conditions must be corrected before you can compile the PL/SQL unit)
You can set the value of PLSQL_WARNINGS for:
Your Oracle database instance
Use the ALTER SYSTEM statement, described in Oracle Database SQL Language Reference .
Use the ALTER SESSION statement, described in Oracle Database SQL Language Reference .
A stored PL/SQL unit
Use an ALTER statement from "ALTER Statements" with its compiler_parameters_clause . For more information about PL/SQL units and compiler parameters, see "PL/SQL Units and Compilation Parameters".
In any of the preceding ALTER statements, you set the value of PLSQL_WARNINGS with this syntax:
For the syntax of value_clause , see Oracle Database Reference .
Example 11-1 shows several ALTER statements that set the value of PLSQL_WARNINGS .
Example 11-1 Setting Value of PLSQL_WARNINGS Compilation Parameter
For the session, enable all warnings—highly recommended during development:
For the session, enable PERFORMANCE warnings:
For the procedure loc_var , enable PERFORMANCE warnings, and reuse settings:
For the session, enable SEVERE warnings, disable PERFORMANCE warnings, and treat PLW-06002 warnings as errors:
For the session, disable all warnings:
To display the current value of PLSQL_WARNINGS , query the static data dictionary view ALL_PLSQL_OBJECT_SETTINGS , described in Oracle Database Reference .
3. Что же делать в случае незалоггированных ошибок
Естественно, может случиться так, что существующая система логгирования не регистрирует какие-то неординарные ошибки, или даже ее совсем нет в базе. Тут могут быть полезны триггеры ` after servererror on database/schema `. Простой минимальный пример.
К сожалению, для полноценного и срочного решения неординарных проблем, ни системы логгирования, ни таких триггеров, может быть недостаточно, и тут на помощь приходит вся мощь самой встроенной системы событий Oracle.
Например, недавно Nenad Noveljic расследовал проблему c " TNS-12599: TNS:cryptographic checksum mismatch " для чего ему нужно было получить callstack:
К счастью, помимо использованного у него в статье "ERRORSTACK", есть еще большой список "ACTIONS", включающий в себя и "CALLSTACK":
В этой команде 12599 - это номер события(event), callstack - инструктирует сделать дамп call стека, level 2 - указывает вывести еще и аргументы функций, lifetime 1 - только один раз.
Более подробно об этом у Tanel Poder с примерами:
Мало того, как сам Танел и посоветовал, можно еще воспользоваться и "trace()" для форматированного вывода shortstack():
Так что этим же мы можем воспользоваться этим для вывода callstack:
Или в более новом формате:
Как вы видите, здесь я еще добавил фильтр на количество срабатываний: после первого выполнения и только 1 раз.
Покажу на примере "ORA-01476: divisor is equal to zero":
Здесь kg_event - это Kernel Generic event, 1476 - ORA-1476. После этого запускаем в своей сессии:
И в трейсфайле получаем:
Или, например, недавно я посоветовал использовать alter system set events 'trace[sql_mon.*] [SQL: . ] disk=high,memory=high,get_time=highres'; для выяснения причин, почему конкретный запрос не мониторится/сохраняется real-time SQL монитором (RTSM - Real Time SQL Monitor).
Получилось несколько сумбурно, в связи с недостатком времени, но на этом, пожалуй, закончу. Будут рад вопросам - задавайте, и я постараюсь их раскрыть отдельно.
Инструкция нужная, спасибо. Как альтернатива - ZeroTier на каждую виртуалку Oracle - тоже достаточно быстро и гибко.
А мне так и не удалось зарегиться на Oracle Cloud Free. Вроде и карту признали, и транзакция прошла, но результат нулевой:(
Аналогично, успешно подтверждаю платеж по карте, ставлю галку Соглашение, нажимаю кнопку "Начать бесплатное пробное использование", и выдает ошибку:
Не удалось завершить регистрацию. Распространенные ошибки при регистрации: (а) Использование предоплаченных карт. Oracle принимает только кредитные и дебетовые карты. (б) Преднамеренное или непреднамеренное маскирование местоположения или идентификационных данных. (в) Ввод неполных или неточных данных счета. Если вы допустили одну их вышеперечисленных ошибок, повторите попытку. В противном случае обратитесь в службу поддержки клиентов Oracle.
Карты пробовал разных банков, данные указывал реальные, пробовал заходить и через vpn и напрямую. Одна и та же ошибка. В поддержку писать бесполезно, она не отвечает.
Только что регистрировался, с первой попытки была такая же штука, а вот со второй (с той же карточкой, но я вбил почтовый адрес на английском языке вместо русского) всё сработало.
Другая беда, что в выбранном мной регионе нету доступных мощностей.
Такая же ситуация.
Поддержка правда ответила — Unfortunately, we are unable to resolve this or process the transaction. This is all the information we can provide.
От бывших Я.Денег карта (пластик) прошла с первого раза, дело было летом, пару раз ещё чекнули списанием-возвратом, и с тех порт всё работает. Можно попробовать виртуальную от Ю-Мани.
у меня не вышло с Юмани, пластиком мастеркард, и с виртуальной от сбера тоже не вышло, на прошлой неделе пробовал(.
Написал в сапорт, пока ответа нет.
Такая же ситуация.Оплата тинькофф блак и сбер. В Оракле ответили следующее
For security purposes, the credit card on file was re-authorized and declined by the bank. Due to the decline, the sign up was rejected. Please reach out to your bank if you have questions about why the card was declined.
Обратился в тинькофф , после долгого и мучительного общения с тех.поддержкой тинькофф ответил следущее:
Благодарю за ожидание, к сожалению, мы не можем проверить, почему операция не прошла.
Банк, который обслуживает сайт, не отправил нам информацию о вашей попытке.
Такое часто бывает из-за неправильных настроек оплаты на сайте.
Попробуйте оплатить еще раз позже, если не получится — напишите или позвоните в поддержку сайта.
На нашей стороне ограничений нет.
Написал опять в Oracle , что банке ограничений нет и что они имеют ввиду под процессом re-authorized.
От коллег тоже слышал жалобы. Меня проблема обошла стороной, все сработало с первого раза с виртуальной картой Mastercard от Тинькофф.
А давно уже регистрировались? Виртуальные карты вроде бы живут пару месяцев от силы, а тут люди поговаривают, что Oracle раз в несколько месяцев берет 10 евро на on hold и возвращает обратно.
Или же вы имели в виду не "виртуальная", а "обычная, просто когда оформлял карту, отказался от физического носителя - пластикового прямоугольника"?
Не подскажете, что вы в полях "Billing address" указывали? И на каком языке - на русском или на английском? А то перерыл интернет, везде пишут, что в российских банках billing address не используется в принципе, а поле в форме регистрации обязательное, пустым оставить нельзя.
В приложении Тинкоффа можно дополнително выпускать и уничтожать несколько виртуальных карт и индивидуально настраивать лимиты (срок 8 лет).
Про billing address не важно насколько оно обязательно, так как эмитент всё равно (вроде бы) не предоставляет эти данные эквайеру для проверки.
Регистрировался недавно, ещё триал не закончился.
Карту выпускал в личном кабинете, как сказал @telpos их можно выпускать в любое время.
В качестве адреса всегда в таких случаях всегда пишу настоящий город, а адрес Lenina, 1, ни разу не было проблем
А как вы заполняли адрес? Там и город указывать надо и сам адрес (3 поля, одно обязательное). Наверное, если бы я жил в Москве, например, и проблем бы не возникло. А у меня Московская область, район X, пгт (или деревня, не суть) Y, улица, дом. Что здесь город? Москва? X или Y?
Мои данные не проходят, как не пробовал. Не подскажете?
Латиницей заполняли? Если нет, попробуйте латиницей.
Пробовал. То же самое.
С моей стороны ошибка, но не пойму где.
Может есть в сети какие-то форумы где это обсуждается? Я не могу даже предположить причину. Первая попытка - пытался использовать карту Qiwi, она оказалась предоплаченная. Затем взял дебетовую карту ВТБ, с ней все вроде как прошло и карту приняли, но дальше что-то пошло не так.
UPD: вот сейчас решил повторить, чтобы подробнее написать сюда - и всё получилось! Единственная разница - вводил адрес в американском формате. Т.е. APT
А в самом первом пункте вы территорию "Россия" укзывали?
Да, конечно. А в качестве "домашнего региона" (это, как я понимаю, где физически будет сервер) указал Амстердам.
Все же вопрос про форумы остается актуальным, т.к. опыта работы с такими виртуалками у меня нет.
Короче, сейчас тоже указал адрес в американском формате, и все получилось. До этого месяц не получалось пройти процедуру регистрации.
Попробовал - не получилось.
Не удалось завершить регистрацию. Распространенные ошибки при регистрации: (а) Использование предоплаченных карт. Oracle принимает только кредитные и дебетовые карты. (б) Преднамеренное или непреднамеренное маскирование местоположения или идентификационных данных. (в) Ввод неполных или неточных данных счета. Если вы допустили одну их вышеперечисленных ошибок, повторите попытку. В противном случае обратитесь в службу поддержки клиентов Oracle.
Дебетовая карта Tinkoff Black.
Пытался регаться с картами типа qiwi и яндекса - не давала, прокатила только карта сбера. После того как проверило карту (не помню сколько списывало/возвращало - какую то мелочь) что-то написало, не дословно, но где-то "проверятся/ожидается". Так висело около недели.. уже думал плюнуть и забить. Потом неожидано прилетает списание 11 долларов (или евро) и сразу возврат. После этого пустило в аккаунт и с теп пор все ок.
Раньше они (не Оракл имею виду) списывали мелкие суммы. Теперь по тысяче рублей за раз.
Уже год с лишним использую, на карточке всегда ноль (т.к. это карточка для покупок в тех местах, где не принимают «Мир» и на ней я деньги не храню), никаких проблем.
Первые пару недель регулярно списывали и зачисляли обратно 5 евро. Сейчас успокоились, но все же держу на ней остаток
Спасибо! Обязательно попробую. Это будет удобней, т.к. сейчас приходится для каждой подсети микротика добавлять по правилу.
я задаюсь вопросом: а зачем я до сих пор плачу за VPS и держу собственный серверок в подвале?!
Хочется переложить все домашние сервисы на датацентры oracle
Хороший способ в один прекрасный момент оказаться с инфраструктурой, пусть и не такой большой, потерянной или нуждающейся в приличной оплате где-то во блаках)
Такие бесплатные ресурсы хороши для совершенно незначимых вещей, экспериментов. Перенастроить которые не должно занимать много времени. Ну VPN там поднять для линых нужд, постоянно держа в голове, в любую секунду оно может отвалиться и надо будет что-то с этим делать.
Но переносить всю личную инфру на халяву как-то стремнова-то) У меня вот не один день уйдёт на переподнятие всего, если эти облака "растворятся в воздухе".
Ну и есть ещй такой немаловажный аспект, ИМХО. Как только все налягут на халяву, гоняя её и в хвост и в гриву, есть большая вероятность, что производитель прикроет эту самую халяву.
I have already configured many accounts to use Oracle Cloud. Especially, since December 2020 I started to face some problems on the step where you must provide a credit card to simulate a payment but in fact, it works like a personal identification. So I have used the same card that I used previously in some setups, two other new cards and even asked some friends in different countries using their own cards and some of them have experienced the same erros while others could create their account successfully.
Follow below the mentioned error:
So I decided to contact Oracle support and they have given me an ordinary answer:
Afterwards I decided to Tweet about it so I could get some help and suggestions from the Oracle community to understand what is going on hence some friends of mine had the same issue with their own cards and then I realised that not everyone was having the same issues despite that some people I contacted before was also having the same error:
I fixed my problem but I still was not satisfied with the way it was fixed. I might do some tests afterwards with different accounts to see if the error persists while you are using an e-mail with certain key words as “Oracle” and “Cloud” or to check if there are other unknown issues . If you have been facing the same issue or have already fixed this before, leave the solution or your thoughts on the comment section below. I faced this error in December 2020 , Dietrich in his post is dated as September 2019 and both cases there weren’t credit card issues but e-mail instead so it would be interesting to know the real issue.
Hi! I am Bruno, a Brazilian born and bred. Awarded Oracle ACE from Oracle since 2017, Computer Scientist, Msc candidate of two universities in Sweden and over ten years of experience in companies as IBM, Epico Tech, and Playtech based in three different countries (Brazil, Hungary, and Sweden) and joined projects remotely in many others. I am super excited to show you my interest in Databases, Cloud, Data Science, Data Engineering, Bigdata, AI, Programming, Software Engineering, technology in general.
(Continue reading)
Компания Oracle в рамках своего облачного сервиса предоставляет на условиях "бесплатно навсегда" ряд услуг, а именно:
2 базы данных Oracle Autonomous Database, каждая с 1 OCPU (Oracle Cloud Processor Unit) и 20 ГБ хранилища;
2 виртуальные машины (VPS) Compute VM, каждой выделено с 1/8 OCPU и 1 Гбайт оперативной памяти;
2 блочных тома общей ёмкостью до 100 Гбайт, до 5 бесплатных резервных копий.
А также ряд дополнительных сервисов, таких как:
10 Гбайт объектного облачного хранилища;
10 Гбайт архивного хранилища;
50 000 запросов API в месяц;
1 балансировщик нагрузки с пропускной способностью 10 Мбит/с;
10 Тбайт/месяц на передачу исходящих данных. (Возможно ошибка, 10Гбайт)
Для получения следует просто зарегистрировать учетную запись в облачном сервисе Oracle по адресу:
Пригодится ли это в быту самогонщика? Например для доступа к домашней сети, если провайдер предлагает только серый ip?
Я не знаю пока зачем, но на всякий случай зарегистрировался
cxx Магистр Домодедово 258 145
Mihalich Доцент Михайловские мы! 1.8K 678
Хотел сохранить хоть какую-то анонимность, типа я сам из Африки, но не прокатило .
Видимо сопоставляют номер телефона, карту и адрес.
Указал все данные верно (Россия), опять не прокатило. Ошибка при обработке операции. Карта чего-то ей не нравится. Причем списание происходит, а потом "отмена покупки" и всё.
Посл. ред. 22 Янв. 21, 09:04 от Mihalich
Да, там походу вручную обрабатывают. Я использовал именную КРЕДИТНУЮ карту. Возможно идёт сверка адреса жительства и инфы с кары? Через трое суток одобрили. Списаний с карты небыло.
Добавлено через 4мин.:
Ну это типа твой маааленький компьютер в облаке. Можно запилить мааленький сайт, или VPN туннель, или ещё чего.
Посл. ред. 22 Янв. 21, 11:09 от Rtehnik
Newocelot Профессор Питер 8.9K 2.2K
Вчера (уже позавчера) потратил несколько часов на регистрацию.
Получил письмо, типа "спасибо за регистрацию, мы свяжемся с Вами для уточнения по е-мэйл или по телефону. "
Никто не связывался.
Аккаунт так и не создан.
Я трое суток одобрения ждал, народ пишет что и неделя может потребоваться.
При регистрации я указал реальный адрес, номер телефона и почту от mail.ru
Использовал именную КРЕДИТНУЮ (говорят это важно) карту Visa от банка ВТБ.
Регион проживания Россия, расположение центра обработки данных "US West (Phoenix)"
Минут 15 на заполнение ушло.
Посл. ред. 23 Янв. 21, 06:40 от Rtehnik
Newocelot Профессор Питер 8.9K 2.2K
Несомненно. Теперь практически везде так.
Причем ЗДЕСЬ невозможно указать разные "address" и "billing address"
Ximichestvo Доцент Ухта 1.9K 714
тих Бакалавр СПб 59 34
Судя по тексту под * бесплатный период пользования 30 дней. Оставляя данные своей карты, через 30 дней после активации вашей учётки скорее всего произойдёт попытка списания 300USD с неё.
У меня была ситуацияя с платным VPNом, когда я попользовался их услугами фиксированный период и понял, что пока хватит, наигрался и оставил процесс без внимания. И по окончанию периода, я увидел попытку списания средств с карты. Потом ещё и ещё. Сумма равнялась стоимости годового обслуживания. В личном кабинете впн-сервиса не было возможности удалить данные карты. Только с привлечением службы поддержки они вроде выпилили данные из базы (хотя и это не факт, но попытки списать средстива прекралтились . Так что будьте внимательны.
Посл. ред. 23 Янв. 21, 23:04 от тих
makh Профессор Sаmara 2.1K 1K
Оракл контора как-бы серьезная, у таких "бесплатное" монетизируется намного менее тупыми методами, чем пытаться что-то списать с карты клиента через месяц..
тих Бакалавр СПб 59 34
Монетизировать сервис через списание средств с проверенной карты пользователя (при регистрации идёт контрольное списание 1 USD с дальнейшим возвратом) через 30 дней по окончанию пробного периода - это не тупо, но просто. Пользователь сам оставил свои реквизиты и реквизиты валидной карты. 30 дней пользовался нашим сервисом бесплатно, согласившись со всеми T&Cs, а по окончанию срока не отменил продление подписки - значит тебе всё понравилось и ты со всем согласен.
". US$300 free credits available in select countries and valid for up to 30 days. Oracle Cloud credits are consumed at discounted rates during the 30-day promotional period."
У серьёзной конторы много разных бизнесов, разных направлений, за них отвечают разные манагеры, и у них разные подходы. А их руководство в итоге интересует прибыль в первую очередь, а не то, чтобы не казаться тупыми в чьих-то глазах.
Триста виртуальных баксов даётся на попробовать их уже платные услуги. Просто через месяц все подключённый сервисы требующие оплаты удаляться, соответственно вместе с данными. Никах списаний не будет без явного перехода на платный тарифный план.
Прежде чем зарегистрироваться, я перечитал кучу форумов с обсуждениями данной платформы. Отрицательных отзывов не нашёл. Ни у кого ни чего лишнего не списывали.
Для списаний требуется явный переход на платный тарифный план.
Может и алиэкспрессом и пэйпалом не пользуемся там тоже нужна привязка карты. Да уже почти везде карты используются.
Третий Академик МосОбл 6.4K 5.7K 2
На алишке привязка не обязательна. Главное, галку "запомнить" не забывать снимать при каждом платеже.
Но вообще то, любой сервис подозрителен, требующий данные карты за "бесплатные" услуги.
Вероятно данный сервис возможно использовать в противозаконных целях, поэтому нужно подтверждение личности. Оптимально это сделать с помощью карты.
Третий Академик МосОбл 6.4K 5.7K 2
Любой сервис возможно использовать в противозаконных целях, даже наш хоумдистиллер. Только следить за законностью обязана администрация ресурса, а не собирать конфиденциальные сведения.
Я не утверждаю, что сабж левая контора, повторю - подозрительная.
makh Профессор Sаmara 2.1K 1K
Ну как бы все работает, триста евро со счета списать нихто не пытался..
Oracle раздает бесплатные VPS навсегда. Остальные темы.
Инструкция по поднятию VPS-сервер в облаке Oracle (многа букаф).
Из несомненных плюсов:
Бесплатно
Вы сами решаете, до каких ресурсов трафик пустить через VPN (вы не ограничены лишь списком заблокированных в России, можете хоть на homedistiller ходить через VPN)
Если вы параноик, то вам понравится, что сервер контролируете вы
makh Профессор Sаmara 2.1K 1K
"Если вы считаете себя параноиком.." Ибо настоящему параноику VPN на виртуальном железе не понравится ни разу ,)
Все размещаемые материалы отражают исключительно мнения их авторов и могут не совпадать с мнением Администрации форума ХоумДистиллер.
© 2022 ХоумДистиллер (форум самогонщиков, пивоваров, виноделов, ректификаторов, зерновиков) & Simple Machines LLC
ПК версия
Хорошо, что ты зашел к нам, у нас много полезной информации и отличный ПОИСКОВИК в помощь!
Overview of Exception Handling
Exceptions (PL/SQL runtime errors) can arise from design faults, coding mistakes, hardware failures, and many other sources. You cannot anticipate all possible exceptions, but you can write exception handlers that let your program to continue to operate in their presence.
Any PL/SQL block can have an exception-handling part, which can have one or more exception handlers. For example, an exception-handling part could have this syntax:
In the preceding syntax example, ex_name_ n is the name of an exception and statements_ n is one or more statements. (For complete syntax and semantics, see "Exception Handler".)
When an exception is raised in the executable part of the block, the executable part stops and control transfers to the exception-handling part. If ex_name_1 was raised, then statements_1 run. If either ex_name_2 or ex_name_3 was raised, then statements_2 run. If any other exception was raised, then statements_3 run.
After an exception handler runs, control transfers to the next statement of the enclosing block. If there is no enclosing block, then:
If the exception handler is in a subprogram, then control returns to the invoker, at the statement after the invocation.
If the exception handler is in an anonymous block, then control transfers to the host environment (for example, SQL*Plus)
If an exception is raised in a block that has no exception handler for it, then the exception propagates. That is, the exception reproduces itself in successive enclosing blocks until a block has a handler for it or there is no enclosing block (for more information, see "Exception Propagation"). If there is no handler for the exception, then PL/SQL returns an unhandled exception error to the invoker or host environment, which determines the outcome (for more information, see "Unhandled Exceptions").
DBMS_WARNING Package
If you are writing PL/SQL units in a development environment that compiles them (such as SQL*Plus), you can display and set the value of PLSQL_WARNINGS by invoking subprograms in the DBMS_WARNING package.
Example 11-2 uses an ALTER SESSION statement to disable all warning messages for the session and then compiles a procedure that has unreachable code. The procedure compiles without warnings. Next, the example enables all warnings for the session by invoking DBMS_WARNING.set_warning_setting_string and displays the value of PLSQL_WARNINGS by invoking DBMS_WARNING.get_warning_setting_string . Finally, the example recompiles the procedure, and the compiler generates a warning about the unreachable code.
Unreachable code could represent a mistake or be intentionally hidden by a debug flag.
Example 11-2 Displaying and Setting PLSQL_WARNINGS with DBMS_WARNING Subprograms
Disable all warning messages for this session:
With warnings disabled, this procedure compiles with no warnings:
Enable all warning messages for this session:
Check warning setting:
DBMS_WARNING subprograms are useful when you are compiling a complex application composed of several nested SQL*Plus scripts, where different subprograms need different PLSQL_WARNINGS settings. With DBMS_WARNING subprograms, you can save the current PLSQL_WARNINGS setting, change the setting to compile a particular set of subprograms, and then restore the setting to its original value.
Oracle Database PL/SQL Packages and Types Reference for more information about the DBMS_WARNING package
Predefined Exceptions
Predefined exceptions are internally defined exceptions that have predefined names, which PL/SQL declares globally in the package STANDARD . The runtime system raises predefined exceptions implicitly (automatically). Because predefined exceptions have names, you can write exception handlers specifically for them.
Этот пост навеян статьями Часть 1. Логирование событий в Oracle PL/SQL и Часть 2. Идентификация событий происходящих в Oracle PL/SQL. В первую очередь, как специалисту по performance tuning и troubleshooting, хотелось бы прокомментировать некоторые нюансы.
1. Уровни детализации логгирования
Из самой внутренней системы ошибок Оракл можно было позаимствовать использование UTL_LMS.FORMAT_MESSAGE. Кстати, сами ошибки(и events) можно посмотреть с помощью sys.standard.sqlerrm(N):
Кроме того, я, конечно, понимаю, что не все ошибки можно предусмотреть, но все-таки считаю, что их надо добавлять в exception handler после того как они уже были отловлены. Это будет полезно как минимум при последующих изменениях логики и будет проще видеть нестандартные или непредусмотренные ранее ситуации.
Guidelines for Avoiding and Handling Exceptions
To make your programs as reliable and safe as possible:
Use both error-checking code and exception handlers.
Use error-checking code wherever bad input data can cause an error. Examples of bad input data are incorrect or null actual parameters and queries that return no rows or more rows than you expect. Test your code with different combinations of bad input data to see what potential errors arise.
Sometimes you can use error-checking code to avoid raising an exception, as in Example 11-7.
Add exception handlers wherever errors can occur.
Errors are especially likely during arithmetic calculations, string manipulation, and database operations. Errors can also arise from problems that are independent of your code—for example, disk storage or memory hardware failure—but your code still must take corrective action.
Design your programs to work when the database is not in the state you expect.
For example, a table you query might have columns added or deleted, or their types might have changed. You can avoid problems by declaring scalar variables with %TYPE qualifiers and record variables to hold query results with %ROWTYPE qualifiers.
Whenever possible, write exception handlers for named exceptions instead of using OTHERS exception handlers.
Learn the names and causes of the predefined exceptions. If you know that your database operations might raise specific internally defined exceptions that do not have names, then give them names so that you can write exception handlers specifically for them.
Have your exception handlers output debugging information.
If you store the debugging information in a separate table, do it with an autonomous routine, so that you can commit your debugging information even if you roll back the work that the main subprogram did. For information about autonomous routines, see "AUTONOMOUS_TRANSACTION Pragma".
For each exception handler, carefully decide whether to have it commit the transaction, roll it back, or let it continue.
Regardless of the severity of the error, you want to leave the database in a consistent state and avoid storing bad data.
Avoid unhandled exceptions by including an OTHERS exception handler at the top level of every PL/SQL program.
Make the last statement in the OTHERS exception handler either RAISE or an invocation of the RAISE_APPLICATION_ERROR procedure. (If you do not follow this practice, and PL/SQL warnings are enabled, then you get PLW-06009.) For information about RAISE or an invocation of the RAISE_APPLICATION_ERROR , see "Raising Exceptions Explicitly".
Exception Categories
The runtime system raises internally defined exceptions implicitly (automatically). Examples of internally defined exceptions are ORA-00060 (deadlock detected while waiting for resource) and ORA-27102 (out of memory).
An internally defined exception always has an error code, but does not have a name unless PL/SQL gives it one or you give it one.
A predefined exception is an internally defined exception that PL/SQL has given a name. For example, ORA-06500 (PL/SQL: storage error) has the predefined name STORAGE_ERROR .
You can declare your own exceptions in the declarative part of any PL/SQL anonymous block, subprogram, or package. For example, you might declare an exception named insufficient_funds to flag overdrawn bank accounts.
You must raise user-defined exceptions explicitly.
Table 11-2 summarizes the exception categories.
Table 11-2 Exception Categories
Only if you assign one
Only if you assign one
For a named exception, you can write a specific exception handler, instead of handling it with an OTHERS exception handler. A specific exception handler is more efficient than an OTHERS exception handler, because the latter must invoke a function to determine which exception it is handling. For details, see "Error Code and Error Message Retrieval".
Читайте также: