SAP HANA SQL स्क्रिप्ट ट्यूटोरियल: सिंटैक्स और उदाहरण

⚡ स्मार्ट सारांश

एसक्यूएल स्क्रिप्ट में SAP HANA, मानक SQL को कार्यात्मक और प्रक्रियात्मक संरचनाओं के साथ विस्तारित करता है। यह संग्रहीत प्रक्रियाओं और उपयोगकर्ता-परिभाषित कार्यों को शक्ति प्रदान करता है, जिससे डेटा-गहन तर्क को एप्लिकेशन सर्वर से डेटाबेस में स्थानांतरित किया जा सकता है।

  • 🧩 मूल परिभाषा: स्टोर्ड प्रोसीजर के अंदर साधारण SQL स्टेटमेंट के स्थान पर उपयोग किए जाने वाले SQL एक्सटेंशन का एक संग्रह।
  • 📦 दो कंटेनर: प्रक्रियाएँ परिवर्तनों के अनुक्रम का वर्णन करती हैं; उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन स्केलर और टेबल रूपों में आते हैं।
  • 🧠 घोषणात्मक तर्क: यह डेटाबेस तालिकाओं का संदर्भ लिए बिना तालिका प्रकारों को परिभाषित करता है और सामान्य SELECT कथन जारी करता है।
  • 🎼 ऑर्केस्ट्रेशन लॉजिक: यह डीडीएल, डीएमएल और क्वेरी स्टेटमेंट के साथ-साथ लूप और कंडीशनल स्टेटमेंट का उपयोग करके डेटा फ्लो को लागू करता है।
  • 🔀 अनिवार्य तर्क: IF, ELSEIF, ELSE, CASE, FOR लूप और एक्सेप्शन हैंडलिंग डेटा फ्लो में लॉजिक को विभाजित करते हैं।
  • 📤 एकाधिक आउटपुट: एक साधारण SQL प्रक्रिया के विपरीत, एक SQL स्क्रिप्ट प्रक्रिया OUTPUT पैरामीटर के माध्यम से कई परिणाम लौटाती है।
  • ⚡ समानांतर निष्पादन: स्वतंत्र कथनों को गणना इंजन द्वारा समानांतर रूप से निष्पादित किया जाता है।

एसक्यूएल स्क्रिप्ट में SAP HANA

SQL स्क्रिप्ट क्या है?

SQL स्क्रिप्ट SQL के एक्सटेंशन का एक संग्रह है। इसे सादे SQL के स्थान पर संग्रहीत प्रक्रिया में इस्तेमाल किया जा सकता है। यह कार्यात्मक और प्रक्रियात्मक एक्सटेंशन निर्धारित करता है।

In एसक्यूएल स्क्रिप्ट उपयोगकर्ता संरचना और तालिकाओं के लिए स्थानीय चर परिभाषित कर सकता है जो मुख्य रूप से संग्रहीत प्रक्रिया के निर्माण के लिए उपयोग किए जाते हैं।

SQL स्क्रिप्ट का उपयोग कैलकुलेशन दृश्य में भी किया जा सकता है। SQL स्क्रिप्ट में, दो अलग-अलग लॉजिक कंटेनर होते हैं-

  • प्रक्रिया (प्रक्रिया आपको इनपुट और डेटाबेस तालिकाओं के रूप में पारित डेटा पर डेटा रूपांतरणों के अनुक्रम का वर्णन करने की अनुमति देती है)।
  • उपयोगकर्ता परिभाषित फ़ंक्शन (उपयोगकर्ता परिभाषित फ़ंक्शन कंटेनर को स्केलर उपयोगकर्ता परिभाषित फ़ंक्शन और तालिका उपयोगकर्ता परिभाषित फ़ंक्शन में विभाजित किया गया है)।

SQL स्क्रिप्ट भाषा के तत्व नीचे दिए गए हैं –

