Чи має стандарт Oracle PL / SQL стандартну програму ASSERT?


14

Я б хотів використовувати рутину ASSERT, функціонально подібну до тієї, що знаходиться в інших мовах, тобто конструкцію (будь то процедура, синтаксис ...)

ASSERT( <condition>, <msg>)

таким чином, що коли <condition>переданий у першому аргументі помилковий, виникає виняток із зазначеним <msg>описовим повідомленням.

Я знаю, що це тривіально робити вручну, але я запитую, чи є стандартний, який надається в СУБД.

Доводиться писати свій власний або імпортувати його з пакетів 3rdy-party було б недоцільним, оскільки мені потрібно, щоб він був повністю портативний і прозорий для кожного проекту, над яким я працюю.


Ні, вам доведеться будувати свій власний. Імпрактичність зараз низький поріг :)
Вінсент Малграт

Відповіді:


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.