Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

NO_DATA_FOUND अपवाद तब नहीं फेंका जाता जब चयन INTO . में उपयोग किया जाता है

एक न्यूनतम उदाहरण है:

CREATE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE NO_DATA_FOUND;
END;
/

यदि आप करते हैं:

SELECT raise_exception
FROM   DUAL;

आपको एक एकल पंक्ति मिलेगी जिसमें एक NULL . होगा मान - टॉम से पूछें राज्य:

और उसके बाद पीछा किया:

तो फ़ंक्शन में अपवाद उठाया जाता है और SQL क्लाइंट इसे देखता है और इसकी व्याख्या करता है क्योंकि कोई डेटा नहीं है जो एक NULL है मान और अपवाद को "हैंडल" करता है।

तो

DECLARE
  variable_name VARCHAR2(50);
BEGIN
  SELECT raise_exception
  INTO   variable_name
  FROM   DUAL
END;
/

DUAL . के रूप में सफल होगा तालिका में एक ही पंक्ति है और फ़ंक्शन से अपवाद को (चुपचाप) संभाला जाएगा और वेरिएबल में NULL होगा मूल्य।

हालांकि,

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

अपवाद इस बार फ़ंक्शन से पीएल/एसक्यूएल स्कोप में पारित किया जा रहा है - जो त्रुटि को संभाल नहीं करता है और अपवाद को अपवाद हैंडलर ब्लॉक (जो मौजूद नहीं है) को पास करता है, तो फिर एप्लिकेशन स्कोप तक पहुंच जाता है और निष्पादन समाप्त हो जाता है कार्यक्रम के।

और आस्क टॉम कहता है:

अब, अगर हम एक अलग अपवाद को बढ़ाने के लिए फ़ंक्शन को बदलते हैं:

CREATE OR REPLACE FUNCTION raise_exception RETURN INT
IS
BEGIN
  RAISE ZERO_DIVIDE;
END;
/

फिर दोनों:

SELECT raise_exception
FROM   DUAL;

और:

BEGIN
  DBMS_OUTPUT.PUT_LINE( raise_exception );
END;
/

पता नहीं कैसे अपवाद को संभालना है और ORA-01476 divisor is equal to zero




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL डेवलपर समस्या वेलकम पेज को इनिशियलाइज़ कर रही है

  2. निम्नलिखित परिणाम प्राप्त करने के लिए दो तालिकाओं में कैसे शामिल हों?

  3. Oracle - माता-पिता के लिए सभी चाइल्ड रिकॉर्ड हटाएं

  4. प्रदर्शन ट्यूनिंग भूलभुलैया

  5. UTL_FILE स्थानीय मशीन में सहेजा जा रहा है