घोषणात्मक SQL स्क्रिप्ट तर्क (कार्यात्मक विस्तार)

  • यह डेटाबेस तालिकाओं को संदर्भित किए बिना तालिका प्रकारों की परिभाषा की अनुमति देता है।
  • SELECTs जैसा विशिष्ट कथन.
  • गणना इंजन (सीई) कार्य.

⚠️ संस्करण संबंधी टिप्पणी: कैलकुलेशन इंजन प्लान ऑपरेटर, जैसे कि CE_COLUMN_TABLE और CE_JOIN, को अप्रचलित घोषित कर दिया गया है। SAPनए विकास में मानक SQL कथनों का उपयोग किया जाना चाहिए, जिन्हें ऑप्टिमाइज़र कम से कम समान रूप से संभालता है। मौजूदा CE कोड अभी भी चलता है, लेकिन अगली बार किसी प्रक्रिया में परिवर्तन होने पर इसे माइग्रेट किया जाना चाहिए।

ऑर्केस्ट्रेशन SQL स्क्रिप्ट लॉजिक (कार्यात्मक एक्सटेंशन)

ऑर्केस्ट्रेशन लॉजिक का उपयोग डीडीएल, डीएमएल और एसक्यूएल क्वेरी स्टेटमेंट्स का उपयोग करके डेटा प्रवाह को लागू करने के लिए किया जाता है और लूप्स और कंडीशनल्स जैसे अनिवार्य भाषा निर्माणों का उपयोग करके प्रवाह लॉजिक को नियंत्रित किया जाता है।

  • डेटा परिभाषा भाषा कथन. उदाहरण स्कीमा बनाएँ.
  • डेटा हेरफेर भाषा (उदाहरणार्थ इन्सर्ट)।

अनिवार्य SQL स्क्रिप्ट तर्क (प्रक्रियात्मक विस्तार)

अनिवार्य तर्क तर्क को कई डेटा प्रवाहों के बीच विभाजित करता है। उदाहरण के लिए IF, ELSEIF, ELSE, CASE, FOR (लूप) और अपवाद।

SQL स्क्रिप्ट का महत्व

केवल SQL स्क्रिप्ट ही डेटा-गहन तर्क या अनुप्रयोग सर्वर के संचालन को डेटाबेस सर्वर पर स्थानांतरित करने के लिए आवश्यक तत्व प्रदान करती है।

SQL स्क्रिप्ट के मुख्य बिंदु

  • SQL स्क्रिप्ट को HANA डाटाबेस के भीतर गणना इंजन में निष्पादित और संसाधित किया जाता है।
  • SQL स्क्रिप्ट जटिल गणना करने में सक्षम है।
  • SQL स्क्रिप्ट में, अंतरिम परिणाम को धारण करने के लिए एक स्थानीय चर घोषित किया जा सकता है।
  • SQL स्क्रिप्ट प्रक्रिया "OUTPUT पैरामीटर" का उपयोग करके अधिक परिणाम लौटा सकती है जबकि सामान्य SQL प्रक्रिया केवल एक ही परिणाम लौटा सकती है।
  • SQL स्क्रिप्ट में, आप वैश्विक या स्थानीय तालिका प्रकार परिभाषित कर सकते हैं जिनका उपयोग पैरामीटर के रूप में किया जा सकता है।

SQL स्क्रिप्ट का उपयोग करके समानांतर प्रसंस्करण मोड प्राप्त किया जा सकता है।

SQL स्क्रिप्ट प्रक्रिया का उदाहरण

एक प्रक्रिया सबसे आम कंटेनर है। नीचे दिया गया उदाहरण कर्मचारी डेटा पढ़ता है, उसे फ़िल्टर करता है और आउटपुट टेबल पैरामीटर के माध्यम से परिणाम लौटाता है।

