क्या Oracle PL / SQL में एक मानक ASSERT दिनचर्या है?


14

मैं अन्य भाषाओं में पाए जाने वाले एक ASSERT दिनचर्या का उपयोग करना चाहता हूं, अर्थात एक निर्माण (यह एक प्रक्रिया, वाक्यविन्यास ...)

ASSERT( <condition>, <msg>)

ऐसा जब <condition>पहली दलील में पारित किया गया है तो एक अपवाद निर्दिष्ट <msg>वर्णनात्मक संदेश के साथ उठाया गया है ।

मुझे पता है कि यह हाथ से करने के लिए तुच्छ है, लेकिन मैं पूछ रहा हूं कि क्या कोई मानक है जो डीबीएमएस के साथ प्रदान किया गया है।

अपने खुद के एक लिखने के लिए या 3rdy- पार्टी संकुल से एक आयात करना अव्यावहारिक होगा, क्योंकि मुझे इसकी आवश्यकता होगी कि मैं जिस प्रोजेक्ट पर काम कर रहा हूं, वह पूरी तरह से पोर्टेबल और पारदर्शी हो।


नहीं, आपको अपना खुद का निर्माण करना होगा। प्रभावोत्पादकता आजकल कम होती है :)
विंसेंट

जवाबों:


11

एसक्यूएल या पीएल / एसक्यूएल में एक अंतर्निहित दावे प्रक्रिया नहीं है, इसलिए आपको अपना खुद का लिखना होगा।

इसके बारे में जाने के दो तरीके हैं। आप या तो मैन्युअल रूप से एक अपवाद बढ़ा सकते हैं, जैसा कि इस ओरेकल लेख में चर्चा की गई है , या आप raise_application_errorप्रक्रिया के लिए एक रैपर लिख सकते हैं , जिसे दस्तावेज़ीकरण के ओरेकल अपवाद हैंडलिंग अनुभाग में प्रलेखित किया गया है।

मैं जोड़ता हूँ कि अपवाद इस तरह के परिदृश्य के लिए डिज़ाइन किए गए थे, इसलिए आप अपने प्रोग्रामर को एक सेकंड के लिए टोपी उतारना और अपने आईबीए टोपी का उपयोग करना बेहतर होगा :)


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 पार्सिंग पर लक्षित किया गया है, इसलिए मैं इसका उल्लेख नहीं कर रहा हूं।
फिल्प

1
@Phil और यही कारण है कि मैंने कहा कि संकीर्ण रूप से scoped। शायद यह बेहद संकीर्ण रूप से स्कूप होना चाहिए। :)
Leigh Riffel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.