Erlang 21 - 3. Databases

3 डेटाबेस




erlang

3 डेटाबेस

3.1 डेटाबेस

यदि आपको Erlang ODBC इंटरफ़ेस का उपयोग करके अपने erlang एप्लिकेशन से sqlserver , mysql , postgres , oracle , cybase आदि जैसे रिलेशनल डेटाबेस तक पहुँचने की आवश्यकता है, तो इसके बारे में जाने का एक अच्छा तरीका है।

Erlang ODBC एप्लिकेशन को किसी भी संबंधपरक डेटाबेस के लिए काम करना चाहिए जिसमें ODBC ड्राइवर हो। लेकिन वर्तमान में यह केवल नियमित रूप से sqlserver लिए परीक्षण किया जाता है और postgres

3.2 डेटाबेस की स्वतंत्रता

Erlang ODBC इंटरफ़ेस प्रिंसिपल डेटाबेस में स्वतंत्र है, ei इंटरफ़ेस का उपयोग करने वाला एक एरलांग प्रोग्राम विभिन्न डेटाबेसों के परिवर्तन के बिना चलाया जा सकता है। लेकिन जैसा कि एसक्यूएल का उपयोग किया जाता है, डेटाबेस निर्भर कार्यक्रमों को लिखने के लिए यह संभव है। भले ही एसक्यूएल एक एएनएसआई-मानक है जो डेटाबेस के स्वतंत्र होने का मतलब है, अलग-अलग डेटाबेस में एसक्यूएल के स्वामित्व वाले एक्सटेंशन हैं जो अपने स्वयं के डेटा प्रकारों को परिभाषित करते हैं। यदि आप ANSI डेटा प्रकारों को रखते हैं तो आप समस्या को कम कर देंगे। लेकिन दुर्भाग्य से इस बात की कोई गारंटी नहीं है कि सभी डेटाबेस वास्तव में ANSI डेटा प्रकारों के साथ समान व्यवहार करते हैं। उदाहरण के लिए Oracle Enterprise release 8.0.5.0.0 for unix की एक स्थापना स्वीकार करेगी कि आप ANSI डेटा प्रकार integer साथ एक तालिका स्तंभ बनाते हैं, लेकिन जब इस स्तंभ से मान प्राप्त करते हैं तो चालक रिपोर्ट करता है कि यह SQL_DECIMAL(0, 38) और SQL_INTEGER नहीं SQL_INTEGER कि आपने उम्मीद की है।

एक और बाधा यह है कि कुछ ड्राइवर स्क्रॉल करने वाले कर्सर का समर्थन नहीं करते हैं, जिसका प्रभाव है कि परिणाम सेट को पीछे करने का एकमात्र तरीका क्रमिक रूप से है, अगली पंक्ति से, पहली पंक्ति से अंतिम तक, और एक बार जब आप एक पंक्ति से गुजरते हैं तो आप वापस नहीं जा सकते। इसका मतलब है कि इंटरफ़ेस में कुछ फ़ंक्शन कुछ ड्राइवरों के साथ मिलकर काम नहीं करेंगे। एक समान समस्या यह है कि सभी ड्राइवर चुनिंदा प्रश्नों के लिए "पंक्ति गणना" का समर्थन नहीं करते हैं, जिसके परिणामस्वरूप फ़ंक्शन select_count/[3,4] {ok, NrRows} बजाय {ok, undefined} वापस आ जाएगा जहां NrRows की संख्या है परिणाम सेट में पंक्तियाँ।

3.3 डेटा प्रकार

निम्नलिखित एएनएसआई डेटा प्रकारों की एक सूची है। विवरण के लिए ANSI मानक प्रलेखन की ओर मुड़ें। अन्य डेटा प्रकारों का उपयोग निश्चित रूप से संभव है, लेकिन आपको पता होना चाहिए कि यह आपके आवेदन को उस डेटाबेस पर निर्भर करता है जिसे आप इस समय उपयोग कर रहे हैं।

  • CHARACTER (आकार), CHAR (आकार)
  • NUMERIC (परिशुद्धता, स्केल), DECIMAL (परिशुद्धता, स्केल), DEC (सटीक, स्केल) परिशुद्धता - अंकों की कुल संख्या, स्केल - दशमलव स्थानों की कुल संख्या
  • INTEGER, INT, SMALLINT
  • FLOAT (परिशुद्धता)
  • असली
  • दोहरी सुनिश्चितता
  • चार्टर वाइरिंग (आकार), CHAR VARYING (आकार)

Sql_query / [2,3] का उपयोग करते हुए डेटा इनपुट करते समय मान हमेशा स्ट्रिंग प्रारूप में होंगे क्योंकि वे SQL-क्वेरी का हिस्सा होते हैं। उदाहरण:

odbc:sql_query(Ref, "INSERT INTO TEST VALUES(1, 2, 3)").
ध्यान दें

ध्यान दें कि जब इनपुट करने के लिए डेटा का मूल्य एक स्ट्रिंग है, तो इसे ' साथ उद्धृत किया जाना है। उदाहरण:

odbc:sql_query(Ref, "INSERT INTO EMPLOYEE VALUES(1, 'Jane', 'Doe', 'F')").

आप param_query/[3,4] का उपयोग करके भी डेटा इनपुट कर सकते हैं और फिर इनपुट डेटा में कॉलम के ODBC प्रकार के अनुरूप Erlang प्रकार होगा। See ODBC to Erlang mapping

