एसक्यूएल केवल प्रक्षेपण में फ़ंक्शन का उपयोग कर सकते हैं: यह कुछ है जो एक मान देता है की जरूरत है। तो आपको कुछ कार्यों को लिखना होगा। यह बुरी खबर है। अच्छी खबर यह है कि आप अपने संग्रहित प्रक्रियाओं में सभी निवेश का पुन: उपयोग कर सकते हैं। केवल प्रबंधकों के लिए एक उच्च वेतन हो सकता है:
यहाँ एक प्रक्रिया है जो एक पूरी तरह से सिर्फ व्यापार शासन को लागू है।
SQL> create or replace procedure salary_rule
2 (p_sal in emp.sal%type
3 , p_job in emp.job%type)
4 is
5 x_sal exception;
6 begin
7 if p_sal > 4999 and p_job != 'MANAGER' then
8 raise x_sal;
9 end if;
10 exception
11 when x_sal then
12 raise_application_error(-20000, 'Only managers can earn that much!');
13 end salary_rule;
14/
Procedure created.
SQL>
क्योंकि यह एक प्रक्रिया है, हम इसे एक चयन कथन में उपयोग नहीं कर सकते हैं; हमें इसे एक समारोह में लपेटने की जरूरत है। यह फ़ंक्शन बस संग्रहीत प्रक्रिया को कॉल करता है। यह इनपुट पैरामीटर P_SAL देता है। दूसरे शब्दों में, यदि वेतन मान्य है (नियमों के अनुसार) यह वापस कर दिया जाएगा। अन्यथा फ़ंक्शन संग्रहित प्रक्रिया के अपवाद को फिर से मिटा देगा।
SQL> create or replace function validate_salary
2 (p_sal in emp.sal%type
3 , p_job in emp.job%type)
4 return emp.sal%type
5 is
6 begin
7 salary_rule(p_sal, p_job);
8 return p_sal;
9 end validate_salary;
10/
Function created.
SQL>
फ़ंक्शन को उस मान को वापस करना होगा जिसे हम अपनी तालिका में डालना चाहते हैं। यह "वेतन ठीक" जैसे कुछ अर्थहीन वाक्यांश वापस नहीं कर सकता है। साथ ही, यदि हम दो कॉलम को प्रमाणित करना चाहते हैं तो हमें प्रत्येक के लिए एक अलग कार्य की आवश्यकता है, भले ही उनके बीच कोई रिश्ता हो और हम दोनों को सत्यापित करने के लिए उसी संग्रहीत प्रक्रिया का उपयोग करें। DETERMINISTIC कीवर्ड के लिए अच्छा उपयोग।
यहाँ परीक्षण है: प्लंबर 5000 spondulicks ....
SQL> insert into emp
2 (empno
3 , ename
4 , job
5 , deptno
6 , sal)
7 select
8 emp_seq.nextval
9 , 'HALL'
10 , 'PLUMBER'
11 , 60
12 , validate_salary(5000, 'PLUMBER')
13 from dual
14/
, validate_salary(5000, 'PLUMBER')
*
ERROR at line 12:
ORA-20000: Only managers can earn that much!
ORA-06512: at "APC.SALARY_RULE", line 12
ORA-06512: at "APC.VALIDATE_SALARY", line 7
SQL>
अर्जित नहीं कर सकते हैं ... लेकिन प्रबंधकों कर सकते हैं (क्योंकि वे इसके लायक):
SQL> insert into emp
2 (empno
3 , ename
4 , job
5 , deptno
6 , sal)
7 select
8 emp_seq.nextval
9 , 'HALL'
10 , 'MANAGER'
11 , 60
12 , validate_salary(5000, 'MANAGER')
13 from dual
14/
1 row created.
SQL>
नोट फेंके अपवाद नहीं है कि इस काम के लिए महत्वपूर्ण है।हम कुछ विचित्र लिख नहीं सकते हैं यदि सैलरी हमारे SQL कथन में इन्टरनेट तर्क है। इसलिए, यदि संग्रहीत प्रक्रिया अपवाद नहीं बढ़ाती है लेकिन इसके बजाय कुछ खराब त्रुटि स्थिति लौटाती है तो रैपिंग फ़ंक्शन को आउटपुट की व्याख्या करना होगा और अपना अपवाद फेंकना होगा।
मुझे यही चाहिए। धन्यवाद। –