2010-05-19 14 views
13

के अंदर मैं एक क्वेरी (एक चयन) पर काम कर रहा हूं और मुझे इसे तालिका में परिणाम डालना होगा। सम्मिलित करने से पहले मुझे कुछ करने की जांच है, और यदि सभी कॉलम मान्य हैं, तो मैं सम्मिलित करूंगा।ऑरैक कॉल संग्रहित प्रक्रिया का चयन

चेकिंग एक संग्रहीत प्रक्रिया में किया जाता है। वही प्रक्रिया कहीं और भी प्रयोग की जाती है। तो मैं अपने चेक करने के लिए एक ही प्रक्रिया का उपयोग कर सोच रहा हूं।

प्रक्रिया जांच करता है और मान डालने ठीक है।

मैंने अपने चयन के अंदर प्रक्रिया को कॉल करने का प्रयास किया लेकिन यह काम नहीं करता है।

SELECT field1, field2, myproc(field1, field2) 

from MYTABLE. 

इस प्रकार का कोड काम नहीं करता है।

मुझे लगता है कि यह एक कर्सर का उपयोग करके किया जा सकता है, लेकिन मैं कर्सर से बचना चाहता हूं। मैं सबसे आसान समाधान की तलाश में हूं।

कोई भी, कोई विचार?

उत्तर

25

एक PL/SQL पाश का उपयोग करें:

BEGIN 
    FOR c IN (SELECT field1, field2 FROM mytable) LOOP 
     my_proc(c.field1, c.field2); 
    END LOOP; 
END; 
+0

मुझे यही चाहिए। धन्यवाद। –

0

आप SELECT कथन में संग्रहित प्रक्रियाओं का उपयोग नहीं कर सकते हैं। आप इसके लिए फ़ंक्शंस का उपयोग कर सकते हैं।

के रूप में मैं समझता हूँ कि आप अपने सपा डालने बुला रहे हैं, तो विचार है कि आप के समारोह शरीर में सम्मिलित/अपडेट करने का उपयोग कर सकते में रखते हैं। लेकिन अगर आपको कुछ चेक करने की ज़रूरत है तो आप फ़ंक्शन का उपयोग कर सकते हैं जो चेक करेगा और आपके चयन कथन में उस फ़ंक्शन का उपयोग करेगा।

+0

हां, यह अंतिम समाधान होगा, लेकिन मैं मौजूदा एसपी का उपयोग करना चाहता हूं क्योंकि यह एक बड़ी परियोजना का हिस्सा है, और मैं नए कार्यों को नहीं करना चाहता हूं। यह मंथन करना मुश्किल होगा। –

6

एसक्यूएल केवल प्रक्षेपण में फ़ंक्शन का उपयोग कर सकते हैं: यह कुछ है जो एक मान देता है की जरूरत है। तो आपको कुछ कार्यों को लिखना होगा। यह बुरी खबर है। अच्छी खबर यह है कि आप अपने संग्रहित प्रक्रियाओं में सभी निवेश का पुन: उपयोग कर सकते हैं। केवल प्रबंधकों के लिए एक उच्च वेतन हो सकता है:

यहाँ एक प्रक्रिया है जो एक पूरी तरह से सिर्फ व्यापार शासन को लागू है।

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 कथन में इन्टरनेट तर्क है। इसलिए, यदि संग्रहीत प्रक्रिया अपवाद नहीं बढ़ाती है लेकिन इसके बजाय कुछ खराब त्रुटि स्थिति लौटाती है तो रैपिंग फ़ंक्शन को आउटपुट की व्याख्या करना होगा और अपना अपवाद फेंकना होगा।

+0

असल में मेरी संग्रहीत प्रक्रिया सम्मिलित करती है। तो मैं चयन में एक डालने का उपयोग नहीं कर सकता। –

संबंधित मुद्दे