किसी तालिका से डेटा का चयन करते समय, सभी डेटा प्रकार को ODBC डेटा प्रकार के रूप में डेटाबेस से ODBC ड्राइवर को लौटा दिया जाता है। नीचे दी गई तालिकाएं उन डेटा प्रकारों के बीच मानचित्रण दिखाती हैं और एर्लैंग एपीआई द्वारा क्या लौटाया जाता है।

ODBC डेटा प्रकार Erlang Data Type
SQL_CHAR (आकार) स्ट्रिंग | बाइनरी (विन्यास)
SQL_WCHAR (आकार) यूनिकोड बाइनरी को UTF16 लिटिल एंडियन के रूप में एन्कोड किया गया।
Sql_Numeric (पी, रों)
जब (p> = 0 और p <= 9 और s == 0)
पूर्णांक
Sql_Numeric (पी, रों)
जब (p> = 10 और p <= 15 और s == 0) या (s <= 15 और s> 0)
फ्लोट
Sql_Numeric (पी, रों)
जब p> = 16
तार
SQL_DECIMAL (पी, रों)
जब (p> = 0 और p <= 9 और s == 0)
पूर्णांक
SQL_DECIMAL (पी, रों)
जब (p> = 10 और p <= 15 और s == 0) या (s <= 15 और s> 0)
फ्लोट
SQL_DECIMAL (पी, रों)
जब p> = 16
तार
SQL_INTEGER पूर्णांक
SQL_SMALLINT पूर्णांक
SQL_FLOAT फ्लोट
SQL_REAL फ्लोट
SQL_DOUBLE फ्लोट
SQL_VARCHAR (आकार) स्ट्रिंग | बाइनरी (विन्यास)
SQL_WVARCHAR (आकार) यूनिकोड बाइनरी को UTF16 लिटिल एंडियन के रूप में एन्कोड किया गया।

तालिका 3.1: Erlang डेटा प्रकारों के लिए ODBC डेटा प्रकारों की मैपिंग, Erlang एप्लिकेशन पर वापस आ गई।

ODBC डेटा प्रकार Erlang Data Type
SQL_TYPE_DATE तार
SQL_TYPE_TIME तार
SQL_TYPE_TIMESTAMP {{YY, MM, DD}, {HH, MM, SS}}
SQL_LONGVARCHAR स्ट्रिंग | बाइनरी (विन्यास)
SQL_WLONGVARCHAR (आकार) यूनिकोड बाइनरी को UTF16 लिटिल एंडियन के रूप में एन्कोड किया गया।
SQL_BINARY स्ट्रिंग | बाइनरी (विन्यास)
SQL_VARBINARY स्ट्रिंग | बाइनरी (विन्यास)
SQL_LONGVARBINARY स्ट्रिंग | बाइनरी (विन्यास)
SQL_TINYINT पूर्णांक
SQL_BIT बूलियन

तालिका 3.2: Erlang डेटा प्रकारों में विस्तारित ODBC डेटा प्रकारों की मैपिंग Erlang एप्लिकेशन पर वापस आ गई।

ध्यान दें

यह पता लगाने के लिए कि तालिका में स्तंभों के लिए कौन से डेटा प्रकार लौटाए जाएंगे, फ़ंक्शन का उपयोग करें।

३.४ बैच संभालना

नेटवर्क ट्रैफ़िक को कम करने के लिए SQL प्रश्नों का समूहन वांछनीय हो सकता है। एक और लाभ यह हो सकता है कि डेटा स्रोत कभी-कभी SQL क्वेरीज़ के बैच के निष्पादन का अनुकूलन कर सकता है।

नीचे बताई गई प्रक्रियाओं को स्पष्ट करने से कई प्रक्रियाओं का परिणाम होगा, जो sql_query / [2,3] से वापस आ जाएगी। जबकि पैरामीटर किए गए प्रश्नों के साथ केवल एक परिणाम param_query / [2,3] से वापस आ जाएगा।

स्पष्ट बैचों

एक बैच का सबसे बुनियादी रूप अर्धविराम द्वारा अलग किए गए SQL प्रश्न हैं, उदाहरण के लिए:

"SELECT * FROM FOO; SELECT * FROM BAR" or
"INSERT INTO FOO VALUES(1,'bar'); SELECT * FROM FOO"

प्रक्रियाएं

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

CREATE PROCEDURE DepartmentInfo (@DepartmentID INT) AS
SELECT * FROM Employee WHERE department = @DepartmentID
SELECT * FROM Customers WHERE department = @DepartmentID

परिमार्जित प्रश्न

समान प्रश्नों के बैच को प्रभावी ढंग से करने के लिए, आप पैरामीटर किए गए प्रश्नों का उपयोग कर सकते हैं। इसका मतलब यह है कि आप अपने एसक्यूएल क्वेरी स्ट्रिंग में उन स्थानों को चिह्नित करेंगे जिनमें आमतौर पर प्रश्न चिह्न के साथ मान होंगे और फिर प्रत्येक पैरामीटर के लिए मूल्यों की सूची प्रदान करेंगे। उदाहरण के लिए, आप केवल एक SQL स्टेटमेंट निष्पादित करते समय EMPLOYEE टेबल में कई पंक्तियों को सम्मिलित करने के लिए इसका उपयोग कर सकते हैं, उदाहरण के लिए "गेटिंग स्टार्टेड" अध्याय में "Using the Erlang API" अनुभाग देखें।