पीएल / एसक्यूएल - त्वरित गाइड
पीएल / एसक्यूएल प्रोग्रामिंग भाषा को 1980 के दशक के अंत में ओरेकल कॉर्पोरेशन द्वारा एसक्यूएल और ओरेकल रिलेशनल डेटाबेस के लिए प्रक्रियात्मक विस्तार भाषा के रूप में विकसित किया गया था। PL / SQL के बारे में कुछ उल्लेखनीय तथ्य निम्नलिखित हैं -
पीएल / एसक्यूएल पूरी तरह से पोर्टेबल, उच्च-प्रदर्शन लेनदेन-प्रसंस्करण भाषा है।
पीएल / एसक्यूएल एक अंतर्निहित, व्याख्या और ओएस स्वतंत्र प्रोग्रामिंग वातावरण प्रदान करता है।
PL / SQL को सीधे कमांड-लाइन से भी बुलाया जा सकता है SQL*Plus interface।
डायरेक्ट कॉलिंग को बाहरी प्रोग्रामिंग लैंग्वेज कॉल से डेटाबेस में भी किया जा सकता है।
PL / SQL का सामान्य सिंटैक्स ADA और पास्कल प्रोग्रामिंग भाषा पर आधारित है।
Oracle के अलावा, PL / SQL में उपलब्ध है TimesTen in-memory database तथा IBM DB2।
पीएल / एसक्यूएल की विशेषताएं
PL / SQL में निम्नलिखित विशेषताएं हैं -
- PL / SQL कसकर SQL के साथ एकीकृत है।
- यह व्यापक त्रुटि जाँच प्रदान करता है।
- यह कई डेटा प्रकार प्रदान करता है।
- यह विभिन्न प्रकार की प्रोग्रामिंग संरचनाएँ प्रदान करता है।
- यह कार्यों और प्रक्रियाओं के माध्यम से संरचित प्रोग्रामिंग का समर्थन करता है।
- यह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का समर्थन करता है।
- यह वेब एप्लिकेशन और सर्वर पेज के विकास का समर्थन करता है।
पीएल / एसक्यूएल के लाभ
PL / SQL के निम्नलिखित फायदे हैं -
SQL मानक डेटाबेस भाषा है और PL / SQL जोरदार SQL के साथ एकीकृत है। PL / SQL स्थिर और गतिशील दोनों SQL का समर्थन करता है। स्टेटिक एसक्यूएल पीएम / एसक्यूएल ब्लॉक से डीएमएल संचालन और लेनदेन नियंत्रण का समर्थन करता है। डायनेमिक SQL में, SQL PL / SQL ब्लॉक्स में DDL स्टेटमेंट्स एम्बेड करने की अनुमति देता है।
पीएल / एसक्यूएल एक बार में डेटाबेस को स्टेटमेंट का एक पूरा ब्लॉक भेजने की अनुमति देता है। यह नेटवर्क ट्रैफ़िक को कम करता है और अनुप्रयोगों के लिए उच्च प्रदर्शन प्रदान करता है।
PL / SQL प्रोग्रामर को उच्च उत्पादकता देता है क्योंकि यह डेटाबेस में डेटा को क्वेरी, ट्रांसफ़ॉर्म और अपडेट कर सकता है।
PL / SQL मजबूत विशेषताओं द्वारा डिज़ाइन और डीबगिंग पर समय बचाता है, जैसे अपवाद हैंडलिंग, एन्कैप्सुलेशन, डेटा छुपा, और ऑब्जेक्ट-ओरिएंटेड प्रकार।
पीएल / एसक्यूएल में लिखे गए एप्लिकेशन पूरी तरह से पोर्टेबल हैं।
PL / SQL उच्च सुरक्षा स्तर प्रदान करता है।
PL / SQL पूर्वनिर्धारित SQL संकुल तक पहुँच प्रदान करता है।
PL / SQL ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए समर्थन प्रदान करता है।
PL / SQL वेब एप्लिकेशन और सर्वर पेज विकसित करने के लिए सहायता प्रदान करता है।
इस अध्याय में, हम PL / SQL के पर्यावरण सेटअप पर चर्चा करेंगे। PL / SQL एक स्टैंडअलोन प्रोग्रामिंग भाषा नहीं है; यह ओरेकल प्रोग्रामिंग वातावरण के भीतर एक उपकरण है।SQL* Plusएक इंटरेक्टिव टूल है जो आपको कमांड प्रॉम्प्ट पर SQL और PL / SQL स्टेटमेंट टाइप करने की अनुमति देता है। फिर इन कमांड को प्रोसेसिंग के लिए डेटाबेस में भेजा जाता है। एक बार जब बयानों को संसाधित किया जाता है, तो परिणाम वापस भेजे जाते हैं और स्क्रीन पर प्रदर्शित होते हैं।
PL / SQL प्रोग्राम चलाने के लिए, आपको अपनी मशीन में Oracle RDBMS सर्वर स्थापित करना चाहिए। यह SQL कमांड्स के निष्पादन का ध्यान रखेगा। Oracle RDBMS का सबसे हालिया संस्करण 11g है। आप निम्न लिंक से Oracle 11g का परीक्षण संस्करण डाउनलोड कर सकते हैं -
ओरेकल 11 जी एक्सप्रेस संस्करण डाउनलोड करें
आपको अपने ऑपरेटिंग सिस्टम के अनुसार इंस्टॉलेशन के 32-बिट या 64-बिट संस्करण को डाउनलोड करना होगा। आमतौर पर दो फाइलें होती हैं। हमने 64-बिट संस्करण डाउनलोड किया है। आप अपने ऑपरेटिंग सिस्टम पर भी इसी तरह के चरणों का उपयोग करेंगे, इससे कोई फर्क नहीं पड़ता कि यह लिनक्स या सोलारिस है।
win64_11gR2_database_1of2.zip
win64_11gR2_database_2of2.zip
उपरोक्त दो फ़ाइलों को डाउनलोड करने के बाद, आपको उन्हें एक ही निर्देशिका में अनज़िप करना होगा database और इसके तहत आपको निम्नलिखित उप-निर्देशिकाएं मिलेंगी -
चरण 1
आइए अब हम Oracle डेटाबेस इंस्टॉलर को सेटअप फ़ाइल का उपयोग करके लॉन्च करते हैं। इसके बाद पहली स्क्रीन है। आप अपनी ईमेल आईडी प्रदान कर सकते हैं और निम्न स्क्रीनशॉट में दिखाए गए अनुसार चेकबॉक्स की जांच कर सकते हैं। दबाएंNext बटन।
चरण 2
आपको निम्न स्क्रीन पर निर्देशित किया जाएगा; चेकबॉक्स को अनचेक करें और क्लिक करेंContinue आगे बढ़ने के लिए बटन।
चरण 3
बस पहले विकल्प का चयन करें Create and Configure Database रेडियो बटन का उपयोग कर और क्लिक करें Next आगे बढ़ने के लिए बटन।
चरण 4
हम मानते हैं कि आप ओरेकल को सीखने के मूल उद्देश्य के लिए स्थापित कर रहे हैं और आप इसे अपने पीसी या लैपटॉप पर स्थापित कर रहे हैं। इस प्रकार, चयन करेंDesktop Class विकल्प और क्लिक करें Next आगे बढ़ने के लिए बटन।
चरण 5
एक स्थान प्रदान करें, जहाँ आप Oracle सर्वर स्थापित करेंगे। बस संशोधित करेंOracle Baseऔर अन्य स्थान स्वचालित रूप से सेट हो जाएंगे। आपको एक पासवर्ड भी देना होगा; इसका उपयोग सिस्टम DBA द्वारा किया जाएगा। एक बार आवश्यक जानकारी प्रदान करने के बाद, क्लिक करेंNext आगे बढ़ने के लिए बटन।
चरण 6
फिर से, क्लिक करें Next आगे बढ़ने के लिए बटन।
चरण 7
दबाएं Finishआगे बढ़ने के लिए बटन; यह वास्तविक सर्वर इंस्टॉलेशन शुरू करेगा।
चरण 8
यह कुछ समय लेगा, जब तक कि ओरेकल आवश्यक कॉन्फ़िगरेशन का प्रदर्शन शुरू नहीं करता।
चरण 9
यहां, Oracle इंस्टॉलेशन आवश्यक कॉन्फ़िगरेशन फ़ाइलों की प्रतिलिपि बनाएगा। यह एक क्षण लेना चाहिए -
चरण 10
एक बार डेटाबेस फ़ाइलों की प्रतिलिपि बनाने के बाद, आपके पास निम्न संवाद बॉक्स होगा। बस क्लिक करेंOK बटन और बाहर आओ।
चरण 11
स्थापना के बाद, आपके पास निम्न अंतिम विंडो होगी।
अंतिम चरण
अब आपकी स्थापना को सत्यापित करने का समय आ गया है। यदि आप Windows का उपयोग कर रहे हैं, तो कमांड प्रॉम्प्ट पर, निम्न कमांड का उपयोग करें -
sqlplus "/ as sysdba"
आपके पास एसक्यूएल प्रॉम्प्ट होना चाहिए जहां आप अपने पीएल / एसक्यूएल कमांड और स्क्रिप्ट लिखेंगे -
पाठ संपादक
कमांड प्रॉम्प्ट से बड़े कार्यक्रम चलाने से आप अनजाने में कुछ काम खो सकते हैं। यह हमेशा आदेश फ़ाइलों का उपयोग करने के लिए अनुशंसित है। आदेश फ़ाइलों का उपयोग करने के लिए -
एक पाठ संपादक में अपना कोड लिखें, जैसे Notepad, Notepad+, या EditPlus, आदि।
फ़ाइल को इसके साथ सहेजें .sql घर निर्देशिका में विस्तार।
लॉन्च करें SQL*Plus command prompt उस निर्देशिका से जहाँ आपने अपनी PL / SQL फ़ाइल बनाई थी।
प्रकार @file_name SQL * प्लस कमांड प्रॉम्प्ट पर अपने प्रोग्राम को निष्पादित करने के लिए।
यदि आप PL / SQL स्क्रिप्ट को निष्पादित करने के लिए फ़ाइल का उपयोग नहीं कर रहे हैं, तो बस अपने PL / SQL कोड को कॉपी करें और SQL प्रॉम्प्ट प्रदर्शित करने वाली काली विंडो पर राइट-क्लिक करें; उपयोगpasteकमांड प्रॉम्प्ट पर पूरा कोड पेस्ट करने का विकल्प। अंत में, बस दबाएँEnter कोड निष्पादित करने के लिए, यदि यह पहले से ही निष्पादित नहीं है।
इस अध्याय में, हम PL / SQL के मूल सिंटैक्स की चर्चा करेंगे जो कि एक है block-structuredभाषा: हिन्दी; इसका अर्थ है कि PL / SQL प्रोग्राम कोड के तार्किक ब्लॉकों में विभाजित और लिखे गए हैं। प्रत्येक ब्लॉक में तीन उप-भाग होते हैं -
S.No | अनुभाग और विवरण |
---|---|
1 | Declarations यह खंड कीवर्ड से शुरू होता है DECLARE। यह एक वैकल्पिक अनुभाग है और कार्यक्रम में उपयोग किए जाने वाले सभी चर, कर्सर, उपप्रोग्राम और अन्य तत्वों को परिभाषित करता है। |
2 | Executable Commands यह खंड खोजशब्दों के बीच संलग्न है BEGIN तथा ENDऔर यह एक अनिवार्य अनुभाग है। यह प्रोग्राम के निष्पादन योग्य PL / SQL कथनों में शामिल होता है। इसमें कोड की कम से कम एक निष्पादन योग्य रेखा होनी चाहिए, जो सिर्फ एक हो सकती हैNULL command यह इंगित करने के लिए कि कुछ भी निष्पादित नहीं किया जाना चाहिए। |
3 | Exception Handling यह खंड कीवर्ड से शुरू होता है EXCEPTION। इस वैकल्पिक अनुभाग में सम्मिलित हैexception(s) कि कार्यक्रम में त्रुटियों को संभाल। |
प्रत्येक पीएल / एसक्यूएल स्टेटमेंट एक अर्धविराम (;) के साथ समाप्त होता है। PL / SQL ब्लॉक का उपयोग करके अन्य PL / SQL ब्लॉक के भीतर नेस्ट किया जा सकता हैBEGIN तथा END। निम्नलिखित PL / SQL ब्लॉक की मूल संरचना है -
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling>
END;
'हैलो वर्ल्ड' उदाहरण
DECLARE
message varchar2(20):= 'Hello, World!';
BEGIN
dbms_output.put_line(message);
END;
/
end;पीएल / एसक्यूएल ब्लॉक के अंत में लाइन सिग्नल। SQL कमांड लाइन से कोड को चलाने के लिए, आपको कोड की अंतिम पंक्ति के बाद पहली खाली लाइन की शुरुआत में टाइप करना होगा। जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Hello World
PL/SQL procedure successfully completed.
PL / SQL पहचानकर्ता
PL / SQL पहचानकर्ता स्थिरांक, चर, अपवाद, प्रक्रियाएं, शापदाता और आरक्षित शब्द हैं। पहचानकर्ताओं में एक अक्षर होता है जिसमें वैकल्पिक रूप से अधिक अक्षर, अंक, डॉलर चिह्न, अंडरस्कोर और संख्या चिह्न होते हैं और यह 30 वर्णों से अधिक नहीं होना चाहिए।
डिफ़ॉल्ट रूप से, identifiers are not case-sensitive। तो आप उपयोग कर सकते हैंinteger या INTEGERएक संख्यात्मक मान का प्रतिनिधित्व करने के लिए। आप पहचानकर्ता के रूप में आरक्षित कीवर्ड का उपयोग नहीं कर सकते।
पीएल / एसक्यूएल डेलीमीटर
एक सीमांकक एक विशेष अर्थ के साथ एक प्रतीक है। निम्नलिखित PL / SQL में सीमांकक की सूची है -
सीमान्तक | विवरण |
---|---|
+, -, *, / | जोड़, घटाव / निषेध, गुणा, भाग |
% | संकेतक का प्रतिनिधित्व करें |
' | चरित्र स्ट्रिंग सीमांकक |
. | घटक चयनकर्ता |
(,) | अभिव्यक्ति या सूची परिसीमन |
: | मेजबान चर संकेतक |
, | आइटम विभाजक |
" | उद्धृत पहचानकर्ता परिसीमन |
= | संबंधित ऑपरेटर |
@ | रिमोट एक्सेस इंडिकेटर |
; | कथन टर्मिनेटर |
:= | असाइनमेंट ऑपरेटर |
=> | संघ संचालक |
|| | सांत्वना देनेवाला संचालक |
** | यययय ययय ययय ययययय |
<<, >> | लेबल परिसीमन (आरंभ और अंत) |
/*, */ | बहु-पंक्ति टिप्पणी परिसीमन (आरंभ और अंत) |
-- | एकल-पंक्ति टिप्पणी संकेतक |
.. | रेंज ऑपरेटर |
<, >, <=, >= | संबंधपरक संकारक |
<>, '=, ~=, ^= | अलग-अलग संस्करण नहीं |
PL / SQL टिप्पणियाँ
कार्यक्रम की टिप्पणियां व्याख्यात्मक वक्तव्य हैं जिन्हें पीएल / एसक्यूएल कोड में शामिल किया जा सकता है जो आप लिखते हैं और किसी को इसके स्रोत कोड को पढ़ने में मदद करते हैं। सभी प्रोग्रामिंग भाषाएं किसी न किसी रूप में टिप्पणियों की अनुमति देती हैं।
PL / SQL सिंगल-लाइन और मल्टी-लाइन टिप्पणियों का समर्थन करता है। किसी भी टिप्पणी के अंदर उपलब्ध सभी पात्रों को पीएल / एसक्यूएल संकलक द्वारा अनदेखा किया जाता है। पीएल / एसक्यूएल सिंगल-लाइन टिप्पणियां सीमांकक के साथ शुरू होती हैं - (डबल हाइफ़न) और मल्टी-लाइन टिप्पणियां / * और * / द्वारा संलग्न हैं।
DECLARE
-- variable declaration
message varchar2(20):= 'Hello, World!';
BEGIN
/*
* PL/SQL executable statement(s)
*/
dbms_output.put_line(message);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Hello World
PL/SQL procedure successfully completed.
PL / SQL प्रोग्राम इकाइयाँ
पीएल / एसक्यूएल इकाई निम्नलिखित में से कोई एक है -
- PL / SQL ब्लॉक
- Function
- Package
- पैकेज बॉडी
- Procedure
- Trigger
- Type
- बॉडी टाइप करें
इनमें से प्रत्येक इकाई की चर्चा निम्नलिखित अध्यायों में की जाएगी।
इस अध्याय में, हम PL / SQL में डेटा प्रकारों पर चर्चा करेंगे। पीएल / एसक्यूएल चर, स्थिरांक और पैरामीटर में एक मान्य डेटा प्रकार होना चाहिए, जो भंडारण प्रारूप, बाधाओं और मान्य मानों को निर्दिष्ट करता है। हम पर ध्यान केंद्रित करेंगेSCALAR और यह LOBइस अध्याय में डेटा प्रकार। अन्य दो डेटा प्रकार अन्य अध्यायों में शामिल किए जाएंगे।
S.No | वर्ग विवरण |
---|---|
1 | Scalar कोई आंतरिक घटकों के साथ एकल मान, जैसे कि ए NUMBER, DATE, या BOOLEAN। |
2 | Large Object (LOB) बड़े ऑब्जेक्ट्स के लिए पॉइंटर्स जो अन्य डेटा आइटम्स, जैसे टेक्स्ट, ग्राफिक इमेज, वीडियो क्लिप और साउंड वेवफॉर्म से अलग-अलग स्टोर किए जाते हैं। |
3 | Composite डेटा आइटम जिसमें आंतरिक घटक होते हैं जिन्हें व्यक्तिगत रूप से एक्सेस किया जा सकता है। उदाहरण के लिए, संग्रह और रिकॉर्ड। |
4 | Reference अन्य डेटा आइटम के लिए संकेत। |
PL / SQL स्केलर डेटा प्रकार और उपप्रकार
PL / SQL स्केलर डेटा प्रकार और उपप्रकार निम्नलिखित श्रेणियों के अंतर्गत आते हैं -
S.No | दिनांक प्रकार और विवरण |
---|---|
1 | Numeric संख्यात्मक मान जिस पर अंकगणितीय ऑपरेशन किए जाते हैं। |
2 | Character अक्षरांकीय मान जो एकल वर्णों या वर्णों के तार का प्रतिनिधित्व करते हैं। |
3 | Boolean तार्किक मूल्य जिस पर तार्किक संचालन किया जाता है। |
4 | Datetime दिनांक और समय। |
PL / SQL डेटा प्रकार के उपप्रकार प्रदान करता है। उदाहरण के लिए, डेटा प्रकार NUMBER में INTEGER नामक एक उपप्रकार है। आप पीएल / एसक्यूएल कोड को किसी अन्य प्रोग्राम, जैसे जावा प्रोग्राम में एम्बेड करते समय डेटा प्रकार को अन्य प्रोग्राम्स में संगत बनाने के लिए अपने पीएल / एसक्यूएल प्रोग्राम में उपप्रकारों का उपयोग कर सकते हैं।
PL / SQL संख्यात्मक डेटा प्रकार और उपप्रकार
निम्न तालिका में पीएल / एसक्यूएल पूर्व-निर्धारित संख्यात्मक डेटा प्रकारों और उनके उप-प्रकारों की सूची दी गई है -
S.No | डेटा प्रकार और विवरण |
---|---|
1 | PLS_INTEGER 2,147,483,647 के माध्यम से -2,147,483,648 में पूर्णांक हस्ताक्षरित, 32 बिट्स में प्रतिनिधित्व |
2 | BINARY_INTEGER 2,147,483,647 के माध्यम से -2,147,483,648 में पूर्णांक हस्ताक्षरित, 32 बिट्स में प्रतिनिधित्व |
3 | BINARY_FLOAT एकल-सटीक IEEE 754-फ़्लोटिंग फ़्लोटिंग पॉइंट संख्या |
4 | BINARY_DOUBLE डबल-सटीक आईईईई 754-प्रारूप फ़्लोटिंग-पॉइंट संख्या |
5 | NUMBER(prec, scale) फिक्स्ड-पॉइंट या फ्लोटिंग-पॉइंट नंबर, रेंज 1E-130 से (लेकिन शामिल नहीं) 1.0E126 में निरपेक्ष मूल्य के साथ। एक NUMBER वैरिएबल 0 का भी प्रतिनिधित्व कर सकता है |
6 | DEC(prec, scale) 38 दशमलव अंकों की अधिकतम परिशुद्धता के साथ ANSI विशिष्ट निश्चित-बिंदु प्रकार |
7 | DECIMAL(prec, scale) 38 दशमलव अंकों की अधिकतम परिशुद्धता के साथ आईबीएम विशिष्ट निश्चित-बिंदु प्रकार |
8 | NUMERIC(pre, secale) 38 दशमलव अंकों की अधिकतम परिशुद्धता के साथ फ्लोटिंग प्रकार |
9 | DOUBLE PRECISION 126 द्विआधारी अंकों (लगभग 38 दशमलव अंकों) की अधिकतम परिशुद्धता के साथ ANSI विशिष्ट फ्लोटिंग-पॉइंट प्रकार |
10 | FLOAT ANSI और IBM विशिष्ट फ़्लोटिंग-पॉइंट प्रकार जिसमें अधिकतम बाइनरी 126 बाइनरी अंक (लगभग 38 दशमलव अंक) हैं |
1 1 | INT एएनएसआई विशिष्ट पूर्णांक प्रकार 38 दशमलव अंकों की अधिकतम परिशुद्धता के साथ |
12 | INTEGER एएनएसआई और आईबीएम विशिष्ट पूर्णांक प्रकार 38 दशमलव अंकों की अधिकतम परिशुद्धता के साथ |
13 | SMALLINT एएनएसआई और आईबीएम विशिष्ट पूर्णांक प्रकार 38 दशमलव अंकों की अधिकतम परिशुद्धता के साथ |
14 | REAL 63 बाइनरी अंकों की अधिकतम सटीकता (लगभग 18 दशमलव अंक) के साथ फ्लोटिंग-पॉइंट प्रकार |
निम्नलिखित एक वैध घोषणा है -
DECLARE
num1 INTEGER;
num2 REAL;
num3 DOUBLE PRECISION;
BEGIN
null;
END;
/
जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
PL/SQL procedure successfully completed
पीएल / एसक्यूएल चरित्र डेटा प्रकार और उपप्रकार
निम्नलिखित पीएल / एसक्यूएल पूर्व-परिभाषित चरित्र डेटा प्रकारों और उनके उप-प्रकारों का विवरण है -
S.No | डेटा प्रकार और विवरण |
---|---|
1 | CHAR 32,767 बाइट्स के अधिकतम आकार के साथ फिक्स्ड-लेंथ कैरेक्टर स्ट्रिंग |
2 | VARCHAR2 32,767 बाइट्स के अधिकतम आकार के साथ चर-लंबाई चरित्र स्ट्रिंग |
3 | RAW चर-लंबाई बाइनरी या बाइट स्ट्रिंग 32,767 बाइट्स के अधिकतम आकार के साथ, पीएल / एसक्यूएल द्वारा व्याख्या नहीं की गई |
4 | NCHAR 32,767 बाइट्स के अधिकतम आकार के साथ निश्चित लंबाई वाला राष्ट्रीय चरित्र स्ट्रिंग |
5 | NVARCHAR2 32,767 बाइट्स के अधिकतम आकार के साथ चर-लंबाई वाला राष्ट्रीय चरित्र स्ट्रिंग |
6 | LONG 32,760 बाइट्स के अधिकतम आकार के साथ चर-लंबाई चरित्र स्ट्रिंग |
7 | LONG RAW परिवर्तनीय-लंबाई बाइनरी या बाइट स्ट्रिंग 32,760 बाइट्स के अधिकतम आकार के साथ, पीएल / एसक्यूएल द्वारा व्याख्या नहीं की गई |
8 | ROWID भौतिक पंक्ति पहचानकर्ता, एक साधारण तालिका में एक पंक्ति का पता |
9 | UROWID यूनिवर्सल पंक्ति पहचानकर्ता (भौतिक, तार्किक या विदेशी पंक्ति पहचानकर्ता) |
PL / SQL बुलियन डेटा प्रकार
BOOLEANडेटा प्रकार तार्किक मानों को संग्रहीत करता है जो तार्किक संचालन में उपयोग किए जाते हैं। तार्किक मूल्य बूलियन मूल्य हैंTRUE तथा FALSE और मूल्य NULL।
हालाँकि, SQL में BOOLEAN के बराबर कोई डेटा प्रकार नहीं है। इसलिए, बुलियन मूल्यों का उपयोग नहीं किया जा सकता है -
- एसक्यूएल बयान
- अंतर्निहित SQL फ़ंक्शंस (जैसे कि TO_CHAR)
- पीएल / एसक्यूएल फ़ंक्शन एसक्यूएल बयानों से आहूत
PL / SQL डेटाटाइम और अंतराल प्रकार
DATEडेटेटाइप का उपयोग निश्चित-लंबाई वाले डेटाइम को संग्रहीत करने के लिए किया जाता है, जिसमें आधी रात के बाद से सेकंड में दिन का समय शामिल होता है। मान्य तिथियां 1 जनवरी, 4712 ईसा पूर्व से 31 दिसंबर, 9999 ईस्वी तक की हैं।
डिफ़ॉल्ट दिनांक स्वरूप Oracle प्रारंभकरण पैरामीटर NLS_DATE_FORMAT द्वारा सेट किया गया है। उदाहरण के लिए, डिफ़ॉल्ट 'DD-MON-YY' हो सकता है, जिसमें महीने के दिन के लिए दो अंकों की संख्या, महीने के नाम का एक संक्षिप्त नाम और वर्ष के अंतिम दो अंक शामिल होते हैं। उदाहरण के लिए, 01-OCT-12।
प्रत्येक DATE में शताब्दी, वर्ष, महीना, दिन, घंटा, मिनट और दूसरा शामिल है। निम्न तालिका प्रत्येक क्षेत्र के लिए मान्य मान दिखाती है -
कार्यक्षेत्र नाम | मान्य डेटाटाइम मान | वैध अंतराल मान |
---|---|---|
साल | -4712 से 9999 (वर्ष 0 को छोड़कर) | कोई भी नॉनजरो पूर्णांक |
महीना | 01 से 12 | 0 से 11 |
दिन | 01 से 31 (स्थानीय लोगों के लिए कैलेंडर के नियमों के अनुसार MONTH और YEAR के मूल्यों द्वारा सीमित) | कोई भी नॉनजरो पूर्णांक |
इस घंटे | 00 से 23 | 0 से 23 |
मिनट | 00 से 59 | 0 से 59 |
दूसरा | 00 से 59.9 (एन), जहां 9 (एन) समय आंशिक सेकंड की सटीकता है | 0 से 59.9 (एन), जहां 9 (एन) अंतराल आंशिक सेकंड की सटीकता है |
TIMEZONE_HOUR | -12 से 14 (दिन की बचत के समय में परिवर्तन को समायोजित करता है) | लागू नहीं |
TIMEZONE_MINUTE | 00 से 59 | लागू नहीं |
TIMEZONE_REGION | गतिशील प्रदर्शन दृश्य में मिला V $ TIMEZONE_NAMES | लागू नहीं |
TIMEZONE_ABBR | गतिशील प्रदर्शन दृश्य में मिला V $ TIMEZONE_NAMES | लागू नहीं |
PL / SQL बड़े ऑब्जेक्ट (LOB) डेटा प्रकार
लार्ज ऑब्जेक्ट (LOB) डेटा प्रकार बड़े डेटा आइटम जैसे टेक्स्ट, ग्राफिक इमेज, वीडियो क्लिप और साउंड वेवफॉर्म को संदर्भित करते हैं। LOB डेटा प्रकार इस डेटा के लिए कुशल, यादृच्छिक, टुकड़ा करने की अनुमति देते हैं। निम्नलिखित पूर्वनिर्धारित PL / SQL LOB डेटा प्रकार हैं -
डाटा प्रकार | विवरण | आकार |
---|---|---|
BFILE | डेटाबेस के बाहर ऑपरेटिंग सिस्टम फ़ाइलों में बड़ी द्विआधारी वस्तुओं को संग्रहीत करने के लिए उपयोग किया जाता है। | सिस्टम पर निर्भर। 4 गीगाबाइट (GB) से अधिक नहीं हो सकता। |
ब्लॉब | डेटाबेस में बड़ी द्विआधारी वस्तुओं को संग्रहीत करने के लिए उपयोग किया जाता है। | 8 से 128 टेराबाइट्स (टीबी) |
CLOB | डेटाबेस में चरित्र डेटा के बड़े ब्लॉकों को संग्रहीत करने के लिए उपयोग किया जाता है। | 8 से 128 टी.बी. |
NCLOB | डेटाबेस में NCHAR डेटा के बड़े ब्लॉक को स्टोर करने के लिए उपयोग किया जाता है। | 8 से 128 टी.बी. |
पीएल / एसक्यूएल उपयोगकर्ता-परिभाषित उपप्रकार
एक उपप्रकार एक अन्य डेटा प्रकार का एक सबसेट है, जिसे इसका आधार प्रकार कहा जाता है। एक उपप्रकार के आधार प्रकार के समान मान्य संचालन होते हैं, लेकिन इसके मान्य मानों का केवल एक सबसेट।
PL / SQL पैकेज में कई उपप्रकारों को पूर्वनिर्धारित करता है STANDARD। उदाहरण के लिए, PL / SQL उपप्रकारों को पूर्वनिर्धारित करता हैCHARACTER तथा INTEGER निम्नानुसार है -
SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0);
आप अपने स्वयं के उपप्रकारों को परिभाषित और उपयोग कर सकते हैं। निम्नलिखित कार्यक्रम उपयोगकर्ता परिभाषित उपप्रकार को परिभाषित और उपयोग करते हुए दिखाता है -
DECLARE
SUBTYPE name IS char(20);
SUBTYPE message IS varchar2(100);
salutation name;
greetings message;
BEGIN
salutation := 'Reader ';
greetings := 'Welcome to the World of PL/SQL';
dbms_output.put_line('Hello ' || salutation || greetings);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Hello Reader Welcome to the World of PL/SQL
PL/SQL procedure successfully completed.
पीएल / एसक्यूएल में नल
PL / SQL NULL मान प्रतिनिधित्व करते हैं missing या unknown dataऔर वे एक पूर्णांक, एक चरित्र, या किसी अन्य विशिष्ट डेटा प्रकार नहीं हैं। ध्यान दें किNULL खाली डेटा स्ट्रिंग या अशक्त वर्ण मान के समान नहीं है '\0'। एक शून्य को सौंपा जा सकता है, लेकिन इसे स्वयं सहित किसी भी चीज के साथ बराबर नहीं किया जा सकता है।
इस अध्याय में, हम Pl / SQL में चर की चर्चा करेंगे। एक चर कुछ भी नहीं है लेकिन एक भंडारण क्षेत्र को दिया गया नाम है जो हमारे कार्यक्रमों में हेरफेर कर सकता है। पीएल / एसक्यूएल में प्रत्येक चर में एक विशिष्ट डेटा प्रकार होता है, जो चर की स्मृति के आकार और लेआउट को निर्धारित करता है; मानों की वह सीमा जो उस मेमोरी के भीतर संग्रहीत की जा सकती है और परिचालनों पर लागू होने वाले संचालन का सेट।
पीएल / एसक्यूएल वैरिएबल के नाम में एक अक्षर होता है, जिसके बाद वैकल्पिक रूप से अधिक अक्षर, अंक, डॉलर चिह्न, अंडरस्कोर और संख्या चिन्ह होते हैं और यह 30 अक्षरों से अधिक नहीं होना चाहिए। डिफ़ॉल्ट रूप से, चर नाम केस-संवेदी नहीं होते हैं। आप चर नाम के रूप में आरक्षित PL / SQL कीवर्ड का उपयोग नहीं कर सकते।
पीएल / एसक्यूएल प्रोग्रामिंग भाषा विभिन्न प्रकार के चर को परिभाषित करने की अनुमति देती है, जैसे दिनांक समय डेटा प्रकार, रिकॉर्ड, संग्रह आदि, जिसे हम बाद के अध्यायों में कवर करेंगे। इस अध्याय के लिए, हम केवल मूल चर प्रकारों का अध्ययन करते हैं।
PL / SQL में परिवर्तनीय घोषणा
PL / SQL चर को घोषणा खंड में या एक पैकेज में वैश्विक चर के रूप में घोषित किया जाना चाहिए। जब आप एक चर घोषित करते हैं, तो PL / SQL चर के मान के लिए मेमोरी आवंटित करता है और भंडारण स्थान को चर नाम से पहचाना जाता है।
एक चर घोषित करने के लिए वाक्य रचना है -
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]
जहां, variable_name PL / SQL में एक मान्य पहचानकर्ता है, डेटाटाइप एक मान्य PL / SQL डेटा प्रकार या कोई भी उपयोगकर्ता परिभाषित डेटा प्रकार होना चाहिए , जिसकी हमने पहले ही अंतिम अध्याय में चर्चा की है। उनकी परिभाषा के साथ कुछ मान्य परिवर्तनीय घोषणाएँ नीचे दी गई हैं -
sales number(10, 2);
pi CONSTANT double precision := 3.1415;
name varchar2(25);
address varchar2(100);
जब आप डेटा प्रकार के साथ एक आकार, पैमाने या सटीक सीमा प्रदान करते हैं, तो इसे कहा जाता है constrained declaration। असंबंधित घोषणाओं को असंवैधानिक घोषणाओं की तुलना में कम स्मृति की आवश्यकता होती है। उदाहरण के लिए -
sales number(10, 2);
name varchar2(25);
address varchar2(100);
PL / SQL में वैरिएबल को आरम्भ करना
जब भी आप एक चर घोषित करते हैं, PL / SQL इसे NULL का डिफ़ॉल्ट मान प्रदान करता है। यदि आप NULL वैल्यू के अलावा किसी वैरिएबल को इनिशियलाइज़ करना चाहते हैं, तो आप घोषणा के दौरान ऐसा कर सकते हैं, निम्न में से किसी एक का उपयोग करके -
DEFAULT कीवर्ड
assignment ऑपरेटर
उदाहरण के लिए -
counter binary_integer := 0;
greetings varchar2(20) DEFAULT 'Have a Good Day';
आप यह भी निर्दिष्ट कर सकते हैं कि एक चर में ए नहीं होना चाहिए NULL का उपयोग कर मूल्य NOT NULLबाधा। यदि आप NOT NULL बाधा का उपयोग करते हैं, तो आपको उस चर के लिए प्रारंभिक मूल्य स्पष्ट रूप से निर्दिष्ट करना होगा।
यह एक अच्छा प्रोग्रामिंग अभ्यास है कि चर को ठीक से शुरू करें अन्यथा, कभी-कभी प्रोग्राम अप्रत्याशित परिणाम उत्पन्न करते हैं। निम्नलिखित उदाहरण का प्रयास करें जो विभिन्न प्रकार के चर का उपयोग करता है -
DECLARE
a integer := 10;
b integer := 20;
c integer;
f real;
BEGIN
c := a + b;
dbms_output.put_line('Value of c: ' || c);
f := 70.0/3.0;
dbms_output.put_line('Value of f: ' || f);
END;
/
जब उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Value of c: 30
Value of f: 23.333333333333333333
PL/SQL procedure successfully completed.
PL / SQL में चर स्कोप
PL / SQL ब्लॉक के नेस्टिंग की अनुमति देता है, अर्थात, प्रत्येक प्रोग्राम ब्लॉक में एक और इनर ब्लॉक हो सकता है। यदि एक आंतरिक ब्लॉक के भीतर एक चर घोषित किया जाता है, तो यह बाहरी ब्लॉक तक पहुंच योग्य नहीं है। हालांकि, यदि एक चर घोषित किया जाता है और बाहरी ब्लॉक तक पहुंच योग्य है, तो यह सभी नेस्टेड आंतरिक ब्लॉकों के लिए भी सुलभ है। चर दायरे के दो प्रकार हैं -
Local variables - एक आंतरिक ब्लॉक में घोषित चर और बाहरी ब्लॉकों के लिए सुलभ नहीं है।
Global variables - सबसे बाहरी ब्लॉक या पैकेज में घोषित चर।
निम्नलिखित उदाहरण के उपयोग से पता चलता है Local तथा Global इसके सरल रूप में चर -
DECLARE
-- Global variables
num1 number := 95;
num2 number := 85;
BEGIN
dbms_output.put_line('Outer Variable num1: ' || num1);
dbms_output.put_line('Outer Variable num2: ' || num2);
DECLARE
-- Local variables
num1 number := 195;
num2 number := 185;
BEGIN
dbms_output.put_line('Inner Variable num1: ' || num1);
dbms_output.put_line('Inner Variable num2: ' || num2);
END;
END;
/
जब उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Outer Variable num1: 95
Outer Variable num2: 85
Inner Variable num1: 195
Inner Variable num2: 185
PL/SQL procedure successfully completed.
पीएल / एसक्यूएल चर के लिए SQL क्वेरी परिणाम असाइन करना
आप उपयोग कर सकते हैं SELECT INTOपीएल / एसक्यूएल चर को मान असाइन करने के लिए एसक्यूएल का विवरण। में प्रत्येक आइटम के लिएSELECT list, इसमें एक संगत, प्रकार-संगत चर होना चाहिए INTO list। निम्नलिखित उदाहरण अवधारणा को दर्शाता है। हमें CUSTOMERS नाम की एक तालिका बनाएँ -
(For SQL statements, please refer to the SQL tutorial)
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
Table Created
आइये अब टेबल में कुछ मान डालें -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
निम्न प्रोग्राम उपरोक्त तालिका से PL / SQL चर का उपयोग करके मान प्रदान करता है SELECT INTO clause SQL का -
DECLARE
c_id customers.id%type := 1;
c_name customers.name%type;
c_addr customers.address%type;
c_sal customers.salary%type;
BEGIN
SELECT name, address, salary INTO c_name, c_addr, c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line
('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal);
END;
/
जब उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Customer Ramesh from Ahmedabad earns 2000
PL/SQL procedure completed successfully
इस अध्याय में, हम चर्चा करेंगे constants तथा literalsपीएल / एसक्यूएल में। एक स्थिरांक एक मान रखता है जो एक बार घोषित किया जाता है, कार्यक्रम में नहीं बदलता है। एक निरंतर घोषणा इसके नाम, डेटा प्रकार और मूल्य को निर्दिष्ट करती है, और इसके लिए भंडारण आवंटित करती है। घोषणापत्र भी लगा सकता हैNOT NULL constraint।
लगातार घोषणा करना
का उपयोग करके एक स्थिरांक घोषित किया जाता है CONSTANTकीवर्ड। इसके लिए एक प्रारंभिक मूल्य की आवश्यकता होती है और उस मूल्य को बदलने की अनुमति नहीं देता है। उदाहरण के लिए -
PI CONSTANT NUMBER := 3.141592654;
DECLARE
-- constant declaration
pi constant number := 3.141592654;
-- other declarations
radius number(5,2);
dia number(5,2);
circumference number(7, 2);
area number (10, 2);
BEGIN
-- processing
radius := 9.5;
dia := radius * 2;
circumference := 2.0 * pi * radius;
area := pi * radius * radius;
-- output
dbms_output.put_line('Radius: ' || radius);
dbms_output.put_line('Diameter: ' || dia);
dbms_output.put_line('Circumference: ' || circumference);
dbms_output.put_line('Area: ' || area);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Radius: 9.5
Diameter: 19
Circumference: 59.69
Area: 283.53
Pl/SQL procedure successfully completed.
पीएल / एसक्यूएल साहित्य
एक शाब्दिक एक स्पष्ट संख्यात्मक, चरित्र, स्ट्रिंग या बूलियन मूल्य है जो किसी पहचानकर्ता द्वारा प्रस्तुत नहीं किया जाता है। उदाहरण के लिए, TRUE, 786, NULL, 'tutorialspoint' सभी प्रकार के बूलियन, संख्या या स्ट्रिंग हैं। पीएल / एसक्यूएल, शाब्दिक मामले के प्रति संवेदनशील हैं। PL / SQL निम्नलिखित प्रकार के शाब्दिक समर्थन करता है -
- संख्यात्मक साहित्य
- चरित्र साहित्य
- स्ट्रिंग लिटरल
- BOOLEAN साहित्य
- दिनांक और समय साहित्य
निम्न तालिका शाब्दिक मूल्यों की इन सभी श्रेणियों से उदाहरण प्रदान करती है।
S.No | शाब्दिक प्रकार और उदाहरण |
---|---|
1 | Numeric Literals 050 78 -14 0 +32767 6.6667 0.0 -12.0 3.14159 +7800.00 6E5 1.0E-8 3.14159e0 -1E38 -9.5e-3 |
2 | Character Literals 'A' '%' '9' '' 'z' '(' |
3 | String Literals 'नमस्ते दुनिया!' 'ट्यूटोरियल पॉइंट' '19 -NOV-12 ' |
4 | BOOLEAN Literals सही, गलत, और पूर्ण। |
5 | Date and Time Literals DATE '1978-12-25'; TIMESTAMP '2012-10-29 12:01:01'; |
एक स्ट्रिंग शाब्दिक के भीतर एकल उद्धरण एम्बेड करने के लिए, एक दूसरे के बगल में दो एकल उद्धरण रखें जैसा कि निम्नलिखित कार्यक्रम में दिखाया गया है -
DECLARE
message varchar2(30):= 'That''s tutorialspoint.com!';
BEGIN
dbms_output.put_line(message);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
That's tutorialspoint.com!
PL/SQL procedure successfully completed.
इस अध्याय में, हम PL / SQL में ऑपरेटरों पर चर्चा करेंगे। एक ऑपरेटर एक प्रतीक है जो संकलक को विशिष्ट गणितीय या तार्किक हेरफेर करने के लिए कहता है। PL / SQL भाषा बिल्ट-इन ऑपरेटरों से समृद्ध है और निम्नलिखित प्रकार के ऑपरेटर प्रदान करती है -
- अंकगणितीय आपरेटर
- संबंधपरक संकारक
- तुलना संचालक
- लॉजिकल ऑपरेटर्स
- स्ट्रिंग ऑपरेटरों
यहां, हम एक-एक करके अंकगणित, संबंधपरक, तुलनात्मक और तार्किक संचालकों को समझेंगे। स्ट्रिंग ऑपरेटरों को बाद के अध्याय में चर्चा की जाएगी -PL/SQL - Strings।
अंकगणितीय आपरेटर
निम्न तालिका पीएल / एसक्यूएल द्वारा समर्थित सभी अंकगणितीय ऑपरेटरों को दिखाती है। मान लो कीvariable A 10 रखती है और variable B 5 रखती है, तो -
उदाहरण दिखाएं
ऑपरेटर | विवरण | उदाहरण |
---|---|---|
+ | दो ऑपरेंड जोड़ता है | A + B 15 देगा |
- | पहले से दूसरे ऑपरेंड को घटाता है | A - B 5 देगा |
* | दोनों ऑपरेंड को गुणा करता है | A * B 50 देगा |
/ | डी-न्यूमेरियर द्वारा अंशों को विभाजित करता है | ए / बी 2 देंगे |
** | एक्सपोनेशन ऑपरेटर, एक ऑपरेंड को दूसरे की शक्ति तक बढ़ाता है | A ** B 100000 देगा |
संबंधपरक संकारक
संबंधित ऑपरेटर दो अभिव्यक्तियों या मूल्यों की तुलना करते हैं और एक बूलियन परिणाम लौटाते हैं। निम्न तालिका पीएल / एसक्यूएल द्वारा समर्थित सभी रिलेशनल ऑपरेटरों को दिखाती है। मान लो कीvariable A 10 रखती है और variable B 20 रखती है, तो -
उदाहरण दिखाएं
ऑपरेटर | विवरण | उदाहरण |
---|---|---|
= | जाँच करता है कि दो ऑपरेंड के मान समान हैं या नहीं, यदि हाँ तो स्थिति सच हो जाती है। | (ए = बी) सच नहीं है। |
! = <> ~ = |
जाँच करता है कि दो ऑपरेंड के मान समान हैं या नहीं, यदि मान बराबर नहीं हैं तो स्थिति सत्य हो जाती है। | (ए! = बी) सच है। |
> | यह जाँचता है कि क्या बाएं संकार्य का मान दाहिने संचालक के मान से अधिक है, यदि हाँ, तो स्थिति सत्य है। | (ए> बी) सच नहीं है। |
< | यह जाँचता है कि क्या बाएं संकार्य का मान दाहिने संचालक के मान से कम है, यदि हाँ, तो स्थिति सही है। | (ए <बी) सच है। |
> = | जाँच करता है कि क्या बाएं ऑपरेंड का मूल्य सही ऑपरेंड के मूल्य से अधिक या उसके बराबर है, यदि हाँ तो स्थिति सच हो जाती है। | (ए> = बी) सच नहीं है। |
<= | जाँच करता है कि क्या बाएं संकार्य का मान दाहिने संचालक के मान से कम या उसके बराबर है, यदि हाँ तो स्थिति सत्य हो जाती है। | (ए <= बी) सच है |
तुलना संचालक
तुलना संचालकों का उपयोग एक अभिव्यक्ति की दूसरे से तुलना करने के लिए किया जाता है। परिणाम हमेशा या तो होता हैTRUE, FALSE या NULL।
उदाहरण दिखाएं
ऑपरेटर | विवरण | उदाहरण |
---|---|---|
पसंद | LIKE ऑपरेटर एक चरित्र, स्ट्रिंग या CLOB मान की तुलना एक पैटर्न से करता है और TRUE देता है यदि मान पैटर्न और FALSE से मेल खाता है यदि ऐसा नहीं होता है। | यदि 'ज़ारा अली' की तरह 'Z% A_i' एक बुलियन को वापस लौटाता है, जबकि, 'Z% A_i की तरह' Nuha Ali 'एक बूलियन को गलत लौटाता है। |
के बीच | BETWEEN ऑपरेटर परीक्षण करता है कि क्या मूल्य एक निर्दिष्ट सीमा में है। x बीटा ए और बी का मतलब है कि x> = a और x <= b। | यदि x = 10 तो, 5 और 20 रिटर्न के बीच x, 5 और 10 रिटर्न के बीच x सही है, लेकिन 11 और 20 के बीच x गलत है। |
में | IN ऑपरेटर परीक्षण सदस्यता सेट करता है। x IN (सेट) का मतलब है कि x सेट के किसी भी सदस्य के बराबर है। | यदि x = 'm' तब, x in ('a', 'b', 'c') बूलियन को गलत लौटाता है, लेकिन x इन '(m', 'n', 'o') बूलियन को सही लौटाता है। |
शून्य है | IS NULL संचालक BOOLEAN मान TRUE लौटाता है यदि उसका संचालक NULL या FALSE है यदि वह NULL नहीं है। NULL मानों की तुलना करने वाले की तुलना हमेशा NULL से होती है। | यदि x = 'm' है, तो 'x null' है, बूलियन को गलत बताता है। |
लॉजिकल ऑपरेटर्स
निम्न तालिका पीएल / एसक्यूएल द्वारा समर्थित लॉजिकल ऑपरेटरों को दर्शाती है। ये सभी ऑपरेटर बूलियन ऑपरेंड पर काम करते हैं और बूलियन परिणाम उत्पन्न करते हैं। मान लो कीvariable A सच है और variable B गलत है, तो -
उदाहरण दिखाएं
ऑपरेटर | विवरण | उदाहरण |
---|---|---|
तथा | तार्किक और ऑपरेटर कहा जाता है। यदि दोनों संकार्य सत्य हैं तो स्थिति सत्य हो जाती है। | (ए और बी) गलत है। |
या | जिसे तार्किक या संचालक कहा जाता है। यदि दोनों संचालनों में से कोई भी सत्य है तो स्थिति सत्य हो जाती है। | (ए या बी) सच है। |
नहीं | जिसे तार्किक नहीं ऑपरेटर कहा जाता है। अपने ऑपरेंड की तार्किक स्थिति को उलट देता था। यदि कोई शर्त सत्य है तो लॉजिकल नॉट ऑपरेटर इसे गलत बना देगा। | नहीं (ए और बी) सच है। |
पीएल / एसक्यूएल ऑपरेटर प्राथमिकता
ऑपरेटर पूर्वता एक अभिव्यक्ति में शब्दों के समूहीकरण को निर्धारित करता है। यह प्रभावित करता है कि अभिव्यक्ति का मूल्यांकन कैसे किया जाता है। कुछ ऑपरेटरों में अन्य लोगों की तुलना में अधिक पूर्वता है; उदाहरण के लिए, गुणा ऑपरेटर में अतिरिक्त ऑपरेटर की तुलना में अधिक पूर्वता है।
उदाहरण के लिए, x = 7 + 3 * 2; यहाँ,x सौंपा गया है 13, 20 नहीं क्योंकि ऑपरेटर * में + से अधिक पूर्वता है, इसलिए यह पहले से गुणा हो जाता है 3*2 और फिर में जोड़ता है 7।
यहां, सबसे अधिक पूर्वता वाले ऑपरेटर तालिका के शीर्ष पर दिखाई देते हैं, जो सबसे निचले तल पर दिखाई देते हैं। एक अभिव्यक्ति के भीतर, उच्च पूर्वता ऑपरेटरों का मूल्यांकन पहले किया जाएगा।
ऑपरेटरों की पूर्वता इस प्रकार है: =, <,>, <=,> =, <>; =; ~, ~ =, ^ =, IS NULL, LIKE, BETWEEN, IN।
उदाहरण दिखाएं
ऑपरेटर | ऑपरेशन |
---|---|
** | घातांक |
+ - | पहचान, निषेध |
*, / | गुणा, भाग |
+, -, || | इसके अलावा, घटाव, संयोजन |
तुलना | |
नहीं | तार्किक नकार |
तथा | संयोजन के रूप |
या | समावेश |
इस अध्याय में, हम PL / SQL में शर्तों पर चर्चा करेंगे। निर्णय लेने की संरचनाओं के लिए आवश्यक है कि प्रोग्रामर एक या एक से अधिक शर्तों को कार्यक्रम द्वारा मूल्यांकन या परीक्षण करने के लिए निर्दिष्ट करता है, साथ ही एक बयान या बयानों के साथ निष्पादित किया जाता है यदि स्थिति सही होने के लिए निर्धारित की जाती है, और वैकल्पिक रूप से, निष्पादित किए जाने वाले अन्य बयान। हालत झूठी होने के लिए निर्धारित है।
निम्नलिखित प्रोग्रामिंग भाषाओं में पाया जाने वाला एक सामान्य सशर्त (यानी, निर्णय लेने) संरचना का सामान्य रूप है -
पीएल / एसक्यूएल प्रोग्रामिंग भाषा निम्नलिखित प्रकार के निर्णय लेने वाले बयान प्रदान करती है। उनके विवरण की जाँच करने के लिए निम्न लिंक पर क्लिक करें।
S.No | विवरण और विवरण |
---|---|
1 | यदि - यह कथन IF statement कीवर्ड द्वारा संलग्न बयानों के अनुक्रम के साथ एक शर्त को जोड़ता है THEN तथा END IF। यदि स्थिति सही है, तो कथन निष्पादित हो जाते हैं और यदि स्थिति गलत है या NULL है, तो IF कथन कुछ नहीं करता है। |
2 | IF-THEN-ELSE स्टेटमेंट IF statement कीवर्ड जोड़ता है ELSEबयान के एक वैकल्पिक अनुक्रम के बाद। यदि स्थिति झूठी है या NULL है, तो केवल बयानों के वैकल्पिक अनुक्रम को निष्पादित किया जाता है। यह सुनिश्चित करता है कि या तो बयानों के अनुक्रम को निष्पादित किया जाए। |
3 | IF-THEN-ELSIF स्टेटमेंट यह आपको कई विकल्पों के बीच चयन करने की अनुमति देता है। |
4 | केस का बयान IF स्टेटमेंट की तरह, ए CASE statement निष्पादित करने के लिए कथनों का एक क्रम चुनता है। हालांकि, अनुक्रम का चयन करने के लिए, CASE कथन कई बूलियन अभिव्यक्तियों के बजाय चयनकर्ता का उपयोग करता है। एक चयनकर्ता एक अभिव्यक्ति है जिसका मूल्य कई विकल्पों में से एक का चयन करने के लिए उपयोग किया जाता है। |
5 | खोजे गए CASE स्टेटमेंट खोजे गए CASE कथन has no selector, और यह तब होता है जब बूलियन मूल्यों की उपज वाली खोज स्थितियाँ होती हैं। |
6 | नेस्टेड IF-THEN-ELSE आप एक का उपयोग कर सकते हैं IF-THEN या IF-THEN-ELSIF दूसरे के अंदर बयान IF-THEN या IF-THEN-ELSIF कथन (नों)। |
इस अध्याय में, हम PL / SQL में लूप्स पर चर्चा करेंगे। ऐसी स्थिति हो सकती है जब आपको कई बार कोड के ब्लॉक को निष्पादित करने की आवश्यकता होती है। सामान्य तौर पर, बयानों को क्रमिक रूप से निष्पादित किया जाता है: किसी फ़ंक्शन में पहला कथन पहले निष्पादित किया जाता है, उसके बाद दूसरा, और इसी तरह।
प्रोग्रामिंग भाषाएँ विभिन्न नियंत्रण संरचनाएं प्रदान करती हैं जो अधिक जटिल निष्पादन पथों के लिए अनुमति देती हैं।
एक लूप स्टेटमेंट हमें कई बार स्टेटमेंट या स्टेटमेंट को निष्पादित करने की अनुमति देता है और निम्नलिखित प्रोग्रामिंग भाषाओं में से एक लूप स्टेटमेंट का सामान्य रूप है -
PL / SQL लूपिंग आवश्यकताओं को संभालने के लिए निम्न प्रकार के लूप प्रदान करता है। उनके विवरण की जाँच करने के लिए निम्न लिंक पर क्लिक करें।
S.No | लूप प्रकार और विवरण |
---|---|
1 | PL / SQL बेसिक LOOP इस लूप संरचना में, कथनों का क्रम LOOP और END LOOP कथनों के बीच संलग्न है। प्रत्येक पुनरावृत्ति पर, कथनों के अनुक्रम को निष्पादित किया जाता है और फिर लूप के शीर्ष पर फिर से शुरू होता है। |
2 | PL / SQL WHILE LOOP एक बयान या बयानों के समूह को दोहराता है जबकि किसी दिए गए शर्त सही है। यह लूप बॉडी को निष्पादित करने से पहले स्थिति का परीक्षण करता है। |
3 | एलओपी के लिए पीएल / एसक्यूएल कई बार बयानों का एक क्रम निष्पादित करें और उस कोड को संक्षिप्त करें जो लूप चर का प्रबंधन करता है। |
4 | PL / SQL में नेस्टेड लूप्स आप किसी अन्य मूल लूप के अंदर एक या अधिक लूप का उपयोग कर सकते हैं, जबकि, या लूप के लिए। |
PL / SQL लूप लेबल करना
PL / SQL छोरों को लेबल किया जा सकता है। लेबल को डबल एंगल ब्रैकेट्स (<< और >>) से संलग्न किया जाना चाहिए और LOOP स्टेटमेंट की शुरुआत में दिखाई देना चाहिए। लेबल नाम LOOP स्टेटमेंट के अंत में भी दिखाई दे सकता है। आप लूप से बाहर निकलने के लिए EXIT स्टेटमेंट में लेबल का उपयोग कर सकते हैं।
निम्नलिखित कार्यक्रम अवधारणा को दर्शाता है -
DECLARE
i number(1);
j number(1);
BEGIN
<< outer_loop >>
FOR i IN 1..3 LOOP
<< inner_loop >>
FOR j IN 1..3 LOOP
dbms_output.put_line('i is: '|| i || ' and j is: ' || j);
END loop inner_loop;
END loop outer_loop;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
i is: 1 and j is: 1
i is: 1 and j is: 2
i is: 1 and j is: 3
i is: 2 and j is: 1
i is: 2 and j is: 2
i is: 2 and j is: 3
i is: 3 and j is: 1
i is: 3 and j is: 2
i is: 3 and j is: 3
PL/SQL procedure successfully completed.
लूप नियंत्रण विवरण
लूप नियंत्रण स्टेटमेंट अपने सामान्य अनुक्रम से निष्पादन को बदल देता है। जब निष्पादन एक गुंजाइश छोड़ देता है, तो उस दायरे में बनाए गए सभी स्वचालित ऑब्जेक्ट नष्ट हो जाते हैं।
PL / SQL निम्न नियंत्रण कथनों का समर्थन करता है। लूपिंग लूप भी एक लूप के बाहर नियंत्रण लेने में मदद करते हैं। उनके विवरण की जांच करने के लिए निम्नलिखित लिंक पर क्लिक करें।
S.No | नियंत्रण विवरण और विवरण |
---|---|
1 | EXIT बयान एक्ज़िट स्टेटमेंट लूप को पूरा करता है और कंट्रोल लोएप के तुरंत बाद स्टेटमेंट को पास करता है। |
2 | उपयोगी कथन लूप को उसके शरीर के शेष हिस्से को छोड़ने के लिए कहता है और पुनरावृत्ति करने से पहले तुरंत उसकी स्थिति को फिर से बना देता है। |
3 | GOTO statement Transfers control to the labeled statement. Though it is not advised to use the GOTO statement in your program. |
The string in PL/SQL is actually a sequence of characters with an optional size specification. The characters could be numeric, letters, blank, special characters or a combination of all. PL/SQL offers three kinds of strings −
Fixed-length strings − In such strings, programmers specify the length while declaring the string. The string is right-padded with spaces to the length so specified.
Variable-length strings − In such strings, a maximum length up to 32,767, for the string is specified and no padding takes place.
Character large objects (CLOBs) − These are variable-length strings that can be up to 128 terabytes.
PL/SQL strings could be either variables or literals. A string literal is enclosed within quotation marks. For example,
'This is a string literal.' Or 'hello world'
To include a single quote inside a string literal, you need to type two single quotes next to one another. For example,
'this isn''t what it looks like'
Declaring String Variables
Oracle database provides numerous string datatypes, such as CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB, and NCLOB. The datatypes prefixed with an 'N' are 'national character set' datatypes, that store Unicode character data.
If you need to declare a variable-length string, you must provide the maximum length of that string. For example, the VARCHAR2 data type. The following example illustrates declaring and using some string variables −
DECLARE
name varchar2(20);
company varchar2(30);
introduction clob;
choice char(1);
BEGIN
name := 'John Smith';
company := 'Infotech';
introduction := ' Hello! I''m John Smith from Infotech.';
choice := 'y';
IF choice = 'y' THEN
dbms_output.put_line(name);
dbms_output.put_line(company);
dbms_output.put_line(introduction);
END IF;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
John Smith
Infotech
Hello! I'm John Smith from Infotech.
PL/SQL procedure successfully completed
To declare a fixed-length string, use the CHAR datatype. Here you do not have to specify a maximum length for a fixed-length variable. If you leave off the length constraint, Oracle Database automatically uses a maximum length required. The following two declarations are identical −
red_flag CHAR(1) := 'Y';
red_flag CHAR := 'Y';
PL/SQL String Functions and Operators
PL/SQL offers the concatenation operator (||) for joining two strings. The following table provides the string functions provided by PL/SQL −
S.No | Function & Purpose |
---|---|
1 | ASCII(x); Returns the ASCII value of the character x. |
2 | CHR(x); Returns the character with the ASCII value of x. |
3 | CONCAT(x, y); Concatenates the strings x and y and returns the appended string. |
4 | INITCAP(x); Converts the initial letter of each word in x to uppercase and returns that string. |
5 | INSTR(x, find_string [, start] [, occurrence]); Searches for find_string in x and returns the position at which it occurs. |
6 | INSTRB(x); Returns the location of a string within another string, but returns the value in bytes. |
7 | LENGTH(x); Returns the number of characters in x. |
8 | LENGTHB(x); Returns the length of a character string in bytes for single byte character set. |
9 | LOWER(x); Converts the letters in x to lowercase and returns that string. |
10 | LPAD(x, width [, pad_string]) ; Pads x with spaces to the left, to bring the total length of the string up to width characters. |
11 | LTRIM(x [, trim_string]); Trims characters from the left of x. |
12 | NANVL(x, value); Returns value if x matches the NaN special value (not a number), otherwise x is returned. |
13 | NLS_INITCAP(x); Same as the INITCAP function except that it can use a different sort method as specified by NLSSORT. |
14 | NLS_LOWER(x) ; Same as the LOWER function except that it can use a different sort method as specified by NLSSORT. |
15 | NLS_UPPER(x); Same as the UPPER function except that it can use a different sort method as specified by NLSSORT. |
16 | NLSSORT(x); Changes the method of sorting the characters. Must be specified before any NLS function; otherwise, the default sort will be used. |
17 | NVL(x, value); Returns value if x is null; otherwise, x is returned. |
18 | NVL2(x, value1, value2); Returns value1 if x is not null; if x is null, value2 is returned. |
19 | REPLACE(x, search_string, replace_string); Searches x for search_string and replaces it with replace_string. |
20 | RPAD(x, width [, pad_string]); Pads x to the right. |
21 | RTRIM(x [, trim_string]); Trims x from the right. |
22 | SOUNDEX(x) ; Returns a string containing the phonetic representation of x. |
23 | SUBSTR(x, start [, length]); Returns a substring of x that begins at the position specified by start. An optional length for the substring may be supplied. |
24 | SUBSTRB(x); Same as SUBSTR except that the parameters are expressed in bytes instead of characters for the single-byte character systems. |
25 | TRIM([trim_char FROM) x); Trims characters from the left and right of x. |
26 | UPPER(x); Converts the letters in x to uppercase and returns that string. |
आइए अब अवधारणा को समझने के लिए कुछ उदाहरणों पर काम करते हैं -
उदाहरण 1
DECLARE
greetings varchar2(11) := 'hello world';
BEGIN
dbms_output.put_line(UPPER(greetings));
dbms_output.put_line(LOWER(greetings));
dbms_output.put_line(INITCAP(greetings));
/* retrieve the first character in the string */
dbms_output.put_line ( SUBSTR (greetings, 1, 1));
/* retrieve the last character in the string */
dbms_output.put_line ( SUBSTR (greetings, -1, 1));
/* retrieve five characters,
starting from the seventh position. */
dbms_output.put_line ( SUBSTR (greetings, 7, 5));
/* retrieve the remainder of the string,
starting from the second position. */
dbms_output.put_line ( SUBSTR (greetings, 2));
/* find the location of the first "e" */
dbms_output.put_line ( INSTR (greetings, 'e'));
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
HELLO WORLD
hello world
Hello World
h
d
World
ello World
2
PL/SQL procedure successfully completed.
उदाहरण 2
DECLARE
greetings varchar2(30) := '......Hello World.....';
BEGIN
dbms_output.put_line(RTRIM(greetings,'.'));
dbms_output.put_line(LTRIM(greetings, '.'));
dbms_output.put_line(TRIM( '.' from greetings));
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
......Hello World
Hello World.....
Hello World
PL/SQL procedure successfully completed.
इस अध्याय में, हम PL / SQL में सरणियों पर चर्चा करेंगे। पीएल / एसक्यूएल प्रोग्रामिंग भाषा एक डेटा संरचना प्रदान करती है जिसे कहा जाता हैVARRAY, जो एक ही प्रकार के तत्वों के एक निश्चित आकार के अनुक्रमिक संग्रह को संग्रहीत कर सकते हैं। एक वैरिएबल का उपयोग डेटा के ऑर्डर किए गए संग्रह को संग्रहीत करने के लिए किया जाता है, हालांकि अक्सर एक सरणी के समान प्रकार के संग्रह के रूप में एक सरणी के बारे में सोचना बेहतर होता है।
सभी प्रकारों में सन्निहित स्मृति स्थान होते हैं। निम्नतम पता पहले तत्व से मेल खाता है और उच्चतम पता अंतिम तत्व से।
एक सरणी संग्रह प्रकार डेटा का एक हिस्सा है और यह चर-आकार सरणियों के लिए खड़ा है। हम बाद के अध्याय में अन्य संग्रह प्रकारों का अध्ययन करेंगे'PL/SQL Collections'।
ए में प्रत्येक तत्व varrayइसके साथ एक सूचकांक जुड़ा हुआ है। इसका एक अधिकतम आकार भी है जिसे गतिशील रूप से बदला जा सकता है।
एक प्रकार का प्रकार बनाना
के साथ एक प्रकार का संस्करण बनाया जाता है CREATE TYPEबयान। आपको अधिकतम आकार और प्रकार के तत्वों को स्टोरेज में निर्दिष्ट करना होगा।
स्कीमा स्तर पर VARRAY प्रकार बनाने के लिए मूल वाक्यविन्यास है -
CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>
कहाँ पे,
- varray_type_name एक मान्य विशेषता नाम है,
- n वेरिएंट में तत्वों की संख्या (अधिकतम) है,
- element_type सरणी के तत्वों का डेटा प्रकार है।
किसी वैरिएंट के अधिकतम आकार का उपयोग करके बदला जा सकता है ALTER TYPE बयान।
उदाहरण के लिए,
CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10);
/
Type created.
PL / SQL ब्लॉक के भीतर VARRAY प्रकार बनाने के लिए मूल वाक्यविन्यास है -
TYPE varray_type_name IS VARRAY(n) of <element_type>
उदाहरण के लिए -
TYPE namearray IS VARRAY(5) OF VARCHAR2(10);
Type grades IS VARRAY(5) OF INTEGER;
आइए अब अवधारणा को समझने के लिए कुछ उदाहरणों पर काम करते हैं -
उदाहरण 1
निम्नलिखित कार्यक्रम वर्णों के उपयोग को दर्शाता है -
DECLARE
type namesarray IS VARRAY(5) OF VARCHAR2(10);
type grades IS VARRAY(5) OF INTEGER;
names namesarray;
marks grades;
total integer;
BEGIN
names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i in 1 .. total LOOP
dbms_output.put_line('Student: ' || names(i) || '
Marks: ' || marks(i));
END LOOP;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Total 5 Students
Student: Kavita Marks: 98
Student: Pritam Marks: 97
Student: Ayan Marks: 78
Student: Rishav Marks: 87
Student: Aziz Marks: 92
PL/SQL procedure successfully completed.
Please note -
Oracle वातावरण में, वैरिएज़ के लिए शुरुआती इंडेक्स हमेशा 1 होता है।
आप वैरिएंट प्रकार के कंस्ट्रक्टर विधि का उपयोग करके वैरिएंट तत्वों को इनिशियलाइज़ कर सकते हैं, जिसका वैरिएबल नाम समान है।
Varrays एक आयामी सरणियाँ हैं।
जब यह घोषित किया जाता है और इसके तत्वों को संदर्भित किए जाने से पहले एक वैरिएबल स्वचालित रूप से NULL होता है।
उदाहरण 2
एक वैरिएबल के तत्व किसी भी डेटाबेस तालिका का% ROWTYPE या किसी भी डेटाबेस तालिका क्षेत्र के% TYPE हो सकते हैं। निम्नलिखित उदाहरण अवधारणा को दर्शाता है।
हम अपने डेटाबेस में संग्रहीत ग्राहक तालिका का उपयोग निम्नानुसार करेंगे -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
निम्नलिखित उदाहरण का उपयोग करता है cursor, जो आप एक अलग अध्याय में विस्तार से अध्ययन करेंगे।
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
type c_list is varray (6) of customers.name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter + 1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter ||'):'||name_list(counter));
END LOOP;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
इस अध्याय में, हम पीएल / एसक्यूएल में प्रक्रियाओं पर चर्चा करेंगे। एsubprogramएक प्रोग्राम यूनिट / मॉड्यूल है जो एक विशेष कार्य करता है। ये उपप्रोग्राम बड़े कार्यक्रमों को बनाने के लिए संयुक्त होते हैं। इसे मूल रूप से 'मॉड्यूलर डिजाइन' कहा जाता है। एक उपप्रोग्राम को दूसरे उपप्रोग्राम या प्रोग्राम द्वारा बुलाया जा सकता है जिसे कहा जाता हैcalling program।
एक उपप्रोग्राम बनाया जा सकता है -
- स्कीमा स्तर पर
- एक पैकेज के अंदर
- एक पीएल / एसक्यूएल ब्लॉक के अंदर
स्कीमा स्तर पर, उपप्रोग्राम एक है standalone subprogram। इसे क्रिएट प्रॉसीड या क्रिएट फंक्शन स्टेटमेंट के साथ बनाया गया है। इसे डेटाबेस में संग्रहीत किया जाता है और इसे DROP PROCEDURE या DROP FUNCTION स्टेटमेंट के साथ डिलीट किया जा सकता है।
एक पैकेज के अंदर बनाया गया एक उपप्रोग्राम ए है packaged subprogram। इसे डेटाबेस में संग्रहीत किया जाता है और केवल तभी हटाया जा सकता है जब पैकेज को DROP पैकेज विवरण के साथ हटा दिया जाता है। हम अध्याय में पैकेजों पर चर्चा करेंगे'PL/SQL - Packages'।
पीएल / एसक्यूएल सबप्रोग्राम को पीएल / एसक्यूएल ब्लॉक का नाम दिया जाता है जिसे मापदंडों के एक सेट के साथ लागू किया जा सकता है। PL / SQL दो प्रकार के उपप्रोग्राम प्रदान करता है -
Functions- ये उपप्रोग्राम एक एकल मान लौटाते हैं; मुख्य रूप से एक मूल्य की गणना और वापसी के लिए उपयोग किया जाता है।
Procedures- ये उपप्रोग्राम सीधे मान वापस नहीं करते हैं; मुख्य रूप से एक क्रिया करते थे।
यह अध्याय एक के महत्वपूर्ण पहलुओं को कवर करने जा रहा है PL/SQL procedure। हम चर्चा करेंगेPL/SQL function अगले अध्याय में
पीएल / एसक्यूएल सबप्रोग्राम के हिस्से
प्रत्येक PL / SQL उपप्रोग्राम में एक नाम होता है, और इसमें एक पैरामीटर सूची भी हो सकती है। अनाम पीएल / एसक्यूएल ब्लॉकों की तरह, नामित ब्लॉकों में भी निम्नलिखित तीन भाग होंगे -
S.No | भागों और विवरण |
---|---|
1 | Declarative Part यह एक वैकल्पिक हिस्सा है। हालाँकि, उपप्रोग्राम के लिए घोषणात्मक भाग DECLARE कीवर्ड से शुरू नहीं होता है। इसमें प्रकार, कर्सर, स्थिरांक, चर, अपवाद और नेस्टेड उपप्रोग्राम की घोषणाएं शामिल हैं। ये आइटम सबप्रोग्राम के लिए स्थानीय हैं और उपप्रोग्राम निष्पादन पूर्ण होने पर मौजूद नहीं रहते हैं। |
2 | Executable Part यह एक अनिवार्य हिस्सा है और इसमें ऐसे कथन शामिल हैं जो निर्दिष्ट कार्रवाई करते हैं। |
3 | Exception-handling यह फिर से एक वैकल्पिक हिस्सा है। इसमें वह कोड होता है जो रन-टाइम त्रुटियों को संभालता है। |
एक प्रक्रिया बनाना
के साथ एक प्रक्रिया बनाई जाती है CREATE OR REPLACE PROCEDUREबयान। क्रिएट या रिपोर्ट प्रक्रिया विवरण के लिए सरलीकृत वाक्यविन्यास इस प्रकार है -
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
< procedure_body >
END procedure_name;
कहाँ पे,
प्रक्रिया-नाम प्रक्रिया के नाम को निर्दिष्ट करता है।
[या प्रतिक्रिया] विकल्प एक मौजूदा प्रक्रिया के संशोधन की अनुमति देता है।
वैकल्पिक पैरामीटर सूची में नाम, मोड और मापदंडों के प्रकार शामिल हैं। IN उस मूल्य का प्रतिनिधित्व करता है जो बाहर से पारित किया जाएगा और OUT उस पैरामीटर का प्रतिनिधित्व करता है जिसका उपयोग प्रक्रिया के बाहर एक मूल्य वापस करने के लिए किया जाएगा।
प्रक्रिया-शरीर में निष्पादन योग्य भाग होता है।
स्टैंडअलोन प्रक्रिया बनाने के लिए IS कीवर्ड के बजाय AS कीवर्ड का उपयोग किया जाता है।
उदाहरण
निम्न उदाहरण एक सरल प्रक्रिया बनाता है जो स्ट्रिंग को प्रदर्शित करता है 'हैलो वर्ल्ड!' निष्पादित होने पर स्क्रीन पर।
CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
dbms_output.put_line('Hello World!');
END;
/
जब SQL कोड का उपयोग करके उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम देगा -
Procedure created.
एक स्टैंडअलोन प्रक्रिया का निष्पादन
एक स्टैंडअलोन प्रक्रिया को दो तरीकों से बुलाया जा सकता है -
का उपयोग करते हुए EXECUTE कीवर्ड
पीएल / एसक्यूएल ब्लॉक से प्रक्रिया का नाम कॉलिंग
नाम की उपरोक्त प्रक्रिया 'greetings' EXECUTE कीवर्ड के साथ कहा जा सकता है -
EXECUTE greetings;
उपरोक्त कॉल प्रदर्शित होगी -
Hello World
PL/SQL procedure successfully completed.
प्रक्रिया को दूसरे पीएल / एसक्यूएल ब्लॉक से भी बुलाया जा सकता है -
BEGIN
greetings;
END;
/
उपरोक्त कॉल प्रदर्शित होगी -
Hello World
PL/SQL procedure successfully completed.
एक स्टैंडअलोन प्रक्रिया को हटाना
के साथ एक स्टैंडअलोन प्रक्रिया को हटा दिया जाता है DROP PROCEDUREबयान। एक प्रक्रिया को हटाने के लिए सिंटैक्स है -
DROP PROCEDURE procedure-name;
आप निम्न कथन का उपयोग करके अभिवादन प्रक्रिया को छोड़ सकते हैं -
DROP PROCEDURE greetings;
पीएल / एसक्यूएल सबप्रोग्राम में पैरामीटर मोड
निम्न तालिका PL / SQL उपप्रोग्राम में पैरामीटर मोड को सूचीबद्ध करती है -
S.No | पैरामीटर मोड और विवरण |
---|---|
1 | IN एक पैरामीटर आपको उपप्रोग्राम के लिए एक मान पास करने देता है। It is a read-only parameter। उपप्रोग्राम के अंदर, एक IN पैरामीटर एक स्थिरांक की तरह कार्य करता है। इसे एक मान नहीं सौंपा जा सकता है। आप IN पैरामीटर के रूप में एक निरंतर, शाब्दिक, आरंभिक चर या अभिव्यक्ति पारित कर सकते हैं। आप इसे एक डिफ़ॉल्ट मान के लिए प्रारंभ भी कर सकते हैं; हालाँकि, उस स्थिति में, यह उपप्रोग्राम कॉल से छोड़ा गया है।It is the default mode of parameter passing. Parameters are passed by reference। |
2 | OUT OUT पैरामीटर कॉलिंग प्रोग्राम के लिए एक मान देता है। सबप्रोग्राम के अंदर, एक OUT पैरामीटर एक चर की तरह काम करता है। आप इसका मान बदल सकते हैं और इसे निर्दिष्ट करने के बाद मान को संदर्भित कर सकते हैं।The actual parameter must be variable and it is passed by value। |
3 | IN OUT एक IN OUTपैरामीटर एक उपप्रोग्राम के लिए एक प्रारंभिक मान पास करता है और कॉलर को एक अद्यतन मान लौटाता है। इसे एक मूल्य सौंपा जा सकता है और मूल्य को पढ़ा जा सकता है। IN OUT औपचारिक पैरामीटर के अनुरूप वास्तविक पैरामीटर एक चर होना चाहिए, न कि एक स्थिर या एक अभिव्यक्ति। औपचारिक पैरामीटर को एक मान सौंपा जाना चाहिए।Actual parameter is passed by value. |
IN & OUT मोड उदाहरण 1
यह प्रोग्राम न्यूनतम दो मान पाता है। यहां, यह प्रक्रिया IN मोड का उपयोग करते हुए दो नंबर लेती है और OUT मापदंडों का उपयोग करके अपना न्यूनतम रिटर्न देती है।
DECLARE
a number;
b number;
c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS
BEGIN
IF x < y THEN
z:= x;
ELSE
z:= y;
END IF;
END;
BEGIN
a:= 23;
b:= 45;
findMin(a, b, c);
dbms_output.put_line(' Minimum of (23, 45) : ' || c);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Minimum of (23, 45) : 23
PL/SQL procedure successfully completed.
और बाहर मोड उदाहरण 2
यह प्रक्रिया एक पारित मूल्य के मूल्य के वर्ग की गणना करती है। यह उदाहरण दिखाता है कि हम एक मान को स्वीकार करने के लिए एक ही पैरामीटर का उपयोग कैसे कर सकते हैं और फिर एक और परिणाम दे सकते हैं।
DECLARE
a number;
PROCEDURE squareNum(x IN OUT number) IS
BEGIN
x := x * x;
END;
BEGIN
a:= 23;
squareNum(a);
dbms_output.put_line(' Square of (23): ' || a);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Square of (23): 529
PL/SQL procedure successfully completed.
पासिंग पैरामीटर्स के लिए तरीके
वास्तविक मापदंडों को तीन तरीकों से पारित किया जा सकता है -
- स्थिति संबंधी संकेतन
- जिसका नाम नोटेशन है
- मिश्रित संकेतन
स्थिति संबंधी सूचना
स्थिति संकेतन में, आप इस प्रक्रिया को कॉल कर सकते हैं -
findMin(a, b, c, d);
स्थितिगत संकेतन में, पहले औपचारिक पैरामीटर को पहले औपचारिक पैरामीटर के लिए प्रतिस्थापित किया जाता है; दूसरे वास्तविक पैरामीटर को दूसरे औपचारिक पैरामीटर के लिए प्रतिस्थापित किया जाता है, और इसी तरह। इसलिए,a के लिए प्रतिस्थापित किया जाता है x, b के लिए प्रतिस्थापित किया जाता है y, c के लिए प्रतिस्थापित किया जाता है z तथा d के लिए प्रतिस्थापित किया जाता है m।
जिसका नाम नोटेशन है
नामित संकेतन में, वास्तविक पैरामीटर औपचारिक पैरामीटर के साथ जुड़ा हुआ है जिसका उपयोग किया जाता है arrow symbol ( => )। प्रक्रिया कॉल निम्नलिखित की तरह होगा -
findMin(x => a, y => b, z => c, m => d);
मिश्रित सूचना
मिश्रित संकेतन में, आप दोनों सूचनाओं को प्रक्रिया कॉल में मिला सकते हैं; हालाँकि, स्थिति संकेतन को नाम संकेतन से पहले होना चाहिए।
निम्नलिखित कॉल कानूनी है -
findMin(a, b, c, m => d);
हालाँकि, यह कानूनी नहीं है:
findMin(x => a, b, c, d);
इस अध्याय में, हम PL / SQL में कार्यों पर चर्चा करेंगे। एक फ़ंक्शन एक प्रक्रिया के समान है सिवाय इसके कि यह एक मान लौटाता है। इसलिए, पिछले अध्याय के सभी विचार-विमर्श कार्यों के लिए भी सही हैं।
एक फंक्शन बनाना
का उपयोग करके एक स्टैंडअलोन फ़ंक्शन बनाया जाता है CREATE FUNCTIONबयान। के लिए सरलीकृत वाक्यविन्यासCREATE OR REPLACE PROCEDURE कथन इस प्रकार है -
CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
RETURN return_datatype
{IS | AS}
BEGIN
< function_body >
END [function_name];
कहाँ पे,
function-name फ़ंक्शन का नाम निर्दिष्ट करता है।
[या रिपोर्ट] विकल्प एक मौजूदा फ़ंक्शन के संशोधन की अनुमति देता है।
वैकल्पिक पैरामीटर सूची में नाम, मोड और मापदंडों के प्रकार शामिल हैं। IN उस मान का प्रतिनिधित्व करता है जो बाहर से पारित किया जाएगा और OUT उस पैरामीटर का प्रतिनिधित्व करता है जिसका उपयोग प्रक्रिया के बाहर एक मान लौटाने के लिए किया जाएगा।
फ़ंक्शन में एक होना चाहिए return बयान।
रिटर्न खंड डेटा टाइप आप समारोह से वापस जाने के लिए जा रहे हैं निर्दिष्ट करता है।
फ़ंक्शन-बॉडी में निष्पादन योग्य भाग होता है।
स्टैंडअलोन फ़ंक्शन बनाने के लिए IS कीवर्ड के बजाय AS कीवर्ड का उपयोग किया जाता है।
उदाहरण
निम्न उदाहरण दिखाता है कि कैसे एक स्टैंडअलोन फ़ंक्शन बनाने और कॉल करने के लिए। यह फ़ंक्शन ग्राहकों की तालिका में ग्राहकों की कुल संख्या लौटाता है।
हम ग्राहक तालिका का उपयोग करेंगे, जिसे हमने पीएल / एसक्यूएल वेरिएबल्स अध्याय में बनाया था -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
CREATE OR REPLACE FUNCTION totalCustomers
RETURN number IS
total number(2) := 0;
BEGIN
SELECT count(*) into total
FROM customers;
RETURN total;
END;
/
जब SQL कोड का उपयोग करके उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम देगा -
Function created.
एक समारोह बुला रहा है
एक फ़ंक्शन बनाते समय, आप एक परिभाषा देते हैं कि फ़ंक्शन को क्या करना है। फ़ंक्शन का उपयोग करने के लिए, आपको परिभाषित कार्य करने के लिए उस फ़ंक्शन को कॉल करना होगा। जब कोई प्रोग्राम किसी फ़ंक्शन को कॉल करता है, तो प्रोग्राम कंट्रोल को कॉल किया जाता है।
एक फंक्शन फ़ंक्शन परिभाषित कार्य करता है और जब इसका रिटर्न स्टेटमेंट निष्पादित होता है या जब होता है last end statement पहुँच जाता है, यह कार्यक्रम नियंत्रण को मुख्य कार्यक्रम में वापस कर देता है।
किसी फ़ंक्शन को कॉल करने के लिए, आपको बस फ़ंक्शन नाम के साथ आवश्यक पैरामीटर पास करने की आवश्यकता होती है और यदि फ़ंक्शन एक मान लौटाता है, तो आप लौटे मूल्य को संग्रहीत कर सकते हैं। निम्नलिखित कार्यक्रम फ़ंक्शन को कॉल करता हैtotalCustomers एक अनाम ब्लॉक से -
DECLARE
c number(2);
BEGIN
c := totalCustomers();
dbms_output.put_line('Total no. of Customers: ' || c);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Total no. of Customers: 6
PL/SQL procedure successfully completed.
उदाहरण
निम्नलिखित उदाहरण डिक्लेरिंग, परिभाषित और एक साधारण पीएल / एसक्यूएल फ़ंक्शन को प्रदर्शित करता है जो अधिकतम दो मानों की गणना और रिटर्न करता है।
DECLARE
a number;
b number;
c number;
FUNCTION findMax(x IN number, y IN number)
RETURN number
IS
z number;
BEGIN
IF x > y THEN
z:= x;
ELSE
Z:= y;
END IF;
RETURN z;
END;
BEGIN
a:= 23;
b:= 45;
c := findMax(a, b);
dbms_output.put_line(' Maximum of (23,45): ' || c);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Maximum of (23,45): 45
PL/SQL procedure successfully completed.
PL / SQL पुनरावर्ती कार्य
हमने देखा है कि एक प्रोग्राम या सबप्रोग्राम दूसरे सबप्रोग्राम कह सकता है। जब कोई उपप्रोग्राम स्वयं कॉल करता है, तो उसे पुनरावर्ती कॉल के रूप में संदर्भित किया जाता है और इस प्रक्रिया को इस रूप में जाना जाता हैrecursion।
अवधारणा को स्पष्ट करने के लिए, आइए एक संख्या के भाज्य की गणना करें। संख्या n के गुणन को इस प्रकार परिभाषित किया गया है -
n! = n*(n-1)!
= n*(n-1)*(n-2)!
...
= n*(n-1)*(n-2)*(n-3)... 1
निम्नलिखित कार्यक्रम खुद को पुनरावर्ती कहकर किसी दिए गए संख्या के भाज्य की गणना करता है -
DECLARE
num number;
factorial number;
FUNCTION fact(x number)
RETURN number
IS
f number;
BEGIN
IF x=0 THEN
f := 1;
ELSE
f := x * fact(x-1);
END IF;
RETURN f;
END;
BEGIN
num:= 6;
factorial := fact(num);
dbms_output.put_line(' Factorial '|| num || ' is ' || factorial);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Factorial 6 is 720
PL/SQL procedure successfully completed.
इस अध्याय में, हम PL / SQL में कर्सर पर चर्चा करेंगे। ओरेकल एक मेमोरी क्षेत्र बनाता है, जिसे एसक्यूएल स्टेटमेंट को संसाधित करने के लिए संदर्भ क्षेत्र के रूप में जाना जाता है, जिसमें स्टेटमेंट को संसाधित करने के लिए आवश्यक सभी जानकारी होती है; उदाहरण के लिए, संसाधित पंक्तियों की संख्या आदि।
ए cursorइस संदर्भ क्षेत्र का सूचक है। PL / SQL एक कर्सर के माध्यम से संदर्भ क्षेत्र को नियंत्रित करता है। एक कर्सर SQL स्टेटमेंट द्वारा लौटी पंक्तियों (एक या अधिक) को धारण करता है। कर्सर को रखने वाली पंक्तियों के सेट को कर्सर के रूप में संदर्भित किया जाता हैactive set।
आप एक कर्सर का नाम दे सकते हैं ताकि इसे एक बार में SQL कथन द्वारा लौटाए गए पंक्तियों को लाने और संसाधित करने के लिए एक प्रोग्राम में संदर्भित किया जा सके। दो प्रकार के अभिशाप हैं -
- प्रबल शाप देने वाला
- स्पष्ट श्राप देने वाले
अव्यवस्थित कर्सर
जब भी SQL कथन निष्पादित किया जाता है, तब कथन के लिए कोई स्पष्ट कर्सर नहीं होने पर Implicit कर्सर स्वचालित रूप से Oracle द्वारा बनाए जाते हैं। प्रोग्रामर निहित कर्सर और इसमें जानकारी को नियंत्रित नहीं कर सकते।
जब भी कोई DML कथन (INSERT, UPDATE और DELETE) जारी किया जाता है, तो इस कथन के साथ एक अंतर्निहित कर्सर जुड़ा होता है। INSERT संचालन के लिए, कर्सर डेटा रखता है जिसे सम्मिलित करने की आवश्यकता होती है। अद्यतन और DELETE संचालन के लिए, कर्सर प्रभावित पंक्तियों की पहचान करता है।
PL / SQL में, आप सबसे हाल ही में निहित कर्सर को संदर्भित कर सकते हैं SQL cursor, जिसमें हमेशा गुण होते हैं जैसे कि %FOUND, %ISOPEN, %NOTFOUND, तथा %ROWCOUNT। SQL कर्सर में अतिरिक्त विशेषताएँ हैं,%BULK_ROWCOUNT तथा %BULK_EXCEPTIONSके साथ उपयोग के लिए डिज़ाइन किया गया है FORALLबयान। निम्न तालिका सबसे अधिक इस्तेमाल की जाने वाली विशेषताओं का विवरण प्रदान करती है -
S.No | विशेषता और विवरण |
---|---|
1 | %FOUND यदि कोई INSERT, UPDATE, या DELETE स्टेटमेंट एक या एक से अधिक पंक्तियों को प्रभावित करता है या एक सही इन्टो स्टेटमेंट एक या अधिक पंक्तियों को लौटाता है, तो TRUE लौटाता है। अन्यथा, यह FALSE लौटाता है। |
2 | %NOTFOUND % ध्वनि का तार्किक विपरीत। यदि कोई INSERT, UPDATE, या DELETE विवरण प्रभावित नहीं करता है, तो यह TRUE लौटाता है, या किसी INTO कथन ने इन पंक्तियों को वापस कर दिया है। अन्यथा, यह FALSE लौटाता है। |
3 | %ISOPEN हमेशा अंतर्निहित कर्सर के लिए FALSE लौटाता है, क्योंकि Oracle अपने संबंधित SQL कथन को निष्पादित करने के बाद SQL कर्सर को स्वचालित रूप से बंद कर देता है। |
4 | %ROWCOUNT किसी INSERT, UPDATE, या DELETE स्टेटमेंट से प्रभावित पंक्तियों की संख्या, या SELECT INTO स्टेटमेंट द्वारा लौटाया गया। |
किसी भी SQL कर्सर विशेषता के रूप में पहुँचा जा सकता है sql%attribute_name जैसा कि नीचे उदाहरण में दिखाया गया है।
उदाहरण
हम पिछले तालिका में बनाए गए और उपयोग किए गए ग्राहक तालिका का उपयोग करेंगे।
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
निम्न कार्यक्रम तालिका को अद्यतन करेगा और प्रत्येक ग्राहक के वेतन में 500 से वृद्धि करेगा और उपयोग करेगा SQL%ROWCOUNT प्रभावित पंक्तियों की संख्या निर्धारित करने की विशेषता -
DECLARE
total_rows number(2);
BEGIN
UPDATE customers
SET salary = salary + 500;
IF sql%notfound THEN
dbms_output.put_line('no customers selected');
ELSIF sql%found THEN
total_rows := sql%rowcount;
dbms_output.put_line( total_rows || ' customers selected ');
END IF;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
6 customers selected
PL/SQL procedure successfully completed.
यदि आप ग्राहकों की तालिका में रिकॉर्ड की जांच करते हैं, तो आप पाएंगे कि पंक्तियों को अपडेट किया गया है -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2500.00 |
| 2 | Khilan | 25 | Delhi | 2000.00 |
| 3 | kaushik | 23 | Kota | 2500.00 |
| 4 | Chaitali | 25 | Mumbai | 7000.00 |
| 5 | Hardik | 27 | Bhopal | 9000.00 |
| 6 | Komal | 22 | MP | 5000.00 |
+----+----------+-----+-----------+----------+
स्पष्ट कर्सर
स्पष्ट कर्सर प्रोग्रामर-परिभाषित कर्सर हैं, जो अधिक नियंत्रण प्राप्त करने के लिए हैं context area। एक स्पष्ट कर्सर को पीएल / एसक्यूएल ब्लॉक के घोषणा अनुभाग में परिभाषित किया जाना चाहिए। यह एक सेलेक्ट स्टेटमेंट पर बनाया गया है जो एक से अधिक पंक्ति देता है।
एक स्पष्ट कर्सर बनाने का सिंटैक्स है -
CURSOR cursor_name IS select_statement;
स्पष्ट कर्सर के साथ कार्य करने में निम्नलिखित चरण शामिल हैं -
- मेमोरी को इनिशियलाइज़ करने के लिए कर्सर की घोषणा करना
- मेमोरी को आवंटित करने के लिए कर्सर खोलना
- डेटा पुनर्प्राप्त करने के लिए कर्सर लाना
- आवंटित मेमोरी को जारी करने के लिए कर्सर को बंद करना
Cursor की घोषणा
कर्सर की घोषणा करना कर्सर को एक नाम और संबंधित SELECT स्टेटमेंट के साथ परिभाषित करता है। उदाहरण के लिए -
CURSOR c_customers IS
SELECT id, name, address FROM customers;
कर्सर को खोलना
कर्सर को खोलना कर्सर के लिए मेमोरी आवंटित करता है और इसे एसक्यूएल स्टेटमेंट द्वारा लौटाए गए पंक्तियों को लाने के लिए तैयार करता है। उदाहरण के लिए, हम ऊपर दिए गए परिभाषित कर्सर को निम्नानुसार खोलेंगे -
OPEN c_customers;
कर्सर लाना
कर्सर ले जाने में एक बार में एक पंक्ति तक पहुंचना शामिल है। उदाहरण के लिए, हम ऊपर-खुले कर्सर से पंक्तियाँ इस प्रकार लेंगे -
FETCH c_customers INTO c_id, c_name, c_addr;
कर्सर को बंद करना
कर्सर को बंद करने का मतलब आवंटित मेमोरी को जारी करना है। उदाहरण के लिए, हम उपरोक्त खुले कर्सर को निम्नानुसार बंद करेंगे -
CLOSE c_customers;
उदाहरण
निम्नलिखित स्पष्ट कर्सर और मिनुआ की अवधारणाओं का वर्णन करने के लिए एक पूर्ण उदाहरण है;
DECLARE
c_id customers.id%type;
c_name customer.name%type;
c_addr customers.address%type;
CURSOR c_customers is
SELECT id, name, address FROM customers;
BEGIN
OPEN c_customers;
LOOP
FETCH c_customers into c_id, c_name, c_addr;
EXIT WHEN c_customers%notfound;
dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
END LOOP;
CLOSE c_customers;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
1 Ramesh Ahmedabad
2 Khilan Delhi
3 kaushik Kota
4 Chaitali Mumbai
5 Hardik Bhopal
6 Komal MP
PL/SQL procedure successfully completed.
इस अध्याय में, हम PL / SQL में रिकॉर्ड्स पर चर्चा करेंगे। एrecordएक डेटा संरचना है जो विभिन्न प्रकार के डेटा आइटम धारण कर सकती है। डेटाबेस तालिका की एक पंक्ति के समान रिकॉर्ड में विभिन्न फ़ील्ड शामिल हैं।
उदाहरण के लिए, आप लाइब्रेरी में अपनी पुस्तकों पर नज़र रखना चाहते हैं। आप प्रत्येक पुस्तक के बारे में निम्नलिखित विशेषताओं को ट्रैक करना चाह सकते हैं, जैसे शीर्षक, लेखक, विषय, पुस्तक आईडी। इन मदों में से प्रत्येक के लिए एक क्षेत्र रखने वाला एक रिकॉर्ड एक बुक को एक तार्किक इकाई के रूप में व्यवहार करने की अनुमति देता है और आपको बेहतर तरीके से इसकी जानकारी को व्यवस्थित और प्रतिनिधित्व करने की अनुमति देता है।
PL / SQL निम्नलिखित प्रकार के रिकॉर्ड संभाल सकता है -
- Table-based
- कर्सर-आधारित रिकॉर्ड
- उपयोगकर्ता-परिभाषित रिकॉर्ड
टेबल-आधारित रिकॉर्ड
% ROWTYPE विशेषता प्रोग्रामर को बनाने में सक्षम बनाती है table-based तथा cursorbased रिकॉर्ड।
निम्नलिखित उदाहरण की अवधारणा को दर्शाता है table-basedरिकॉर्ड। हम पिछले अध्यायों में बनाए गए और उपयोग किए गए ग्राहक तालिका का उपयोग करेंगे -
DECLARE
customer_rec customers%rowtype;
BEGIN
SELECT * into customer_rec
FROM customers
WHERE id = 5;
dbms_output.put_line('Customer ID: ' || customer_rec.id);
dbms_output.put_line('Customer Name: ' || customer_rec.name);
dbms_output.put_line('Customer Address: ' || customer_rec.address);
dbms_output.put_line('Customer Salary: ' || customer_rec.salary);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Customer ID: 5
Customer Name: Hardik
Customer Address: Bhopal
Customer Salary: 9000
PL/SQL procedure successfully completed.
Cursor- आधारित रिकॉर्ड्स
निम्नलिखित उदाहरण की अवधारणा को दर्शाता है cursor-basedरिकॉर्ड। हम पिछले अध्यायों में बनाए गए और उपयोग किए गए ग्राहक तालिका का उपयोग करेंगे -
DECLARE
CURSOR customer_cur is
SELECT id, name, address
FROM customers;
customer_rec customer_cur%rowtype;
BEGIN
OPEN customer_cur;
LOOP
FETCH customer_cur into customer_rec;
EXIT WHEN customer_cur%notfound;
DBMS_OUTPUT.put_line(customer_rec.id || ' ' || customer_rec.name);
END LOOP;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
1 Ramesh
2 Khilan
3 kaushik
4 Chaitali
5 Hardik
6 Komal
PL/SQL procedure successfully completed.
उपयोगकर्ता-परिभाषित रिकॉर्ड
पीएल / एसक्यूएल एक उपयोगकर्ता-परिभाषित रिकॉर्ड प्रकार प्रदान करता है जो आपको विभिन्न रिकॉर्ड संरचनाओं को परिभाषित करने की अनुमति देता है। इन अभिलेखों में विभिन्न क्षेत्र शामिल हैं। मान लीजिए कि आप किसी लाइब्रेरी में अपनी पुस्तकों पर नज़र रखना चाहते हैं। आप प्रत्येक पुस्तक के बारे में निम्नलिखित विशेषताओं को ट्रैक करना चाहते हैं -
- Title
- Author
- Subject
- बुक आईडी
एक रिकॉर्ड को परिभाषित करना
रिकॉर्ड प्रकार को इस प्रकार परिभाषित किया गया है -
TYPE
type_name IS RECORD
( field_name1 datatype1 [NOT NULL] [:= DEFAULT EXPRESSION],
field_name2 datatype2 [NOT NULL] [:= DEFAULT EXPRESSION],
...
field_nameN datatypeN [NOT NULL] [:= DEFAULT EXPRESSION);
record-name type_name;
पुस्तक रिकॉर्ड निम्नलिखित तरीके से घोषित किया गया है -
DECLARE
TYPE books IS RECORD
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
खेतों तक पहुँच
किसी रिकॉर्ड के किसी भी क्षेत्र तक पहुँचने के लिए, हम डॉट का उपयोग करते हैं (.)ऑपरेटर। सदस्य एक्सेस ऑपरेटर को रिकॉर्ड चर नाम और उस क्षेत्र के बीच की अवधि के रूप में कोडित किया जाता है जिसे हम एक्सेस करना चाहते हैं। निम्नलिखित रिकॉर्ड के उपयोग की व्याख्या करने के लिए एक उदाहरण है -
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Print book 1 record
dbms_output.put_line('Book 1 title : '|| book1.title);
dbms_output.put_line('Book 1 author : '|| book1.author);
dbms_output.put_line('Book 1 subject : '|| book1.subject);
dbms_output.put_line('Book 1 book_id : ' || book1.book_id);
-- Print book 2 record
dbms_output.put_line('Book 2 title : '|| book2.title);
dbms_output.put_line('Book 2 author : '|| book2.author);
dbms_output.put_line('Book 2 subject : '|| book2.subject);
dbms_output.put_line('Book 2 book_id : '|| book2.book_id);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
PL/SQL procedure successfully completed.
सबप्रोग्राम पैरामीटर के रूप में रिकॉर्ड
जैसे ही आप किसी अन्य चर को पास करते हैं, आप सबप्रोग्राम पैरामीटर के रूप में एक रिकॉर्ड पारित कर सकते हैं। आप रिकॉर्ड फ़ील्ड को उसी तरह एक्सेस कर सकते हैं जैसे आपने उपरोक्त उदाहरण में एक्सेस किया है -
DECLARE
type books is record
(title varchar(50),
author varchar(50),
subject varchar(100),
book_id number);
book1 books;
book2 books;
PROCEDURE printbook (book books) IS
BEGIN
dbms_output.put_line ('Book title : ' || book.title);
dbms_output.put_line('Book author : ' || book.author);
dbms_output.put_line( 'Book subject : ' || book.subject);
dbms_output.put_line( 'Book book_id : ' || book.book_id);
END;
BEGIN
-- Book 1 specification
book1.title := 'C Programming';
book1.author := 'Nuha Ali ';
book1.subject := 'C Programming Tutorial';
book1.book_id := 6495407;
-- Book 2 specification
book2.title := 'Telecom Billing';
book2.author := 'Zara Ali';
book2.subject := 'Telecom Billing Tutorial';
book2.book_id := 6495700;
-- Use procedure to print book info
printbook(book1);
printbook(book2);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
PL/SQL procedure successfully completed.
इस अध्याय में, हम PL / SQL में अपवादों पर चर्चा करेंगे। एक अपवाद एक कार्यक्रम के निष्पादन के दौरान एक त्रुटि स्थिति है। पीएल / एसक्यूएल प्रोग्रामर का उपयोग करके ऐसी स्थितियों को पकड़ने के लिए समर्थन करता हैEXCEPTIONकार्यक्रम में ब्लॉक और त्रुटि की स्थिति के खिलाफ एक उचित कार्रवाई की जाती है। दो प्रकार के अपवाद हैं -
- सिस्टम-परिभाषित अपवाद
- उपयोगकर्ता-परिभाषित अपवाद
अपवाद हैंडलिंग के लिए सिंटैक्स
अपवाद हैंडलिंग के लिए सामान्य वाक्यविन्यास निम्नानुसार है। यहां आप उतने अपवादों को सूचीबद्ध कर सकते हैं जितना आप संभाल सकते हैं। डिफ़ॉल्ट अपवाद का उपयोग करके नियंत्रित किया जाएगाWHEN others THEN -
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
उदाहरण
हमें अवधारणा को समझाने के लिए एक कोड लिखें। हम पिछले अध्यायों में बनाए गए और उपयोग किए गए ग्राहक तालिका का उपयोग करेंगे -
DECLARE
c_id customers.id%type := 8;
c_name customerS.Name%type;
c_addr customers.address%type;
BEGIN
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
No such customer!
PL/SQL procedure successfully completed.
उपरोक्त कार्यक्रम एक ग्राहक का नाम और पता प्रदर्शित करता है जिसकी आईडी दी गई है। चूंकि हमारे डेटाबेस में आईडी मान 8 के साथ कोई ग्राहक नहीं है, इसलिए कार्यक्रम रन-टाइम अपवाद को बढ़ाता हैNO_DATA_FOUND, जिस पर कब्जा कर लिया गया है EXCEPTION block।
अपवाद उठाना
जब भी कोई आंतरिक डेटाबेस त्रुटि होती है, तो डेटाबेस सर्वर द्वारा अपवाद स्वचालित रूप से उठाए जाते हैं, लेकिन कमांडर द्वारा कमांड का उपयोग करके अपवाद स्पष्ट रूप से उठाए जा सकते हैं RAISE। निम्नलिखित एक अपवाद को बढ़ाने के लिए सरल वाक्यविन्यास है -
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
statement;
END;
आप उपरोक्त सिंटैक्स का उपयोग Oracle मानक अपवाद या किसी भी उपयोगकर्ता-परिभाषित अपवाद को बढ़ाने में कर सकते हैं। अगले भाग में, हम आपको उपयोगकर्ता द्वारा परिभाषित अपवाद को बढ़ाने पर एक उदाहरण देंगे। आप Oracle मानक अपवादों को समान तरीके से उठा सकते हैं।
उपयोगकर्ता-परिभाषित अपवाद
पीएल / एसक्यूएल आपको अपने स्वयं के अपवादों को अपने कार्यक्रम की आवश्यकता के अनुसार परिभाषित करने की अनुमति देता है। एक उपयोगकर्ता-परिभाषित अपवाद घोषित किया जाना चाहिए और फिर RAISE स्टेटमेंट या प्रक्रिया का उपयोग करके स्पष्ट रूप से उठाया जाना चाहिएDBMS_STANDARD.RAISE_APPLICATION_ERROR।
अपवाद घोषित करने का सिंटैक्स है -
DECLARE
my-exception EXCEPTION;
उदाहरण
निम्नलिखित उदाहरण अवधारणा को दर्शाता है। यह प्रोग्राम ग्राहक आईडी के लिए पूछता है, जब उपयोगकर्ता एक अमान्य आईडी, अपवाद दर्ज करता हैinvalid_id उठाया है।
DECLARE
c_id customers.id%type := &cc_id;
c_name customerS.Name%type;
c_addr customers.address%type;
-- user defined exception
ex_invalid_id EXCEPTION;
BEGIN
IF c_id <= 0 THEN
RAISE ex_invalid_id;
ELSE
SELECT name, address INTO c_name, c_addr
FROM customers
WHERE id = c_id;
DBMS_OUTPUT.PUT_LINE ('Name: '|| c_name);
DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr);
END IF;
EXCEPTION
WHEN ex_invalid_id THEN
dbms_output.put_line('ID must be greater than zero!');
WHEN no_data_found THEN
dbms_output.put_line('No such customer!');
WHEN others THEN
dbms_output.put_line('Error!');
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Enter value for cc_id: -6 (let's enter a value -6)
old 2: c_id customers.id%type := &cc_id;
new 2: c_id customers.id%type := -6;
ID must be greater than zero!
PL/SQL procedure successfully completed.
पूर्व-परिभाषित अपवाद
पीएल / एसक्यूएल कई पूर्व-परिभाषित अपवाद प्रदान करता है, जो किसी प्रोग्राम द्वारा किसी डेटाबेस नियम का उल्लंघन किए जाने पर निष्पादित किए जाते हैं। उदाहरण के लिए, पूर्वनिर्धारित अपवाद NO_DATA_FOUND तब उठाया जाता है जब एक SELECT INTO स्टेटमेंट कोई पंक्तियाँ नहीं लौटाता है। निम्न तालिका कुछ पूर्व-परिभाषित अपवादों को सूचीबद्ध करती है -
अपवाद | Oracle त्रुटि | SQLCODE | विवरण |
---|---|---|---|
ACCESS_INTO_NULL | 06530 | -6530 | यह तब उठाया जाता है जब एक अशक्त वस्तु को स्वचालित रूप से एक मान दिया जाता है। |
CASE_NOT_FOUND | 06,592 | -6592 | यह तब उठाया जाता है जब CASE स्टेटमेंट के WHEN क्लॉज में कोई भी विकल्प नहीं चुना जाता है, और कोई ELSE क्लॉज नहीं होता है। |
COLLECTION_IS_NULL | 06,531 | -6531 | इसे तब उठाया जाता है जब कोई प्रोग्राम किसी अनइंस्टॉलिज्ड नेस्टेड टेबल या वेरिएंट के अलावा EXISTS के अलावा अन्य कलेक्शन के तरीकों को लागू करने का प्रयास करता है, या प्रोग्राम किसी अनइंस्टाल्यूटेड नेस्टेड टेबल या वेरिए के तत्वों को मान देने का प्रयास करता है। |
DUP_VAL_ON_INDEX | 00001 | -1 | इसे तब उठाया जाता है जब डुप्लिकेट मानों को अनन्य अनुक्रमणिका वाले स्तंभ में संग्रहीत करने का प्रयास किया जाता है। |
INVALID_CURSOR | 01001 | -1001 | यह तब उठाया जाता है जब एक कर्सर ऑपरेशन करने की कोशिश की जाती है जिसे अनुमति नहीं दी जाती है, जैसे कि एक अनपेक्षित कर्सर को बंद करना। |
अमान्य संख्या | 01,722 | -1722 | यह तब उठाया जाता है जब किसी वर्ण स्ट्रिंग का संख्या में रूपांतरण विफल हो जाता है क्योंकि स्ट्रिंग एक मान्य संख्या का प्रतिनिधित्व नहीं करती है। |
LOGIN_DENIED | 01017 | -1017 | यह तब उठाया जाता है जब कोई प्रोग्राम किसी अमान्य उपयोगकर्ता नाम या पासवर्ड के साथ डेटाबेस पर लॉग ऑन करने का प्रयास करता है। |
कोई डेटा नहीं मिला | 01403 | +100 | इसे तब चुना जाता है जब कोई SELECT INTO स्टेटमेंट कोई पंक्तियाँ नहीं लौटाता। |
NOT_LOGGED_ON | 01012 | -1012 | डेटाबेस से कनेक्ट किए बिना डेटाबेस कॉल जारी किए जाने पर इसे उठाया जाता है। |
PROGRAM_ERROR | 06,501 | -6501 | यह तब उठाया जाता है जब PL / SQL में आंतरिक समस्या होती है। |
ROWTYPE_MISMATCH | 06504 | -6504 | यह तब उठाया जाता है जब एक कर्सर असंगत डेटा प्रकार वाले चर में मूल्य प्राप्त करता है। |
SELF_IS_NULL | 30,625 | -30,625 | यह तब उठाया जाता है जब कोई सदस्य विधि लागू की जाती है, लेकिन ऑब्जेक्ट प्रकार का उदाहरण प्रारंभिक नहीं था। |
STORAGE_ERROR | 06,500 | -6500 | यह तब उठाया जाता है जब पीएल / एसक्यूएल मेमोरी से बाहर हो गया या मेमोरी दूषित हो गई थी। |
TOO_MANY_ROWS | 01,422 | -1422 | यह तब उठाया जाता है जब एक SELECT INTO स्टेटमेंट एक से अधिक पंक्ति में लौटता है। |
VALUE_ERROR | 06,502 | -6502 | यह तब उठाया जाता है जब एक अंकगणित, रूपांतरण, ट्रंकेशन या सिज़ेकोस्ट्रैटिन त्रुटि होती है। |
ZERO_DIVIDE | 01476 | 1476 | यह तब उठाया जाता है जब किसी संख्या को शून्य से विभाजित करने का प्रयास किया जाता है। |
इस अध्याय में, हम PL / SQL में ट्रिगर पर चर्चा करेंगे। ट्रिगर संग्रहीत प्रोग्राम हैं, जो कुछ घटनाओं के होने पर स्वचालित रूप से निष्पादित या निकाल दिए जाते हैं। ट्रिगर, वास्तव में, निम्न में से किसी भी घटना के जवाब में निष्पादित किए जाने के लिए लिखे गए हैं -
ए database manipulation (DML) कथन (DELETE, INSERT, या अद्यतन)
ए database definition (DDL) कथन (सृजन, परिवर्तन, या ड्रॉप)।
ए database operation (सर्वर, लोगो, लोगो, STARTUP, या SHUTDOWN)।
ट्रिगर को तालिका, दृश्य, स्कीमा या डेटाबेस से परिभाषित किया जा सकता है जिसके साथ घटना जुड़ी हुई है।
ट्रिगर के लाभ
ट्रिगर को निम्नलिखित उद्देश्यों के लिए लिखा जा सकता है -
- स्वचालित रूप से कुछ व्युत्पन्न स्तंभ मान उत्पन्न करना
- संदर्भात्मक अखंडता को लागू करना
- टेबल प्रवेश पर सूचना लॉगिंग और भंडारण की जानकारी
- Auditing
- तालिकाओं की तुल्यकालिक प्रतिकृति
- सुरक्षा प्राधिकरणों का निपटान
- अमान्य लेनदेन को रोकना
ट्रिगर बनाना
ट्रिगर बनाने का सिंटैक्स है -
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
Declaration-statements
BEGIN
Executable-statements
EXCEPTION
Exception-handling-statements
END;
कहाँ पे,
बनाएँ [या उत्तर] ट्रिगर ट्रिगर_नाम - एक मौजूदा ट्रिगर को ट्रिगर_नाम के साथ बनाता है या बदलता है ।
{पहले से | AFTER | INSTEAD OF} - यह तब निर्दिष्ट करता है जब ट्रिगर निष्पादित किया जाएगा। INSTEAD OF clause का उपयोग व्यू पर ट्रिगर बनाने के लिए किया जाता है।
{INSERT [OR] | अद्यतन [या] | DELETE} - यह DML ऑपरेशन को निर्दिष्ट करता है।
[Of col_name] - यह कॉलम नाम निर्दिष्ट करता है जिसे अपडेट किया जाएगा।
[On table_name] - यह ट्रिगर से जुड़ी तालिका का नाम निर्दिष्ट करता है।
[REFERENCING OLD AS o NEW AS n] - यह आपको विभिन्न DML कथनों, जैसे INSERT, UPDATE, और DELETE के लिए नए और पुराने मूल्यों को संदर्भित करने की अनुमति देता है।
[प्रत्येक पंक्ति के लिए] - यह एक पंक्ति-स्तरीय ट्रिगर निर्दिष्ट करता है, अर्थात, प्रत्येक पंक्ति को प्रभावित होने पर ट्रिगर निष्पादित किया जाएगा। अन्यथा SQL कथन निष्पादित होने पर ट्रिगर केवल एक बार निष्पादित होगा, जिसे टेबल स्तर ट्रिगर कहा जाता है।
WHEN (कंडीशन) - यह उन पंक्तियों के लिए एक शर्त प्रदान करता है जिसके लिए ट्रिगर आग होगा। यह क्लॉज केवल पंक्ति-स्तरीय ट्रिगर्स के लिए मान्य है।
उदाहरण
आरंभ करने के लिए, हम पिछले अध्यायों में बनाए गए और उपयोग किए गए ग्राहक तालिका का उपयोग करेंगे -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
निम्नलिखित कार्यक्रम एक बनाता है row-levelउन ग्राहकों की तालिका के लिए ट्रिगर जो INSERT या UPDATE या DELETE संचालन के लिए आग करेंगे, जिन्होंने CUSTOMERS तालिका पर प्रदर्शन किया था। यह ट्रिगर पुराने मूल्यों और नए मूल्यों के बीच वेतन अंतर को प्रदर्शित करेगा -
CREATE OR REPLACE TRIGGER display_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON customers
FOR EACH ROW
WHEN (NEW.ID > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :NEW.salary - :OLD.salary;
dbms_output.put_line('Old salary: ' || :OLD.salary);
dbms_output.put_line('New salary: ' || :NEW.salary);
dbms_output.put_line('Salary difference: ' || sal_diff);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Trigger created.
निम्नलिखित बिंदुओं पर यहां विचार करने की आवश्यकता है -
ओएलडी और नए संदर्भ टेबल-स्तरीय ट्रिगर्स के लिए उपलब्ध नहीं हैं, बल्कि आप उन्हें रिकॉर्ड-लेवल ट्रिगर्स के लिए उपयोग कर सकते हैं।
यदि आप तालिका को उसी ट्रिगर में क्वेरी करना चाहते हैं, तो आपको AFTER कीवर्ड का उपयोग करना चाहिए, क्योंकि ट्रिगर तालिका को क्वेरी कर सकते हैं या इसे फिर से बदल सकते हैं केवल प्रारंभिक परिवर्तन लागू होने के बाद और तालिका एक सुसंगत स्थिति में वापस आ जाती है।
उपरोक्त ट्रिगर इस तरह से लिखा गया है कि यह टेबल पर किसी भी DELETE या INSERT या UPDATE ऑपरेशन से पहले फायर करेगा, लेकिन आप अपने ट्रिगर को एक या एक से अधिक ऑपरेशन्स पर लिख सकते हैं, उदाहरण के लिए BEFORE DELETE, जब भी रिकॉर्ड में आग लगेगी तालिका पर DELETE कार्रवाई का उपयोग करके हटा दिया जाएगा।
ट्रिगर को ट्रिगर करना
चलिए CUSTOMERS टेबल पर कुछ DML ऑपरेशन करते हैं। यहां एक INSERT स्टेटमेंट है, जो तालिका में एक नया रिकॉर्ड बनाएगा -
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Kriti', 22, 'HP', 7500.00 );
जब CUSTOMERS तालिका में एक रिकॉर्ड बनाया जाता है, तो उपरोक्त ट्रिगर बनाता है, display_salary_changes निकाल दिया जाएगा और यह निम्नलिखित परिणाम प्रदर्शित करेगा -
Old salary:
New salary: 7500
Salary difference:
क्योंकि यह एक नया रिकॉर्ड है, पुराना वेतन उपलब्ध नहीं है और उपरोक्त परिणाम शून्य है। चलिए अब CUSTOMERS टेबल पर एक और DML ऑपरेशन करते हैं। अद्यतन विवरण तालिका में मौजूदा रिकॉर्ड को अद्यतन करेगा -
UPDATE customers
SET salary = salary + 500
WHERE id = 2;
जब एक रिकॉर्ड ग्राहक तालिका में अद्यतन किया जाता है, तो उपरोक्त ट्रिगर बनाता है, display_salary_changes निकाल दिया जाएगा और यह निम्नलिखित परिणाम प्रदर्शित करेगा -
Old salary: 1500
New salary: 2000
Salary difference: 500
इस अध्याय में, हम PL / SQL में संकुल पर चर्चा करेंगे। पैकेज स्कीमा ऑब्जेक्ट हैं जो समूह तार्किक रूप से PL / SQL प्रकार, चर और उपप्रोग्राम से संबंधित होते हैं।
एक पैकेज में दो अनिवार्य भाग होंगे -
- पैकेज विनिर्देश
- पैकेज बॉडी या परिभाषा
पैकेज विशिष्टता
विनिर्देश पैकेज का इंटरफ़ेस है। यह बिल्कुलDECLARESप्रकार, चर, स्थिरांक, अपवाद, शाप और उपप्रोग्राम जो पैकेज के बाहर से संदर्भित किए जा सकते हैं। दूसरे शब्दों में, इसमें पैकेज की सामग्री के बारे में सभी जानकारी होती है, लेकिन उपप्रोग्राम के लिए कोड को शामिल नहीं करता है।
विनिर्देश में रखी गई सभी वस्तुओं को कहा जाता है publicवस्तुओं। कोई भी उपप्रोग्राम पैकेज विनिर्देश में नहीं है, लेकिन पैकेज निकाय में कोडित को कहा जाता हैprivate वस्तु।
निम्न कोड स्निपेट एक एकल प्रक्रिया वाले पैकेज विनिर्देश दिखाता है। आपके पास कई वैश्विक चर और पैकेज के अंदर कई प्रक्रियाएं या कार्य हो सकते हैं।
CREATE PACKAGE cust_sal AS
PROCEDURE find_sal(c_id customers.id%type);
END cust_sal;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Package created.
पैकेज बॉडी
पैकेज बॉडी में पैकेज विनिर्देश और अन्य निजी घोषणाओं में घोषित विभिन्न तरीकों के कोड होते हैं, जो पैकेज के बाहर कोड से छिपे होते हैं।
CREATE PACKAGE BODYस्टेटमेंट का उपयोग पैकेज बॉडी बनाने के लिए किया जाता है। निम्नलिखित कोड स्निपेट पैकेज बॉडी घोषणा को दर्शाता हैcust_salपैकेज ऊपर बनाया गया। मैंने मान लिया कि हमारे पास पहले से ही हमारे डेटाबेस में निर्मित ग्राहक तालिका है जैसा कि पीएल / एसक्यूएल - वेरिएबल्स अध्याय में उल्लेख किया गया है ।
CREATE OR REPLACE PACKAGE BODY cust_sal AS
PROCEDURE find_sal(c_id customers.id%TYPE) IS
c_sal customers.salary%TYPE;
BEGIN
SELECT salary INTO c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line('Salary: '|| c_sal);
END find_sal;
END cust_sal;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Package body created.
पैकेज तत्वों का उपयोग करना
पैकेज तत्वों (चर, प्रक्रिया या कार्य) को निम्नलिखित सिंटैक्स के साथ एक्सेस किया जाता है -
package_name.element_name;
गौर करें, हमने पहले ही अपने डेटाबेस स्कीमा में उपरोक्त पैकेज बनाया है, निम्न प्रोग्राम का उपयोग करता है find_sal की विधि cust_sal पैकेज -
DECLARE
code customers.id%type := &cc_id;
BEGIN
cust_sal.find_sal(code);
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह ग्राहक आईडी दर्ज करने का संकेत देता है और जब आप एक आईडी दर्ज करते हैं, तो यह निम्न वेतन को निम्नानुसार प्रदर्शित करता है -
Enter value for cc_id: 1
Salary: 3000
PL/SQL procedure successfully completed.
उदाहरण
निम्न प्रोग्राम एक अधिक पूर्ण पैकेज प्रदान करता है। हम निम्नलिखित अभिलेखों के साथ हमारे डेटाबेस में संग्रहीत ग्राहक तालिका का उपयोग करेंगे -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 3000.00 |
| 2 | Khilan | 25 | Delhi | 3000.00 |
| 3 | kaushik | 23 | Kota | 3000.00 |
| 4 | Chaitali | 25 | Mumbai | 7500.00 |
| 5 | Hardik | 27 | Bhopal | 9500.00 |
| 6 | Komal | 22 | MP | 5500.00 |
+----+----------+-----+-----------+----------+
पैकेज विशिष्टता
CREATE OR REPLACE PACKAGE c_package AS
-- Adds a customer
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type);
-- Removes a customer
PROCEDURE delCustomer(c_id customers.id%TYPE);
--Lists all customers
PROCEDURE listCustomer;
END c_package;
/
जब SQL कोड में उपरोक्त कोड निष्पादित किया जाता है, तो यह उपरोक्त पैकेज बनाता है और निम्न परिणाम प्रदर्शित करता है -
Package created.
पैकेज बॉडी बनाना
CREATE OR REPLACE PACKAGE BODY c_package AS
PROCEDURE addCustomer(c_id customers.id%type,
c_name customerS.No.ame%type,
c_age customers.age%type,
c_addr customers.address%type,
c_sal customers.salary%type)
IS
BEGIN
INSERT INTO customers (id,name,age,address,salary)
VALUES(c_id, c_name, c_age, c_addr, c_sal);
END addCustomer;
PROCEDURE delCustomer(c_id customers.id%type) IS
BEGIN
DELETE FROM customers
WHERE id = c_id;
END delCustomer;
PROCEDURE listCustomer IS
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list is TABLE OF customers.Name%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter));
END LOOP;
END listCustomer;
END c_package;
/
उपरोक्त उदाहरण का उपयोग करता है nested table। हम अगले अध्याय में नेस्टेड टेबल की अवधारणा पर चर्चा करेंगे।
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Package body created.
पैकेज का उपयोग करना
निम्न प्रोग्राम पैकेज c_package में घोषित और परिभाषित विधियों का उपयोग करता है ।
DECLARE
code customers.id%type:= 8;
BEGIN
c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500);
c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500);
c_package.listcustomer;
c_package.delcustomer(code);
c_package.listcustomer;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
Customer(8): Subham
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
Customer(7): Rajnish
PL/SQL procedure successfully completed
इस अध्याय में, हम PL / SQL में संग्रह की चर्चा करेंगे। एक संग्रह एक समान डेटा प्रकार वाले तत्वों का एक आदेशित समूह है। प्रत्येक तत्व को एक अद्वितीय सबस्क्रिप्ट द्वारा पहचाना जाता है जो संग्रह में अपनी स्थिति का प्रतिनिधित्व करता है।
PL / SQL तीन संग्रह प्रकार प्रदान करता है -
- सूचकांक-द्वारा तालिकाओं या साहचर्य सरणी
- नेस्टेड टेबल
- चर-आकार की सरणी या वर्रे
ओरेकल प्रलेखन प्रत्येक प्रकार के संग्रह के लिए निम्नलिखित विशेषताएं प्रदान करता है -
संग्रह का प्रकार | तत्वों की संख्या | सदस्यता प्रकार | घना या विरल | जहाँ बनाया गया | वस्तु प्रकार गुण हो सकते हैं |
---|---|---|---|---|---|
साहचर्य सरणी (या अनुक्रमणिका-तालिका) | असीम | स्ट्रिंग या पूर्णांक | भी | केवल PL / SQL ब्लॉक में | नहीं |
नेस्टेड टेबल | असीम | पूर्णांक | घना शुरू होता है, विरल बन सकता है | या तो पीएल / एसक्यूएल ब्लॉक में या स्कीमा स्तर पर | हाँ |
चर (वर्ण) | घिरे | पूर्णांक | हमेशा घना | या तो पीएल / एसक्यूएल ब्लॉक में या स्कीमा स्तर पर | हाँ |
हम पहले ही अध्याय में विचरण पर चर्चा कर चुके हैं 'PL/SQL arrays'। इस अध्याय में, हम PL / SQL तालिकाओं पर चर्चा करेंगे।
दोनों प्रकार के PL / SQL टेबल, अर्थात, अनुक्रमणिका द्वारा तालिकाओं और नेस्टेड तालिकाओं में समान संरचना होती है और उनकी पंक्तियों को सबस्क्रिप्ट नोटेशन का उपयोग करके एक्सेस किया जाता है। हालाँकि, ये दो प्रकार की टेबल एक पहलू में भिन्न होती हैं; नेस्टेड तालिकाओं को एक डेटाबेस कॉलम में संग्रहीत किया जा सकता है और इंडेक्स-बाय टेबल नहीं कर सकते हैं।
सूचकांक-द्वारा तालिका
एक index-by तालिका (जिसे एक भी कहा जाता है associative array) का एक सेट है key-valueजोड़े। प्रत्येक कुंजी अद्वितीय है और इसी मूल्य का पता लगाने के लिए उपयोग किया जाता है। कुंजी या तो पूर्णांक या एक स्ट्रिंग हो सकती है।
अनुक्रमणिका-द्वारा तालिका निम्न सिंटैक्स का उपयोग करके बनाई गई है। यहाँ, हम एक बना रहे हैंindex-by नाम की मेज table_nameजिनमें से चाबियाँ सबस्क्रिप्ट_टाइप और संबद्ध मानों की होंगी, एलिमेंट_टाइप की होंगी
TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type;
table_name type_name;
उदाहरण
निम्नलिखित उदाहरण दिखाता है कि नामों के साथ पूर्णांक मानों को संग्रहीत करने के लिए एक तालिका कैसे बनाई जाए और बाद में यह नामों की एक ही सूची प्रिंट करता है।
DECLARE
TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20);
salary_list salary;
name VARCHAR2(20);
BEGIN
-- adding elements to the table
salary_list('Rajnish') := 62000;
salary_list('Minakshi') := 75000;
salary_list('Martin') := 100000;
salary_list('James') := 78000;
-- printing the table
name := salary_list.FIRST;
WHILE name IS NOT null LOOP
dbms_output.put_line
('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name)));
name := salary_list.NEXT(name);
END LOOP;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Salary of James is 78000
Salary of Martin is 100000
Salary of Minakshi is 75000
Salary of Rajnish is 62000
PL/SQL procedure successfully completed.
उदाहरण
इंडेक्स-बाय टेबल के तत्व भी हो सकते हैं %ROWTYPE किसी भी डेटाबेस तालिका या %TYPEकिसी भी डेटाबेस तालिका क्षेत्र के। निम्नलिखित उदाहरण अवधारणा को दर्शाता है। हम उपयोग करेंगेCUSTOMERS हमारे डेटाबेस में संग्रहीत तालिका -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
select name from customers;
TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer;
name_list c_list;
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter));
END LOOP;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed
नेस्टेड टेबल
ए nested tableतत्वों की एक मनमानी संख्या के साथ एक आयामी सरणी की तरह है। हालाँकि, एक नेस्टेड तालिका निम्नलिखित पहलुओं में एक सरणी से भिन्न होती है -
एक सरणी में तत्वों की एक घोषित संख्या होती है, लेकिन एक नेस्टेड तालिका नहीं होती है। नेस्टेड टेबल का आकार गतिशील रूप से बढ़ सकता है।
एक सरणी सदैव सघन होती है, अर्थात इसमें सदैव निरंतर अंश होते हैं। एक नेस्टेड सरणी शुरू में घनी होती है, लेकिन तत्वों से इसे हटाए जाने पर यह विरल हो सकता है।
एक नेस्टेड तालिका निम्नलिखित सिंटैक्स का उपयोग करके बनाई गई है -
TYPE type_name IS TABLE OF element_type [NOT NULL];
table_name type_name;
यह घोषणा ए की घोषणा के समान है index-by टेबल, लेकिन वहाँ नहीं है INDEX BY खंड।
एक नेस्टेड तालिका को डेटाबेस कॉलम में संग्रहीत किया जा सकता है। यह आगे SQL संचालन को आसान बनाने के लिए इस्तेमाल किया जा सकता है जहाँ आप एक बड़ी तालिका के साथ एकल-स्तंभ तालिका में शामिल होते हैं। डेटाबेस में एक सहयोगी सरणी संग्रहीत नहीं की जा सकती।
उदाहरण
निम्नलिखित उदाहरण नेस्टेड टेबल के उपयोग का वर्णन करते हैं -
DECLARE
TYPE names_table IS TABLE OF VARCHAR2(10);
TYPE grades IS TABLE OF INTEGER;
names names_table;
marks grades;
total integer;
BEGIN
names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
marks:= grades(98, 97, 78, 87, 92);
total := names.count;
dbms_output.put_line('Total '|| total || ' Students');
FOR i IN 1 .. total LOOP
dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
end loop;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Total 5 Students
Student:Kavita, Marks:98
Student:Pritam, Marks:97
Student:Ayan, Marks:78
Student:Rishav, Marks:87
Student:Aziz, Marks:92
PL/SQL procedure successfully completed.
उदाहरण
के तत्व nested table भी हो सकता है %ROWTYPEकिसी भी डेटाबेस तालिका या किसी भी डेटाबेस तालिका क्षेत्र के% प्रकार के। निम्नलिखित उदाहरण अवधारणा को दर्शाता है। हम अपने डेटाबेस में संग्रहीत ग्राहक तालिका का उपयोग निम्नानुसार करेंगे -
Select * from customers;
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+
DECLARE
CURSOR c_customers is
SELECT name FROM customers;
TYPE c_list IS TABLE of customerS.No.ame%type;
name_list c_list := c_list();
counter integer :=0;
BEGIN
FOR n IN c_customers LOOP
counter := counter +1;
name_list.extend;
name_list(counter) := n.name;
dbms_output.put_line('Customer('||counter||'):'||name_list(counter));
END LOOP;
END;
/
जब एसक्यूएल प्रॉम्प्ट पर उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Customer(1): Ramesh
Customer(2): Khilan
Customer(3): kaushik
Customer(4): Chaitali
Customer(5): Hardik
Customer(6): Komal
PL/SQL procedure successfully completed.
संग्रह के तरीके
PL / SQL बिल्ट-इन कलेक्शन मेथड्स प्रदान करता है जो संग्रह को उपयोग में आसान बनाते हैं। निम्न तालिका विधियों और उनके उद्देश्य को सूचीबद्ध करती है -
S.No | विधि का नाम और उद्देश्य |
---|---|
1 | EXISTS(n) यदि संग्रह में nth तत्व मौजूद है, तो TRUE लौटाता है; अन्यथा FALSE देता है। |
2 | COUNT वर्तमान में संग्रहित तत्वों की संख्या लौटाता है। |
3 | LIMIT एक संग्रह के अधिकतम आकार की जाँच करता है। |
4 | FIRST पूर्णांक में पहले (सबसे छोटे) अनुक्रमणिका संख्याओं को देता है जो पूर्णांक सदस्यता का उपयोग करता है। |
5 | LAST पूर्णांक सदस्यता का उपयोग करने वाले संग्रह में अंतिम (सबसे बड़ा) अनुक्रमणिका संख्या देता है। |
6 | PRIOR(n) एक n संग्रह में सूचकांक n से पहले सूचकांक संख्या लौटाता है। |
7 | NEXT(n) अनुक्रमणिका संख्या लौटाता है जो अनुक्रमणिका n को सफल करता है। |
8 | EXTEND एक संग्रह के लिए एक अशक्त तत्व को लागू करता है। |
9 | EXTEND(n) एक संग्रह के लिए n अशक्त तत्वों को लागू करता है। |
10 | EXTEND(n,i) संलग्न कर देता है nएक संग्रह में i वें तत्व की प्रतियां । |
1 1 | TRIM एक संग्रह के अंत से एक तत्व निकालता है। |
12 | TRIM(n) हटा देगा n एक संग्रह के अंत से तत्व। |
13 | DELETE किसी संग्रह से सभी तत्वों को निकालता है, COUNT को 0 पर सेट करता है। |
14 | DELETE(n) निकालता है nthएक संख्यात्मक कुंजी या एक नेस्टेड तालिका के साथ एक सहयोगी सरणी से तत्व। यदि साहचर्य सरणी में स्ट्रिंग कुंजी है, तो कुंजी मान के अनुरूप तत्व हटा दिया जाता है। अगरn शून्य है, DELETE(n) कुछ नहीं करता। |
15 | DELETE(m,n) श्रेणी के सभी तत्वों को निकालता है m..nएक सहयोगी सरणी या नेस्टेड तालिका से। अगरm से बड़ा है n या अगर m या n शून्य है, DELETE(m,n) कुछ नहीं करता। |
संग्रह के अपवाद
निम्न तालिका संग्रह अपवाद प्रदान करती है और जब वे उठाए जाते हैं -
संग्रह अपवाद | स्थिति में उठाया |
---|---|
COLLECTION_IS_NULL | आप एक परमाणु शून्य संग्रह पर काम करने की कोशिश करते हैं। |
कोई डेटा नहीं मिला | एक सबस्क्रिप्ट एक तत्व को हटाता है, जो हटा दिया गया था, या साहचर्य सरणी का कोई नहीं तत्व। |
SUBSCRIPT_BEYOND_COUNT | एक सबस्क्रिप्ट एक संग्रह में तत्वों की संख्या से अधिक है। |
SUBSCRIPT_OUTSIDE_LIMIT | एक सबस्क्रिप्ट अनुमत सीमा के बाहर है। |
VALUE_ERROR | एक सबस्क्रिप्ट कुंजी प्रकार के लिए शून्य या परिवर्तनीय नहीं है। यह अपवाद तब हो सकता है जब कुंजी को ए के रूप में परिभाषित किया गया होPLS_INTEGER रेंज, और सबस्क्रिप्ट इस सीमा के बाहर है। |
इस अध्याय में, हम PL / SQL में लेनदेन पर चर्चा करेंगे। एक डेटाबेसtransactionकाम की एक परमाणु इकाई है जिसमें एक या एक से अधिक संबंधित SQL कथन हो सकते हैं। इसे परमाणु कहा जाता है क्योंकि SQL कथनों द्वारा लेन-देन का गठन करने वाले डेटाबेस संशोधनों को सामूहिक रूप से या तो प्रतिबद्ध किया जा सकता है, अर्थात डेटाबेस से स्थायी किया जाता है या डेटाबेस से वापस (पूर्ववत) किया जाता है।
सफलतापूर्वक निष्पादित SQL कथन और प्रतिबद्ध लेनदेन समान नहीं हैं। यहां तक कि अगर एक एसक्यूएल स्टेटमेंट को सफलतापूर्वक निष्पादित किया जाता है, जब तक कि स्टेटमेंट वाले लेनदेन को प्रतिबद्ध नहीं किया जाता है, तो इसे वापस रोल किया जा सकता है और स्टेटमेंट (एस) द्वारा किए गए सभी परिवर्तन पूर्ववत किए जा सकते हैं।
एक लेनदेन शुरू करना और समाप्त करना
एक लेन-देन एक है beginning और एक end। निम्नलिखित घटनाओं में से एक होने पर लेनदेन शुरू होता है -
पहले SQL स्टेटमेंट को डेटाबेस से कनेक्ट करने के बाद किया जाता है।
लेनदेन पूरा होने के बाद जारी किए गए प्रत्येक नए एसक्यूएल विवरण में।
निम्नलिखित घटनाओं में से एक होने पर एक लेनदेन समाप्त होता है -
ए COMMIT या ए ROLLBACK बयान जारी किया गया।
ए DDL कथन, जैसे CREATE TABLEबयान जारी किया गया है; क्योंकि उस स्थिति में एक कमिट स्वचालित रूप से किया जाता है।
ए DCL बयान, जैसे कि ए GRANTबयान जारी किया गया है; क्योंकि उस स्थिति में एक कमिट स्वचालित रूप से किया जाता है।
उपयोगकर्ता डेटाबेस से डिस्कनेक्ट करता है।
उपयोगकर्ता से बाहर निकलता है SQL*PLUS जारी करके EXIT कमांड, एक कमिट स्वचालित रूप से किया जाता है।
एसक्यूएल * प्लस असामान्य रूप से समाप्त होता है, ए ROLLBACK स्वचालित रूप से किया जाता है।
ए DMLबयान विफल; उस स्थिति में एक रोलबैक स्वचालित रूप से उस डीएमएल कथन को पूर्ववत करने के लिए किया जाता है।
लेन-देन करना
SQL कमांड COMMIT जारी करके लेनदेन को स्थायी किया जाता है। COMMIT कमांड का सामान्य सिंटैक्स है -
COMMIT;
उदाहरण के लिए,
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
COMMIT;
रोलिंग लेनदेन
COMMIT के बिना डेटाबेस में किए गए परिवर्तन ROLLBACK कमांड का उपयोग करके पूर्ववत किए जा सकते हैं।
रोलबैक कमांड का सामान्य सिंटैक्स है -
ROLLBACK [TO SAVEPOINT < savepoint_name>];
जब सिस्टम की विफलता जैसी किसी अभूतपूर्व स्थिति के कारण लेन-देन निरस्त कर दिया जाता है, तो एक प्रतिबद्ध होने के बाद से संपूर्ण लेनदेन स्वचालित रूप से वापस आ जाता है। यदि आप उपयोग नहीं कर रहे हैंsavepoint, तो बस सभी परिवर्तनों को रोलबैक करने के लिए निम्न कथन का उपयोग करें -
ROLLBACK;
Savepoints
सेवपॉइंट्स मार्करों की तरह होते हैं जो कुछ चौकियों को सेट करके एक लंबी लेनदेन को छोटी इकाइयों में विभाजित करने में मदद करते हैं। एक लंबे लेन-देन के भीतर सेवपॉइंट सेट करके, यदि आवश्यक हो, तो आप एक चेकपॉइंट पर वापस रोल कर सकते हैं। यह जारी करके किया जाता हैSAVEPOINT आदेश।
SAVEPOINT कमांड का सामान्य सिंटैक्स है -
SAVEPOINT < savepoint_name >;
उदाहरण के लिए
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 );
SAVEPOINT sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000;
ROLLBACK TO sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 7;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 8;
COMMIT;
ROLLBACK TO sav1 - यह कथन उस बिंदु तक सभी परिवर्तनों को वापस ले जाता है, जहां आपने savepoint sav1 को चिह्नित किया था।
उसके बाद, आपके द्वारा किए गए नए परिवर्तन शुरू हो जाएंगे।
स्वचालित लेनदेन नियंत्रण
निष्पादित करने के लिए COMMIT स्वचालित रूप से जब भी ए INSERT, UPDATE या DELETE कमांड निष्पादित किया जाता है, आप सेट कर सकते हैं AUTOCOMMIT पर्यावरण चर के रूप में -
SET AUTOCOMMIT ON;
आप निम्न कमांड का उपयोग करके ऑटो कमिट मोड को बंद कर सकते हैं -
SET AUTOCOMMIT OFF;
इस अध्याय में, हम PL / SQL में दिनांक और समय पर चर्चा करेंगे। पीएल / एसक्यूएल में दिनांक और समय से संबंधित डेटा प्रकार के दो वर्ग हैं -
- डेटाटाइम डेटा प्रकार
- अंतराल डेटा प्रकार
डेटाटाइम डेटा प्रकार हैं -
- DATE
- TIMESTAMP
- टाइम ज़ोन के साथ टाइमस्टैम्प
- स्थानीय समय क्षेत्र के साथ समय
अंतराल डेटा प्रकार हैं -
- अंतरजातीय महीने के लिए
- इंटरव्यू के लिए इंटरएक्टिव दिन
डेटाटाइम और अंतराल डेटा प्रकारों के लिए फ़ील्ड मान
दोनों datetime तथा interval डेटा प्रकारों से मिलकर बनता है fields। इन फ़ील्ड्स के मान डेटा प्रकार का मान निर्धारित करते हैं। निम्न तालिका डेटासेट और अंतराल के लिए फ़ील्ड और उनके संभावित मानों को सूचीबद्ध करती है।
कार्यक्षेत्र नाम | मान्य डेटाटाइम मान | वैध अंतराल मान |
---|---|---|
साल | -4712 से 9999 (वर्ष 0 को छोड़कर) | कोई भी नॉनजरो पूर्णांक |
महीना | 01 से 12 | 0 से 11 |
दिन | 01 से 31 (स्थानीय लोगों के लिए कैलेंडर के नियमों के अनुसार MONTH और YEAR के मूल्यों द्वारा सीमित) | कोई भी नॉनजरो पूर्णांक |
इस घंटे | 00 से 23 | 0 से 23 |
मिनट | 00 से 59 | 0 से 59 |
SECOND | 00 to 59.9(n), where 9(n) is the precision of time fractional seconds The 9(n) portion is not applicable for DATE. |
0 to 59.9(n), where 9(n) is the precision of interval fractional seconds |
TIMEZONE_HOUR | -12 to 14 (range accommodates daylight savings time changes) Not applicable for DATE or TIMESTAMP. |
Not applicable |
TIMEZONE_MINUTE | 00 to 59 Not applicable for DATE or TIMESTAMP. |
Not applicable |
TIMEZONE_REGION | Not applicable for DATE or TIMESTAMP. | Not applicable |
TIMEZONE_ABBR | Not applicable for DATE or TIMESTAMP. | Not applicable |
The Datetime Data Types and Functions
Following are the Datetime data types −
DATE
It stores date and time information in both character and number datatypes. It is made of information on century, year, month, date, hour, minute, and second. It is specified as −
TIMESTAMP
It is an extension of the DATE data type. It stores the year, month, and day of the DATE datatype, along with hour, minute, and second values. It is useful for storing precise time values.
TIMESTAMP WITH TIME ZONE
It is a variant of TIMESTAMP that includes a time zone region name or a time zone offset in its value. The time zone offset is the difference (in hours and minutes) between local time and UTC. This data type is useful for collecting and evaluating date information across geographic regions.
TIMESTAMP WITH LOCAL TIME ZONE
It is another variant of TIMESTAMP that includes a time zone offset in its value.
Following table provides the Datetime functions (where, x has the datetime value) −
S.No | Function Name & Description |
---|---|
1 | ADD_MONTHS(x, y); Adds y months to x. |
2 | LAST_DAY(x); Returns the last day of the month. |
3 | MONTHS_BETWEEN(x, y); Returns the number of months between x and y. |
4 | NEXT_DAY(x, day); Returns the datetime of the next day after x. |
5 | NEW_TIME; Returns the time/day value from a time zone specified by the user. |
6 | ROUND(x [, unit]); Rounds x. |
7 | SYSDATE(); Returns the current datetime. |
8 | TRUNC(x [, unit]); Truncates x. |
Timestamp functions (where, x has a timestamp value) −
S.No | Function Name & Description |
---|---|
1 | CURRENT_TIMESTAMP(); Returns a TIMESTAMP WITH TIME ZONE containing the current session time along with the session time zone. |
2 | EXTRACT({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } | { TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION | } TIMEZONE_ABBR ) FROM x) Extracts and returns a year, month, day, hour, minute, second, or time zone from x. |
3 | FROM_TZ(x, time_zone); Converts the TIMESTAMP x and the time zone specified by time_zone to a TIMESTAMP WITH TIMEZONE. |
4 | LOCALTIMESTAMP(); Returns a TIMESTAMP containing the local time in the session time zone. |
5 | SYSTIMESTAMP(); Returns a TIMESTAMP WITH TIME ZONE containing the current database time along with the database time zone. |
6 | SYS_EXTRACT_UTC(x); Converts the TIMESTAMP WITH TIMEZONE x to a TIMESTAMP containing the date and time in UTC. |
7 | TO_TIMESTAMP(x, [format]); Converts the string x to a TIMESTAMP. |
8 | TO_TIMESTAMP_TZ(x, [format]); Converts the string x to a TIMESTAMP WITH TIMEZONE. |
Examples
The following code snippets illustrate the use of the above functions −
Example 1
SELECT SYSDATE FROM DUAL;
Output −
08/31/2012 5:25:34 PM
Example 2
SELECT TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH:MI:SS') FROM DUAL;
Output −
31-08-2012 05:26:14
Example 3
SELECT ADD_MONTHS(SYSDATE, 5) FROM DUAL;
Output −
01/31/2013 5:26:31 PM
Example 4
SELECT LOCALTIMESTAMP FROM DUAL;
Output −
8/31/2012 5:26:55.347000 PM
The Interval Data Types and Functions
Following are the Interval data types −
IINTERVAL YEAR TO MONTH − It stores a period of time using the YEAR and MONTH datetime fields.
INTERVAL DAY TO SECOND − It stores a period of time in terms of days, hours, minutes, and seconds.
Interval Functions
S.No | Function Name & Description |
---|---|
1 | NUMTODSINTERVAL(x, interval_unit); Converts the number x to an INTERVAL DAY TO SECOND. |
2 | NUMTOYMINTERVAL(x, interval_unit); Converts the number x to an INTERVAL YEAR TO MONTH. |
3 | TO_DSINTERVAL(x); Converts the string x to an INTERVAL DAY TO SECOND. |
4 | TO_YMINTERVAL(x); Converts the string x to an INTERVAL YEAR TO MONTH. |
In this chapter, we will discuss the DBMS Output in PL/SQL. The DBMS_OUTPUT is a built-in package that enables you to display output, debugging information, and send messages from PL/SQL blocks, subprograms, packages, and triggers. We have already used this package throughout our tutorial.
Let us look at a small code snippet that will display all the user tables in the database. Try it in your database to list down all the table names −
BEGIN
dbms_output.put_line (user || ' Tables in the database:');
FOR t IN (SELECT table_name FROM user_tables)
LOOP
dbms_output.put_line(t.table_name);
END LOOP;
END;
/
DBMS_OUTPUT Subprograms
The DBMS_OUTPUT package has the following subprograms −
S.No | Subprogram & Purpose | |
---|---|---|
1 | DBMS_OUTPUT.DISABLE; Disables message output. |
|
2 | DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000); Enables message output. A NULL value of buffer_size represents unlimited buffer size. |
|
3 | DBMS_OUTPUT.GET_LINE (line OUT VARCHAR2, status OUT INTEGER); Retrieves a single line of buffered information. |
|
4 | DBMS_OUTPUT.GET_LINES (lines OUT CHARARR, numlines IN OUT INTEGER); Retrieves an array of lines from the buffer. |
|
5 | DBMS_OUTPUT.NEW_LINE; Puts an end-of-line marker. |
|
6 | DBMS_OUTPUT.PUT(item IN VARCHAR2); Places a partial line in the buffer. |
|
7 | DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2); Places a line in the buffer. |
Example
DECLARE
lines dbms_output.chararr;
num_lines number;
BEGIN
-- enable the buffer with default size 20000
dbms_output.enable;
dbms_output.put_line('Hello Reader!');
dbms_output.put_line('Hope you have enjoyed the tutorials!');
dbms_output.put_line('Have a great time exploring pl/sql!');
num_lines := 3;
dbms_output.get_lines(lines, num_lines);
FOR i IN 1..num_lines LOOP
dbms_output.put_line(lines(i));
END LOOP;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Hello Reader!
Hope you have enjoyed the tutorials!
Have a great time exploring pl/sql!
PL/SQL procedure successfully completed.
In this chapter, we will discuss Object-Oriented PL/SQL. PL/SQL allows defining an object type, which helps in designing object-oriented database in Oracle. An object type allows you to create composite types. Using objects allow you to implement real world objects with specific structure of data and methods for operating it. Objects have attributes and methods. Attributes are properties of an object and are used for storing an object's state; and methods are used for modeling its behavior.
Objects are created using the CREATE [OR REPLACE] TYPE statement. Following is an example to create a simple address object consisting of few attributes −
CREATE OR REPLACE TYPE address AS OBJECT
(house_no varchar2(10),
street varchar2(30),
city varchar2(20),
state varchar2(10),
pincode varchar2(10)
);
/
When the above code is executed at the SQL prompt, it produces the following result −
Type created.
Let's create one more object customer where we will wrap attributes and methods together to have object-oriented feeling −
CREATE OR REPLACE TYPE customer AS OBJECT
(code number(5),
name varchar2(30),
contact_no varchar2(12),
addr address,
member procedure display
);
/
When the above code is executed at the SQL prompt, it produces the following result −
Type created.
Instantiating an Object
Defining an object type provides a blueprint for the object. To use this object, you need to create instances of this object. You can access the attributes and methods of the object using the instance name and the access operator (.) as follows −
DECLARE
residence address;
BEGIN
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
dbms_output.put_line('House No: '|| residence.house_no);
dbms_output.put_line('Street: '|| residence.street);
dbms_output.put_line('City: '|| residence.city);
dbms_output.put_line('State: '|| residence.state);
dbms_output.put_line('Pincode: '|| residence.pincode);
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
House No: 103A
Street: M.G.Road
City: Jaipur
State: Rajasthan
Pincode: 201301
PL/SQL procedure successfully completed.
Member Methods
Member methods are used for manipulating the attributes of the object. You provide the declaration of a member method while declaring the object type. The object body defines the code for the member methods. The object body is created using the CREATE TYPE BODY statement.
Constructors are functions that return a new object as its value. Every object has a system defined constructor method. The name of the constructor is same as the object type. For example −
residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');
The comparison methods are used for comparing objects. There are two ways to compare objects −
Map method
The Map method is a function implemented in such a way that its value depends upon the value of the attributes. For example, for a customer object, if the customer code is same for two customers, both customers could be the same. So the relationship between these two objects would depend upon the value of code.
Order method
The Order method implements some internal logic for comparing two objects. For example, for a rectangle object, a rectangle is bigger than another rectangle if both its sides are bigger.
Using Map method
Let us try to understand the above concepts using the following rectangle object −
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member function enlarge( inc number) return rectangle,
member procedure display,
map member function measure return number
);
/
When the above code is executed at the SQL prompt, it produces the following result −
Type created.
Creating the type body −
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER FUNCTION enlarge(inc number) return rectangle IS
BEGIN
return rectangle(self.length + inc, self.width + inc);
END enlarge;
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
MAP MEMBER FUNCTION measure return number IS
BEGIN
return (sqrt(length*length + width*width));
END measure;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Type body created.
Now using the rectangle object and its member functions −
DECLARE
r1 rectangle;
r2 rectangle;
r3 rectangle;
inc_factor number := 5;
BEGIN
r1 := rectangle(3, 4);
r2 := rectangle(5, 7);
r3 := r1.enlarge(inc_factor);
r3.display;
IF (r1 > r2) THEN -- calling measure function
r1.display;
ELSE
r2.display;
END IF;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Length: 8
Width: 9
Length: 5
Width: 7
PL/SQL procedure successfully completed.
Using Order method
Now, the same effect could be achieved using an order method. Let us recreate the rectangle object using an order method −
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member procedure display,
order member function measure(r rectangle) return number
);
/
When the above code is executed at the SQL prompt, it produces the following result −
Type created.
Creating the type body −
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
ORDER MEMBER FUNCTION measure(r rectangle) return number IS
BEGIN
IF(sqrt(self.length*self.length + self.width*self.width)>
sqrt(r.length*r.length + r.width*r.width)) then
return(1);
ELSE
return(-1);
END IF;
END measure;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Type body created.
Using the rectangle object and its member functions −
DECLARE
r1 rectangle;
r2 rectangle;
BEGIN
r1 := rectangle(23, 44);
r2 := rectangle(15, 17);
r1.display;
r2.display;
IF (r1 > r2) THEN -- calling measure function
r1.display;
ELSE
r2.display;
END IF;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Length: 23
Width: 44
Length: 15
Width: 17
Length: 23
Width: 44
PL/SQL procedure successfully completed.
Inheritance for PL/SQL Objects
PL/SQL allows creating object from the existing base objects. To implement inheritance, the base objects should be declared as NOT FINAL. The default is FINAL.
The following programs illustrate the inheritance in PL/SQL Objects. Let us create another object named TableTop, this is inherited from the Rectangle object. For this, we need to create the base rectangle object −
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
member function enlarge( inc number) return rectangle,
NOT FINAL member procedure display) NOT FINAL
/
When the above code is executed at the SQL prompt, it produces the following result −
Type created.
Creating the base type body −
CREATE OR REPLACE TYPE BODY rectangle AS
MEMBER FUNCTION enlarge(inc number) return rectangle IS
BEGIN
return rectangle(self.length + inc, self.width + inc);
END enlarge;
MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
END display;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Type body created.
Creating the child object tabletop −
CREATE OR REPLACE TYPE tabletop UNDER rectangle
(
material varchar2(20),
OVERRIDING member procedure display
)
/
When the above code is executed at the SQL prompt, it produces the following result −
Type created.
Creating the type body for the child object tabletop
CREATE OR REPLACE TYPE BODY tabletop AS
OVERRIDING MEMBER PROCEDURE display IS
BEGIN
dbms_output.put_line('Length: '|| length);
dbms_output.put_line('Width: '|| width);
dbms_output.put_line('Material: '|| material);
END display;
/
When the above code is executed at the SQL prompt, it produces the following result −
Type body created.
Using the tabletop object and its member functions −
DECLARE
t1 tabletop;
t2 tabletop;
BEGIN
t1:= tabletop(20, 10, 'Wood');
t2 := tabletop(50, 30, 'Steel');
t1.display;
t2.display;
END;
/
When the above code is executed at the SQL prompt, it produces the following result −
Length: 20
Width: 10
Material: Wood
Length: 50
Width: 30
Material: Steel
PL/SQL procedure successfully completed.
Abstract Objects in PL/SQL
The NOT INSTANTIABLE clause allows you to declare an abstract object. You cannot use an abstract object as it is; you will have to create a subtype or child type of such objects to use its functionalities.
For example,
CREATE OR REPLACE TYPE rectangle AS OBJECT
(length number,
width number,
NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)
NOT INSTANTIABLE NOT FINAL
/
When the above code is executed at the SQL prompt, it produces the following result −
Type created.