CREATE PROCEDURE DHK_SCHEMA.GET_HIGH_EARNERS (
  IN  im_min_salary DECIMAL(15,2),
  OUT ex_employees  TABLE (EMP_NAME NVARCHAR(100), SALARY DECIMAL(15,2)),
  OUT ex_row_count  INTEGER
)
LANGUAGE SQLSCRIPT
READS SQL DATA
AS
BEGIN
  -- Declarative logic: a table variable, not a physical table
  lt_all = SELECT EMP_NAME, SALARY
             FROM DHK_SCHEMA.EMPLOYEE
            WHERE SALARY >= :im_min_salary;

  -- Imperative logic: branch on the result
  SELECT COUNT(*) INTO ex_row_count FROM :lt_all;

  IF :ex_row_count = 0 THEN
    ex_employees = SELECT '' AS EMP_NAME, 0 AS SALARY FROM DUMMY WHERE 1 = 0;
  ELSE
    ex_employees = SELECT * FROM :lt_all ORDER BY SALARY DESC;
  END IF;
END;

तीन नियम ध्यान देने योग्य हैं। किसी भी वेरिएबल को पढ़ने से पहले कोलन लगाया जाता है, इसलिए :lt_all टेबल वेरिएबल को पढ़ता है जबकि lt_all बाईं ओर का फ़ंक्शन इसे असाइन करता है। READS SQL DATA ऑप्टिमाइज़र को बताता है कि प्रक्रिया का कोई दुष्प्रभाव नहीं है, जिससे अधिक आक्रामक समानांतरकरण संभव हो पाता है। और कई आउटपुट पैरामीटर लौटाने वाली प्रक्रिया ठीक वही क्षमता है जो सामान्य SQL में नहीं होती।

इसे नाम देना सीधा-सादा है:

CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);

स्केलर और टेबल उपयोगकर्ता परिभाषित फ़ंक्शन

जहां एक प्रोसीजर क्रियाएं निष्पादित करता है, वहीं एक फंक्शन एक मान लौटाता है और इसे क्वेरी के अंदर उपयोग किया जा सकता है। SQL स्क्रिप्ट दो प्रकार के फंक्शन प्रदान करती है और ये परस्पर उपयोग करने योग्य नहीं हैं।

प्राचल स्केलर यूडीएफ टेबल यूडीएफ
रिटर्न एक ही मान एक परिणाम सेट
में इस्तेमाल किया SELECT सूची, WHERE खंड, अभिव्यक्तियाँ FROM क्लॉज़, एक टेबल की तरह
डेटा को संशोधित किया जा सकता है नहीं नहीं
विशिष्ट उपयोग कर दर जैसी पुन: प्रयोज्य गणना पैरामीटराइज्ड व्यू फ़िल्टर की गई पंक्तियों को लौटाता है
-- Scalar function: returns one value
CREATE FUNCTION DHK_SCHEMA.ADD_BONUS (im_salary DECIMAL(15,2))
  RETURNS total DECIMAL(15,2)
  LANGUAGE SQLSCRIPT AS
BEGIN
  total := :im_salary * 1.10;
END;

SELECT EMP_NAME, DHK_SCHEMA.ADD_BONUS(SALARY) AS WITH_BONUS
  FROM DHK_SCHEMA.EMPLOYEE;

एक टेबल फ़ंक्शन को RETURNS TABLE के साथ परिभाषित किया जाता है और फिर FROM क्लॉज़ में क्वेरी किया जाता है, जो इसे एक पुन: प्रयोज्य, पैरामीटराइज़्ड डेटा सेट बनाने का स्वाभाविक तरीका बनाता है। गणना दृश्य या रिपोर्ट का उपभोग कर सकता है।

SQL स्क्रिप्ट के लिए सर्वोत्तम अभ्यास

