Oracle PL / SQL'in standart bir ASSERT rutini var mı?


14

İşlevsel olarak diğer dillerde bulunanlara benzer bir ASSERT rutini kullanmak istiyorum, yani bir yapı (bir prosedür, sözdizimi ...)

ASSERT( <condition>, <msg>)

öyle ki <condition>ilk argümanda iletilen yanlış olduğunda, belirtilen <msg>açıklayıcı mesajla bir istisna ortaya çıkar .

Bu elle yapmak önemsiz biliyorum ama DBMS ile sağlanan standart bir olup olmadığını soruyorum .

Üzerinde çalıştığım her projeye tamamen taşınabilir ve şeffaf olması gerektiğinden, kendi yazımı yazmak veya üçüncü taraf paketlerinden bir tane almak zorunda kalamazsınız.


Hayır, kendin yapmalısın. Günümüzde pratikliğin düşük bir eşiği var :)
Vincent Malgrat

Yanıtlar:


11

SQL veya PL / SQL'de yerleşik bir onaylama prosedürü yoktur, bu yüzden kendiniz yazmak zorunda kalacaksınız.

Bunu yapmanın iki yolu var. Bu Oracle makalesinde ele alındığı gibi, bir özel durumu el ile yükseltebilir veya raise_application_erroryordamın belgelerinin Oracle özel durum işleme bölümünde belgelenen bir sarmalayıcı yazabilirsiniz .

Bu tür bir senaryo için istisnaların tasarlandığını ekleyeceğim, bu yüzden programcı şapkanızı bir saniyeliğine çıkarmanız ve DBA şapkanızı kullanmanız daha iyi olur :)


7

Yerleşik DBMS_ASSERT paketinin aradığınız şeyin bir dar kapsamlı bir versiyonudur. Phil'in doğru olduğunu ileri sürdüğü için, kendinizinkini oluşturmanız gerekir. İşte Phil'in cevabı + 1'deki ikinci seçeneğin basit bir gösterimi :

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 ayrıştırma hedefleniyor, bu yüzden söz etmiyorum.
Philᵀᴹ

1
@Phil ve bu yüzden dar kapsamda dedim. Belki de son derece dar kapsamlı bir kapsamda olmalıdır. :)
Leigh Riffel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.