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

Oracle:RAISE_APPLICATION_ERROR का उपयोग करने की स्थिति क्या है?

RAISE_APPLICATION_ERROR के दो उपयोग हैं। पहला है जेनेरिक Oracle अपवाद संदेशों को अपने स्वयं के, अधिक अर्थपूर्ण संदेशों से बदलना। दूसरा, अपनी खुद की अपवाद स्थितियां बनाना है, जब Oracle उन्हें नहीं फेंकेगा।

निम्नलिखित प्रक्रिया दोनों उपयोगों को दर्शाती है। यह एक व्यावसायिक नियम लागू करता है कि भविष्य में नए कर्मचारियों को काम पर नहीं रखा जा सकता है। यह दो Oracle अपवादों को भी ओवरराइड करता है। एक है DUP_VAL_ON_INDEX, जिसे EMP(ENAME) पर एक अद्वितीय कुंजी द्वारा फेंका जाता है . दूसरा एक उपयोगकर्ता-परिभाषित अपवाद है जिसे तब फेंका जाता है जब EMP(MGR) . के बीच विदेशी कुंजी होती है और EMP(EMPNO) उल्लंघन किया गया है (क्योंकि प्रबंधक को एक मौजूदा कर्मचारी होना चाहिए)।

create or replace procedure new_emp
    ( p_name in emp.ename%type
      , p_sal in emp.sal%type
      , p_job in emp.job%type
      , p_dept in emp.deptno%type
      , p_mgr in emp.mgr%type 
      , p_hired in emp.hiredate%type := sysdate )
is
    invalid_manager exception;
    PRAGMA EXCEPTION_INIT(invalid_manager, -2291);
    dummy varchar2(1);
begin
    -- check hiredate is valid
    if trunc(p_hired) > trunc(sysdate) 
    then
        raise_application_error
            (-20000
             , 'NEW_EMP::hiredate cannot be in the future'); 
    end if;

    insert into emp
        ( ename
          , sal
          , job
          , deptno
          , mgr 
          , hiredate )
    values      
        ( p_name
          , p_sal
          , p_job
          , p_dept
          , p_mgr 
          , trunc(p_hired) );
exception
    when dup_val_on_index then
        raise_application_error
            (-20001
             , 'NEW_EMP::employee called '||p_name||' already exists'
             , true); 
    when invalid_manager then
        raise_application_error
            (-20002
             , 'NEW_EMP::'||p_mgr ||' is not a valid manager'); 

end;
/

यह कैसा दिखता है:

SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1); END;

*
ERROR at line 1:
ORA-20000: NEW_EMP::hiredate cannot be in the future
ORA-06512: at "APC.NEW_EMP", line 16
ORA-06512: at line 1

SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate); END;

*
ERROR at line 1:
ORA-20002: NEW_EMP::8888 is not a valid manager
ORA-06512: at "APC.NEW_EMP", line 42
ORA-06512: at line 1


SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)

PL/SQL procedure successfully completed.

SQL>
SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)
BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate); END;

*
ERROR at line 1:
ORA-20001: NEW_EMP::employee called DUGGAN already exists
ORA-06512: at "APC.NEW_EMP", line 37
ORA-00001: unique constraint (APC.EMP_UK) violated
ORA-06512: at line 1

EXCEPTIONS ब्लॉक में दो कॉलों से RAISE_APPLICATION_ERROR के अलग-अलग आउटपुट पर ध्यान दें। वैकल्पिक तीसरे तर्क को TRUE पर सेट करने का अर्थ है RAISE_APPLICATION_ERROR में स्टैक में ट्रिगरिंग अपवाद शामिल है, जो निदान के लिए उपयोगी हो सकता है।

पीएल/एसक्यूएल यूजर गाइड में अधिक उपयोगी जानकारी है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RefCursor रिटर्न प्रकार के साथ Oracle संग्रहीत कार्यविधि का परीक्षण कैसे करें?

  2. शामिल होने की शर्तों पर IS NULL या IS NOT NULL का उपयोग करना - सिद्धांत प्रश्न

  3. Oracle.DataAccess करते समय Oracle.ManagedDataAccess काम क्यों नहीं करेगा?

  4. लिनक्स पर SQL सर्वर 2016

  5. FROM_TZ () Oracle में फ़ंक्शन