2010-08-05 8 views
28

में संग्रहीत प्रक्रिया को किसी अन्य के साथ कॉल करें क्या किसी को किसी अन्य तरीके से संग्रहीत प्रक्रिया को कॉल करने के लिए किसी भी तरीके से, या यहां तक ​​कि यदि संभव हो, तो पता है? यदि हां, तो आप इसे कैसे करेंगे?ओरेकल

यहाँ अपने परीक्षण कोड है:

SET SERVEROUTPUT ON; 

DROP PROCEDURE test_sp_1; 
DROP PROCEDURE test_sp; 

CREATE PROCEDURE test_sp 
AS 
BEGIN 
    DBMS_OUTPUT.PUT_LINE('Test works'); 
END; 
/

CREATE PROCEDURE test_sp_1 
AS 
BEGIN 
    DBMS_OUTPUT.PUT_LINE('Testing'); 
    test_sp; 
END; 
/

CALL test_sp_1; 

उत्तर

38

आपका संग्रहित प्रक्रियाओं के रूप में कोडित काम । समस्या अंतिम पंक्ति के साथ है, यह आपकी संग्रहीत प्रक्रियाओं में से किसी एक को आमंत्रित करने में असमर्थ है।

एसक्यूएल * प्लस में तीन विकल्प हैं: call, exec, और एक अनौपचारिक पीएल/एसक्यूएल ब्लॉक।

call एक SQL कीवर्ड प्रतीत होता है, और SQL संदर्भ में दस्तावेज़ित है। http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG सिंटैक्स आरेख इंगित करता है कि पेरेंटिस की आवश्यकता होती है, भले ही कॉल रूटीन में कोई तर्क पारित न हो।

CALL test_sp_1(); 

एक अनाम PL/SQL ब्लॉक PL/SQL कि एक नामित प्रक्रिया, समारोह, ट्रिगर के अंदर नहीं है, आदि यह अपने प्रक्रिया कॉल करने के लिए इस्तेमाल किया जा सकता है।

BEGIN 
    test_sp_1; 
END; 
/

Exec एक एसक्यूएल * प्लस आदेश ऊपर गुमनाम ब्लॉक के लिए एक शॉर्टकट है।EXEC <procedure_name>BEGIN <procedure_name>; END;

पूर्ण उदाहरण के रूप में डीबी सर्वर से पारित हो जाएगा:

एक सामान्य प्रक्रिया के लिए एक::

CREATE OR REPLACE SP_1() AS 
BEGIN 
/* BODY */ 
END SP_1; 

कॉलिंग प्रक्रिया

SQL> SET SERVEROUTPUT ON 
SQL> CREATE OR REPLACE PROCEDURE test_sp 
    2 AS 
    3 BEGIN 
    4  DBMS_OUTPUT.PUT_LINE('Test works'); 
    5 END; 
    6/

Procedure created. 

SQL> CREATE OR REPLACE PROCEDURE test_sp_1 
    2 AS 
    3 BEGIN 
    4  DBMS_OUTPUT.PUT_LINE('Testing'); 
    5  test_sp; 
    6 END; 
    7/

Procedure created. 

SQL> CALL test_sp_1(); 
Testing 
Test works 

Call completed. 

SQL> exec test_sp_1 
Testing 
Test works 

PL/SQL procedure successfully completed. 

SQL> begin 
    2  test_sp_1; 
    3 end; 
    4/
Testing 
Test works 

PL/SQL procedure successfully completed. 

SQL> 
13

ज़रूर, तुम सिर्फ यह भीतर सपा से कहते हैं, वहाँ कोई विशेष सिंटेक्स है।

पूर्व:

PROCEDURE some_sp 
    AS 
    BEGIN 
     some_other_sp('parm1', 10, 20.42); 
    END; 

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

PROCEDURE some_sp 
    AS 
    BEGIN 
     other_schema.some_other_sp('parm1', 10, 20.42); 
    END; 
+0

कि के लिए धन्यवाद लेकिन जब मुझे लगता है कि का उपयोग कर चलाने का प्रयास कॉल SP_1; मुझे निम्न त्रुटि मिलती है। आदेश में लाइन 21 पर प्रारंभ करने में त्रुटि: कॉल test_sp_1 त्रुटि की रिपोर्ट: एसक्यूएल त्रुटि: ORA-06,576: एक मान्य समारोह या प्रक्रिया नाम 06576. 00000 - "एक मान्य समारोह या प्रक्रिया का नाम" * कारण: सका एक फ़ंक्शन नहीं मिला (यदि कोई आईएनटीओ क्लॉज मौजूद था) या एक प्रक्रिया (यदि कथन में आईएनटीओ क्लॉज नहीं था) कॉल पर नहीं मिला। * कार्यवाही: फ़ंक्शन या प्रक्रिया को आमंत्रित करने के लिए कथन बदलें – electricsheep

+0

@ माइकल लॉकवुड - क्या आप अपना कोड अपने मूल प्रश्न में पोस्ट कर सकते हैं? साथ ही, यदि आप SQL * प्लस जैसे टूल का उपयोग करके फ़ंक्शन को कॉल कर रहे हैं, तो आपको एक वैरिएबल पर रिटर्न वैल्यू असाइन करने की आवश्यकता है। – dcp

+0

@ML: जब भी कॉल काम नहीं करता है (वैध पीएल/एसक्यूएल कथन नहीं है) और डीसीपी ने आपको यह सही तरीके से कैसे किया है, तो आप अभी भी कॉल का उपयोग करने का प्रयास क्यों कर रहे हैं? –

2

@ माइकल लॉकवुड - आपको कहीं भी "कॉल" कीवर्ड का उपयोग करने की आवश्यकता नहीं है। आपको बस प्रक्रिया कॉल का उल्लेख करने की आवश्यकता है।

Begin 
    proc1(input1, input2); 
end; 
/
बजाय

Begin 
    call proc1(input1, input2); 
end; 
/
+0

अपने कोड को देखते हुए, और प्रश्न के संशोधन इतिहास, मुझे नहीं लगता कि वह पीएल/एसक्यूएल के भीतर कॉल का उपयोग कहां कर रहा है। कॉल किसी पीएल/एसक्यूएल के बाहर है, और संग्रहीत प्रक्रियाओं का परीक्षण करने का प्रयास है। –

2

है sqlplus कमांड लाइन से प्रक्रिया को लागू करने के लिए निम्न में से एक कोशिश:

CALL test_sp_1(); 
EXEC test_sp_1 
2

एक और प्रक्रिया से एक प्रक्रिया कॉलिंग SP_1 से SP_1:

CREATE OR REPLACE SP_2() AS 
BEGIN 
/* CALL PROCEDURE SP_1 */ 
SP_1(); 
END SP_2; 

कॉल REFCURSOR या उत्पादन कर्सर के साथ एक प्रक्रिया:

CREATE OR REPLACE SP_1 
(
oCurSp1 OUT SYS_REFCURSOR 
) AS 
BEGIN 
/*BODY */ 
END SP_1; 

कॉल प्रक्रिया sp_1 जो एक आउटपुट पैरामीटर के रूप में REFCURSOR वापस आ जाएगी

CREATE OR REPLACE SP_2 
(
oCurSp2 OUT SYS_REFCURSOR 
) AS `enter code here` 
BEGIN 
/* CALL PROCEDURE SP_1 WITH REF CURSOR AS OUTPUT PARAMETER */ 
SP_1(oCurSp2); 
END SP_2; 
+0

ऑरैकल के लिए रिटघट एवरर। –

+0

सरवे igual si es संख्या el बाहर? y es necesario si o si बाहर? –