Есть ли в Oracle PL / SQL стандартная процедура ASSERT?


14

Я хотел бы использовать подпрограмму ASSERT, функционально похожую на ту, которая есть в других языках, то есть конструкцию (будь то процедура, синтаксис ...)

ASSERT( <condition>, <msg>)

так что, когда <condition>переданный в первом аргументе является ложным, возникает исключительная ситуация с указанным <msg>описательным сообщением.

Я знаю, что это тривиально сделать вручную, но я спрашиваю, есть ли стандартный, поставляемый с СУБД.

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


Нет, вам придется построить свой собственный. В настоящее время непрактичность имеет низкий порог :)
Vincent Malgrat

Ответы:


11

В SQL или PL / SQL нет встроенной процедуры подтверждения, поэтому вам придется написать свою собственную.

Есть два способа сделать это. Вы можете либо вручную вызвать исключение, как описано в этой статье Oracle , либо написать оболочку для raise_application_errorпроцедуры, которая описана в разделе документации Oracle по обработке исключений .

Я добавлю, что исключения были разработаны для такого сценария, поэтому вам лучше снять шляпу программиста на секунду и использовать шляпу DBA :)


7

Встроенный пакет DBMS_ASSERT - это версия того, что вы ищете. Для других утверждений Фил верен, вам придется строить свои собственные. Вот простая демонстрация второго варианта в ответе Фила +1 :

set serveroutput on size 1000000
Declare

   Procedure Assert (pCondition In Number, pMessage In Varchar2) Is
   Begin
      If (pCondition = 1) Then
         Return; 
      End If;
      Raise_Application_Error(-20001, pMessage);
   End Assert;

Begin
   DBMS_Output.Put_Line('Start');

   Assert(Case When 1+1=2 Then 1 Else 0 End,'Something is wrong 1.');
   Assert(Case When 1+1=9 Then 1 Else 0 End,'Something is wrong 2.');

   DBMS_Output.Put_Line('End');
End;
/

1
DBMS_ASSERT предназначен для парсинга SQL, поэтому я не упоминаю об этом.
Philᵀᴹ

1
@Phil, и поэтому я сказал, что в узкой области. Возможно, это должно быть очень узко. :)
Ли Риффель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.