SQL स्क्रिप्ट तब अच्छा प्रदर्शन करती है जब उसे इंजन को समानांतर रूप से काम करने की अनुमति देने के लिए लिखा जाता है, और तब खराब प्रदर्शन करती है जब उसे एप्लिकेशन कोड की तरह लिखा जाता है। छह आदतें ही फर्क पैदा करती हैं।

  1. आदेशात्मक की बजाय घोषणात्मक को प्राथमिकता दें। एक सेट आधारित स्टेटमेंट, एक-एक करके पंक्तियों को प्रोसेस करने वाले लूप की तुलना में कई गुना बेहतर प्रदर्शन करता है। FOR लूप का उपयोग तभी करें जब लॉजिक को सेट ऑपरेशन के रूप में व्यक्त करना वास्तव में संभव न हो।
  2. कर्सर का उपयोग न करें। वे पंक्ति दर पंक्ति प्रसंस्करण को बाध्य करते हैं और गणना इंजन को पूरी तरह से निष्क्रिय कर देते हैं। लगभग प्रत्येक कर्सर को जॉइन या एग्रीगेशन के रूप में पुनः लिखा जा सकता है।
  3. बयानों को स्वतंत्र रखें। दो टेबल वेरिएबल्स, जो एक दूसरे को संदर्भित नहीं करते हैं, की गणना समानांतर रूप से की जाती है। प्रत्येक चरण को पिछले चरण से जोड़कर पूरी प्रक्रिया को क्रमबद्ध किया जाता है।
  4. जहां सत्य हो वहां READS SQL DATA घोषित करें। यह इस बात का संकेत है कि इस प्रक्रिया का कोई दुष्प्रभाव नहीं है, जिससे इसे और अधिक बेहतर बनाया जा सकता है।
  5. जितनी जल्दी हो सके फ़िल्टर करें। पहले टेबल वेरिएबल में पंक्तियों की संख्या कम करने से आगे की सभी चीजें सिकुड़ जाती हैं, जबकि अंत में फ़िल्टरिंग करने की कीमत पहले ही चुकानी पड़ चुकी है।
  6. CE_ फ़ंक्शन से दूर हटें। वे अप्रचलित हो चुके हैं, उन्हें एक ही कथन में SQL के साथ स्वतंत्र रूप से नहीं मिलाया जा सकता है, और SQL ऑप्टिमाइज़र अब उसी काम को बेहतर तरीके से संभालता है।

स्टेटमेंट स्तर के सिंटैक्स को इसमें शामिल किया गया है। SAP हाना एसक्यूएलकिसी प्रक्रिया के भीतर उपलब्ध कार्यों में SAP HANA SQL फ़ंक्शनऔर मॉडलिंग ऑब्जेक्ट जो इन प्रक्रियाओं का उपयोग करते हैं SAP हाना मॉडलिंग ट्यूटोरियल।

अक्सर पूछे जाने वाले प्रश्न

कॉलन वेरिएबल को पढ़ने का संकेत देता है। बाईं ओर कॉलन के बिना लिखने से उसे मान असाइन किया जाता है, इसलिए ये दोनों रूप पार्सर को असाइनमेंट और रेफरेंस में अंतर करने में मदद करते हैं।

नहीं। कैलकुलेशन इंजन प्लान ऑपरेटर अप्रचलित हो चुके हैं। मौजूदा कोड चलता रहेगा, लेकिन नए विकास में मानक SQL का उपयोग किया जाना चाहिए, जिसे ऑप्टिमाइज़र अब कम से कम उतनी ही अच्छी तरह से संभालता है।

अक्सर हां। कई FOR लूप और कर्सर जॉइन या एग्रीगेशन को लंबे तरीके से व्यक्त करते हैं, और AI सेट-आधारित समकक्ष का सुझाव दे सकता है। इसे अपनाने से पहले सुनिश्चित करें कि पंक्तियों की संख्या मेल खाती है।

हाँ। योजना को पढ़ना।Viz tracएआई उस कथन की पहचान करता है जो समय की खपत कर रहा है और यह भी कि क्या तालिका चर के बीच अनावश्यक निर्भरता के कारण चरणों को क्रमबद्ध किया गया था।

जी हां, कई आउटपुट टेबल पैरामीटर के माध्यम से। यह एक साधारण SQL प्रक्रिया की तुलना में SQL स्क्रिप्ट का एक मुख्य लाभ है, क्योंकि साधारण SQL प्रक्रिया केवल एक ही परिणाम लौटा सकती है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: