2025, Oct 20 01:31

Snowflake Scripting में Python स्टोरड प्रोसीजर का परिणाम असाइन करने के सही तरीके

Snowflake Scripting में Python स्टोरड प्रोसीजर की return value को वेरिएबल में असाइन करना सीखें. EXECUTE IMMEDIATE से बचें, CALL INTO का सही उपयोग करें.

Python स्टोरड प्रोसीजर के परिणाम को Snowflake Scripting की किसी वेरिएबल में असाइन करना पहली नज़र में आसान लगता है, लेकिन ज़रा-सी गलत संरचना उलझाने वाले पार्सर एरर्स दे सकती है। अगर आपने प्रोसीजर के रिटर्न वैल्यू को EXECUTE IMMEDIATE के ज़रिए भेजने की कोशिश की, तो संभव है कि आपको “unexpected INTO” या “unexpected RETURN” जैसे संदेश मिले हों। वजह सीधी है: EXECUTE IMMEDIATE डायनेमिक SQL के लिए बना है, और यहाँ इसकी ज़रूरत नहीं पड़ती।

समस्या सेटअप

मान लें एक Python स्टोरड प्रोसीजर सफलता का एक स्ट्रिंग लौटाता है, और उसके बाद का ब्लॉक EXECUTE IMMEDIATE के साथ उस वैल्यू को वेरिएबल में कैप्चर करके वापस करने की कोशिश करता है।

CREATE OR REPLACE TEMPORARY PROCEDURE py_task_proc()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.11
HANDLER = 'entry'
AS
$$
def entry():
    return "Procedure executed successfully"
$$
;
DECLARE out_msg STRING;
BEGIN
  EXECUTE IMMEDIATE 'CALL py_task_proc()' INTO :out_msg;
  RETURN out_msg;
END;
SHOW VARIABLES;

इससे “Syntax error: unexpected 'INTO'” और “syntax error ... unexpected 'RETURN'” जैसी त्रुटियाँ मिलती हैं।

असल में गड़बड़ी कहाँ है

EXECUTE IMMEDIATE का उद्देश्य डायनेमिक SQL है। यहाँ स्टेटमेंट स्थिर है, इसलिए डायनेमिक निष्पादन की कोई दरकार नहीं। EXECUTE IMMEDIATE लगाने से अनावश्यक कोड पाथ बनता है और इस संदर्भ में INTO की पोज़िशनिंग को पार्सर स्वीकार नहीं करता। प्रोसीजर के रिटर्न वैल्यू को पकड़ने का इससे सरल और सही तरीका मौजूद है। साथ ही याद रखें: SHOW VARIABLES सत्र-स्तरीय वेरिएबल्स दिखाता है; ये उस ब्लॉक के अंदर DECLARE से बनी Snowflake Scripting वेरिएबल्स के समान नहीं होते।

कारगर तरीका

कॉल का परिणाम सीधे किसी स्क्रिप्टिंग वेरिएबल को असाइन करें, या CALL ... INTO सिंटैक्स से Snowflake को वही मान उस वेरिएबल में रखने दें। दोनों तरीके डायनेमिक SQL से पूरी तरह बचाते हैं।

CREATE OR REPLACE TEMPORARY PROCEDURE py_task_proc()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.11
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'entry'
AS
$$
def entry():
    return "Procedure executed successfully :)"
$$
;

मुख्य ब्लॉक:

DECLARE 
  out_msg STRING;
BEGIN
  out_msg := (CALL py_task_proc());
  CALL py_task_proc() INTO :out_msg;
  RETURN :out_msg;
END;

यह क्यों मायने रखता है

डायनेमिक SQL के बजाय Snowflake Scripting के नैटिव कॉन्स्ट्रक्ट चुनने से कोड संक्षिप्त रहता है और अनावश्यक सिंटैक्स त्रुटियाँ दूर होती हैं। नियंत्रण प्रवाह और डेटा का संचरण भी स्पष्ट हो जाता है: प्रोसीजर कॉल होता है, रिटर्न वैल्यू कैप्चर होती है, और ब्लॉक से वही परिणाम लौटाया जाता है। साथ ही, यह समझना कि SHOW VARIABLES ब्लॉक-स्कोप्ड स्क्रिप्टिंग वेरिएबल्स नहीं, बल्कि सत्र-स्तरीय वेरिएबल्स दिखाता है, डिबगिंग के दौरान भ्रामक जाँचों से बचाता है।

मुख्य निष्कर्ष

यदि आपको Snowflake Scripting में किसी Python स्टोरड प्रोसीजर का रिटर्न वैल्यू चाहिए, तो उसे सीधे कॉल करके परिणाम असाइन करें, या CALL ... INTO का इस्तेमाल करें। EXECUTE IMMEDIATE को केवल उन्हीं स्थितियों के लिए बचाकर रखें जहाँ सच में डायनेमिक SQL जरूरी हो। और याद रखें, SHOW VARIABLES ब्लॉक के अंदर DECLARE से बनी वेरिएबल्स को प्रदर्शित नहीं करता।

यह लेख StackOverflow पर प्रश्न (लेखक: James Gorman) और Lukasz Szozda के उत्तर पर आधारित है।