मैं किसी अन्य स्क्रिप्ट से एक एसक्यूएल स्क्रिप्ट को कॉल करने की कोशिश कर रहा हूं, और एक चर को पैरामीटर के रूप में पास करने का प्रयास करते समय कुछ मुद्दों का सामना कर रहा हूं।

स्थिरांक को परिभाषित करते समय, मैं इसे इस तरह से पास कर सकता हूं:

DEFINE MY_PARAM = "test"
BEGIN
    @mysqlscript.sql "&MY_PARAM"
END;
/

हालांकि मैं एक चर के साथ स्क्रिप्ट को कॉल करना चाहता हूं, इस तरह कुछ दिखना चाहिए:

DECLARE 
v_MY_PARAM VARCHAR(32) := 'test'
BEGIN
    @mysqlscript.sql :V_MY_PARAM
END;
/

मैंने अलग-अलग तरीकों की कोशिश की है (यानी "&V_MY_PARAM", '&V_MY_PARAM', ':V_MY_PARAM', ...) लेकिन अब तक कोई भाग्य नहीं है।

1
agim 20 जून 2019, 14:04

1 उत्तर

सबसे बढ़िया उत्तर

एक चर से एक DEFINE में मान प्राप्त करना थोड़ा मुश्किल है और इसके लिए एक जटिल प्रक्रिया की आवश्यकता होती है। एसक्यूएल * प्लस में एक बाइंड वैरिएबल बनाएं और जो कुछ भी आप उस बाइंड वैरिएबल में मान प्राप्त करना चाहते हैं वह करें। अब, COLUMN कमांड का उपयोग NEW_VALUE के साथ एक कॉलम और एक define वेरिएबल को परिभाषित करने के लिए करें, जिसमें वह जाएगा। फिर बाइंड वैरिएबल को नए define वैरिएबल में लाने के लिए SELECT का उपयोग करें।

आप इनमें से कुछ गतिविधियों से आउटपुट को कम करने के लिए कुछ एसक्यूएल * प्लस ट्वीक जोड़ना चाह सकते हैं।

यहां देखें:

स्क्रिप्ट.एसक्यूएल

set serveroutput on size unlimited

-- use a bind variable defined at SQL*Plus level for this
variable v_MY_PARAM VARCHAR2(32)

BEGIN
    -- can use SELECT to do this too
    :v_MY_PARAM := 'test';
END;
/

-- Here is the magic that converts a bind variable to a DEFINE variable
column mycol new_value myvar
select :v_MY_PARAM as mycol from dual;

BEGIN
    @mysqlscript.sql &myvar
END;
/

Mysqlscript.sql

dbms_output.put_line('Working? &1');
-- But wait!!!
dbms_output.put_line('This works too: ' || :v_MY_PARAM);

पहला विकल्प एक उचित तर्क का उपयोग करता है, जिसे SQL * प्लस परिभाषित के रूप में नियंत्रित किया जाता है, शब्दशः में स्वैप किया जाता है।

दूसरा विकल्प सीधे आपकी दूसरी फ़ाइल में बाइंड वैरिएबल का उपयोग करता है। बाइंड वैरिएबल SQL*प्लस के लिए वैश्विक है और सभी स्क्रिप्ट द्वारा देखा जा सकता है। इस दूसरे दृष्टिकोण का नकारात्मक पक्ष यह है कि आपकी दूसरी स्क्रिप्ट को बाइंड वेरिएबल का नाम जानने की आवश्यकता है, और संभवतः कॉलर के साथ बहुत निकटता से जोड़ा जाएगा। ऊपर उल्लिखित कमांड-लाइन तर्क दृष्टिकोण का उपयोग करना बेहतर है।

2
Tad Harrison 8 मई 2020, 15:21