Oracle PL/SQL पैकेज: प्रकार, विनिर्देश, मुख्य भाग [उदाहरण]

पैकेज क्या है? Oracle?

PL/SQL पैकेज एक संबंधित उपप्रोग्राम (प्रक्रिया/फ़ंक्शन) का एक एकल तत्व में तार्किक समूह है। एक पैकेज को संकलित किया जाता है और डेटाबेस ऑब्जेक्ट के रूप में संग्रहीत किया जाता है जिसका बाद में उपयोग किया जा सकता है।

पैकेज के घटक

PL/SQL पैकेज के दो घटक हैं।

  • पैकेज की विशिष्टता
  • पैकेज बॉडी

पैकेज की विशिष्टता

पैकेज विनिर्देश में सभी सार्वजनिक घोषणाएं शामिल हैं चर, कर्सर, ऑब्जेक्ट, प्रक्रियाएं, फ़ंक्शन और अपवाद।

पैकेज विनिर्देश की कुछ विशेषताएं नीचे दी गई हैं।

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

वाक्य - विन्यास

CREATE [OR REPLACE] PACKAGE <package_name> 
IS
<sub_program and public element declaration>
.
.
END <package name>

उपरोक्त सिंटैक्स पैकेज विनिर्देश के निर्माण को दर्शाता है।

पैकेज बॉडी

इसमें पैकेज विनिर्देश में मौजूद सभी तत्वों की परिभाषा शामिल होती है। इसमें उन तत्वों की परिभाषा भी हो सकती है जिन्हें विनिर्देश में घोषित नहीं किया गया है, इन तत्वों को निजी तत्व कहा जाता है और इन्हें केवल पैकेज के अंदर से ही बुलाया जा सकता है।

नीचे पैकेज बॉडी की विशेषताएं दी गई हैं।

  • इसमें सभी उपप्रोग्रामों की परिभाषाएँ होनी चाहिए/कर्सर जिन्हें विनिर्देश में घोषित किया गया है।
  • इसमें और भी उपप्रोग्राम या अन्य तत्व हो सकते हैं जो विनिर्देश में घोषित नहीं किए गए हैं। इन्हें निजी तत्व कहा जाता है।
  • यह एक भरोसेमंद वस्तु है, और यह पैकेज विनिर्देश पर निर्भर करता है।
  • जब भी विनिर्देश संकलित किया जाता है, पैकेज बॉडी की स्थिति 'अमान्य' हो जाती है। इसलिए, विनिर्देश के संकलन के बाद हर बार इसे फिर से संकलित करने की आवश्यकता होती है।
  • पैकेज बॉडी में उपयोग किए जाने से पहले निजी तत्वों को पहले परिभाषित किया जाना चाहिए।
  • पैकेज का पहला भाग वैश्विक घोषणा भाग है। इसमें वेरिएबल, कर्सर और निजी तत्व (फॉरवर्ड डिक्लेरेशन) शामिल हैं जो पूरे पैकेज को दिखाई देते हैं।
  • पैकेज का अंतिम भाग पैकेज आरंभीकरण भाग है जो तब एक बार निष्पादित होता है जब भी किसी पैकेज को सत्र में पहली बार संदर्भित किया जाता है।

सिंटेक्स:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<global_declaration part>
<Private element definition>
<sub_program and public element definition>
.
<Package Initialization> 
END <package_name>
  • उपरोक्त सिंटैक्स पैकेज बॉडी के निर्माण को दर्शाता है।

अब हम देखेंगे कि प्रोग्राम में पैकेज तत्वों को कैसे संदर्भित किया जाए।

संदर्भित पैकेज तत्व

एक बार जब तत्वों को पैकेज में घोषित और परिभाषित कर दिया जाता है, तो हमें उनका उपयोग करने के लिए तत्वों को संदर्भित करने की आवश्यकता होती है।

पैकेज के सभी सार्वजनिक तत्वों को पैकेज नाम के बाद तत्व नाम को अवधि से अलग करके कॉल करके संदर्भित किया जा सकता है, अर्थात ' . '.

पैकेज के सार्वजनिक चर का उपयोग भी उनसे मान निर्दिष्ट करने और प्राप्त करने के लिए उसी तरह किया जा सकता है अर्थात ' . '.

PL/SQL में पैकेज बनाएं

PL/SQL में जब भी किसी पैकेज को सत्र में संदर्भित/बुलाया जाता है तो उस पैकेज के लिए एक नया इंस्टैंस बनाया जाएगा।

Oracle 'पैकेज आरंभीकरण' के माध्यम से इस इंस्टैंस निर्माण के समय पैकेज तत्वों को आरंभीकृत करने या कोई भी गतिविधि करने की सुविधा प्रदान करता है।

यह कुछ और नहीं बल्कि एक निष्पादन ब्लॉक है जिसे सभी पैकेज तत्वों को परिभाषित करने के बाद पैकेज बॉडी में लिखा जाता है। जब भी सत्र में पहली बार किसी पैकेज को संदर्भित किया जाता है, तो यह ब्लॉक निष्पादित हो जाएगा।

वाक्य - विन्यास

PL/SQL में पैकेज बनाएं

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element definition>
<sub_program and public element definition>
.
BEGINE
<Package Initialization> 
END <package_name>
  • उपरोक्त सिंटैक्स पैकेज बॉडी में पैकेज आरंभीकरण की परिभाषा दिखाता है।

आगे की घोषणाएँ

पैकेज में फॉरवर्ड घोषणा/संदर्भ कुछ और नहीं बल्कि निजी तत्वों को अलग से घोषित करना और पैकेज बॉडी के बाद के भाग में इसे परिभाषित करना है।

निजी तत्वों को केवल तभी संदर्भित किया जा सकता है जब यह पैकेज बॉडी में पहले से ही घोषित हो। इस कारण से, फॉरवर्ड डिक्लेरेशन का उपयोग किया जाता है। लेकिन इसका उपयोग करना असामान्य है क्योंकि अधिकांश समय निजी तत्वों को पैकेज बॉडी के पहले भाग में घोषित और परिभाषित किया जाता है।

फॉरवर्ड डिक्लेरेशन एक विकल्प है जो निम्न द्वारा प्रदान किया जाता है Oracleयह अनिवार्य नहीं है और इसका उपयोग करना या न करना प्रोग्रामर की आवश्यकता पर निर्भर करता है।

आगे की घोषणाएँ

सिंटेक्स:

CREATE [OR REPLACE] PACKAGE BODY <package_name>
IS
<Private element declaration>
.
.
.
<Public element definition that refer the above private element>
.
.
<Private element definition> 
.
BEGIN
<package_initialization code>; 
END <package_name>

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

पैकेज में कर्सर का उपयोग

अन्य तत्वों के विपरीत, पैकेज के अंदर कर्सर का उपयोग करते समय सावधानी बरतने की आवश्यकता होती है।

यदि कर्सर को पैकेज विनिर्देश में या पैकेज बॉडी के वैश्विक भाग में परिभाषित किया गया है, तो एक बार खुलने के बाद कर्सर सत्र के अंत तक बना रहेगा।

इसलिए कर्सर को संदर्भित करने से पहले उसकी स्थिति को सत्यापित करने के लिए हमेशा कर्सर विशेषता '%ISOPEN' का उपयोग करना चाहिए।

ओवरलोडिंग

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

यह तब उपयोगी होता है जब कई सबप्रोग्राम को एक ही कार्य करना होता है, लेकिन उनमें से प्रत्येक को कॉल करने का तरीका अलग होना चाहिए। इस स्थिति में, सबप्रोग्राम का नाम सभी के लिए समान रखा जाएगा और पैरामीटर को कॉलिंग स्टेटमेंट के अनुसार बदला जाएगा।

उदाहरण 1: इस उदाहरण में, हम 'emp' टेबल में कर्मचारी की जानकारी के मान प्राप्त करने और सेट करने के लिए एक पैकेज बनाने जा रहे हैं। get_record फ़ंक्शन दिए गए कर्मचारी नंबर के लिए रिकॉर्ड प्रकार आउटपुट लौटाएगा, और set_record प्रक्रिया emp टेबल में रिकॉर्ड प्रकार रिकॉर्ड डालेगी।

चरण 1) पैकेज विनिर्देश निर्माण

ओवरलोडिंग

CREATE OR REPLACE PACKAGE guru99_get_set
IS
PROCEDURE set_record (p_emp_rec IN emp%ROWTYPE);
FUNCTION get record (p_emp no IN NUMBER) RETURN emp%ROWTYPE;
END guru99_get_set:
/

आउटपुट:

Package created

कोड स्पष्टीकरण

  • कोड लाइन 1-5: एक प्रक्रिया और एक फ़ंक्शन के साथ guru99_get_set के लिए पैकेज विनिर्देश बनाना। ये दोनों अब इस पैकेज के सार्वजनिक तत्व हैं।

चरण 2) पैकेज में पैकेज बॉडी होती है, जहाँ सभी प्रक्रियाएँ और फ़ंक्शन वास्तविक परिभाषाएँ परिभाषित की जाएँगी। इस चरण में, पैकेज बॉडी बनाई जाती है।

ओवरलोडिंग

CREATE OR REPLACE PACKAGE BODY guru99_get_set
IS	
PROCEDURE set_record(p_emp_rec IN emp%ROWTYPE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO emp
VALUES(p_emp_rec.emp_name,p_emp_rec.emp_no; p_emp_rec.salary,p_emp_rec.manager);
COMMIT;
END set_record;
FUNCTION get_record(p_emp_no IN NUMBER)
RETURN emp%ROWTYPE
IS
l_emp_rec emp%ROWTYPE;
BEGIN
SELECT * INTO l_emp_rec FROM emp where emp_no=p_emp_no
RETURN l_emp_rec;
END get_record;
BEGUN	
dbms_output.put_line(‘Control is now executing the package initialization part');
END guru99_get_set:
/

आउटपुट:

Package body created

कोड स्पष्टीकरण

  • कोड लाइन 7: पैकेज बॉडी बनाना.
  • कोड लाइन 9-16: विनिर्देश में घोषित तत्व 'set_record' को परिभाषित करना। यह PL/SQL में स्टैंडअलोन प्रक्रिया को परिभाषित करने जैसा ही है।
  • कोड पंक्ति 17-24: 'get_record' तत्व को परिभाषित करना। यह स्टैंडअलोन फ़ंक्शन को परिभाषित करने के समान है।
  • कोड पंक्ति 25-26: पैकेज आरंभीकरण भाग को परिभाषित करना.

चरण 3) उपरोक्त निर्मित पैकेज का संदर्भ देकर रिकॉर्ड डालने और प्रदर्शित करने के लिए एक अनाम ब्लॉक बनाना।

ओवरलोडिंग

DECLARE
l_emp_rec emp%ROWTYPE;
l_get_rec emp%ROWTYPE;
BEGIN
dbms output.put line(‘Insert new record for employee 1004');
l_emp_rec.emp_no:=l004;
l_emp_rec.emp_name:='CCC';
l_emp_rec.salary~20000;
l_emp_rec.manager:=’BBB’;
guru99_get_set.set_record(1_emp_rec);
dbms_output.put_line(‘Record inserted');
dbms output.put line(‘Calling get function to display the inserted record'):
l_get_rec:=guru99_get_set.get_record(1004);
dbms_output.put_line(‘Employee name: ‘||l_get_rec.emp_name);
dbms_output.put_line(‘Employee number:‘||l_get_rec.emp_no);
dbms_output.put_line(‘Employee salary:‘||l_get_rec.salary');
dbms output.put line(‘Employee manager:‘||1_get_rec.manager);		
END:
/

आउटपुट:

Insert new record for employee 1004
Control is now executing the package initialization part
Record inserted
Calling get function to display the inserted record
Employee name: CCC
Employee number: 1004
Employee salary: 20000
Employee manager: BBB

कोड स्पष्टीकरण:

  • कोड पंक्ति 34-37: पैकेज के 'set_record' तत्व को कॉल करने के लिए एक अनाम ब्लॉक में रिकॉर्ड प्रकार चर के लिए डेटा पॉपुलेट करना।
  • कोड पंक्ति 38: गुरु99_get_set पैकेज के 'set_record' को कॉल किया गया है। अब पैकेज इंस्टेंटिएट हो गया है और यह सत्र के अंत तक बना रहेगा।
  • पैकेज आरंभीकरण भाग निष्पादित किया जाता है क्योंकि यह पैकेज के लिए पहला कॉल है।
  • रिकॉर्ड को 'set_record' तत्व द्वारा तालिका में डाला जाता है।
  • कोड पंक्ति 41: सम्मिलित कर्मचारी का विवरण प्रदर्शित करने के लिए 'get_record' तत्व को कॉल करना।
  • पैकेज को 'get_record' कॉल के दौरान दूसरी बार संदर्भित किया जाता है। लेकिन इस बार आरंभीकरण भाग निष्पादित नहीं किया जाता है क्योंकि पैकेज पहले से ही इस सत्र में आरंभीकृत है।
  • कोड पंक्ति 42-45: कर्मचारी विवरण मुद्रित करना।

पैकेज में निर्भरता

चूंकि पैकेज संबंधित चीजों का तार्किक समूह है, इसलिए इसकी कुछ निर्भरताएं हैं। निम्नलिखित निर्भरताएं हैं जिनका ध्यान रखना चाहिए।

  • विनिर्देश एक स्वतंत्र वस्तु है।
  • पैकेज बॉडी विनिर्देश पर निर्भर है।
  • पैकेज बॉडी को अलग से संकलित किया जा सकता है। जब भी विनिर्देश संकलित किया जाता है, तो बॉडी को फिर से संकलित करने की आवश्यकता होती है क्योंकि यह अमान्य हो जाएगा।
  • पैकेज बॉडी में उपप्रोग्राम जो निजी तत्व पर निर्भर है, उसे निजी तत्व घोषणा के बाद ही परिभाषित किया जाना चाहिए।
  • विनिर्देश और बॉडी में संदर्भित डेटाबेस ऑब्जेक्ट्स को पैकेज संकलन के समय वैध स्थिति में होना चाहिए।

पैकेज की जानकारी

एक बार पैकेज जानकारी तैयार हो जाने के बाद, पैकेज जानकारी जैसे पैकेज स्रोत, उपप्रोग्राम विवरण और अधिभार विवरण उपलब्ध हो जाते हैं Oracle डेटा परिभाषा तालिकाएँ.

नीचे दी गई तालिका में डेटा परिभाषा तालिका और पैकेज जानकारी दी गई है जो तालिका में उपलब्ध है।

तालिका नाम विवरण प्रश्न
सभी_ऑब्जेक्ट पैकेज का विवरण देता है जैसे object_id, creation_date, last_ddl_time, आदि। इसमें सभी उपयोगकर्ताओं द्वारा बनाए गए ऑब्जेक्ट शामिल होंगे। SELECT * FROM all_objects जहाँ object_name =' '
उपयोगकर्ता_ऑब्जेक्ट पैकेज का विवरण देता है जैसे object_id, creation_date, last_ddl_time, आदि। इसमें वर्तमान उपयोगकर्ता द्वारा बनाए गए ऑब्जेक्ट शामिल होंगे। SELECT * FROM user_objects जहाँ object_name =' '
सभी_स्रोत सभी उपयोगकर्ताओं द्वारा बनाए गए ऑब्जेक्ट का स्रोत देता है। SELECT * FROM all_source जहाँ नाम=' '
उपयोगकर्ता_स्रोत वर्तमान उपयोगकर्ता द्वारा निर्मित ऑब्जेक्ट का स्रोत देता है। SELECT * FROM user_source जहाँ नाम=' '
सभी प्रक्रियाएं सभी उपयोगकर्ताओं द्वारा बनाए गए उपप्रोग्राम विवरण जैसे object_id, ओवरलोड विवरण आदि देता है। सभी प्रक्रियाओं से * का चयन करें
जहां object_name=' '
उपयोगकर्ता_प्रक्रियाएँ वर्तमान उपयोगकर्ता द्वारा बनाए गए उपप्रोग्राम विवरण जैसे object_id, ओवरलोड विवरण आदि देता है। उपयोगकर्ता_प्रक्रियाओं से * का चयन करें
जहां object_name=' '

UTL फ़ाइल – एक अवलोकन

UTL फ़ाइल एक अलग उपयोगिता पैकेज है जो यू.टी.एल. द्वारा प्रदान किया जाता है। Oracle विशेष कार्य करने के लिए। इसका उपयोग मुख्य रूप से PL/SQL पैकेज या सबप्रोग्राम से ऑपरेटिंग सिस्टम फ़ाइलों को पढ़ने और लिखने के लिए किया जाता है। इसमें जानकारी डालने और फ़ाइलों से जानकारी प्राप्त करने के लिए अलग-अलग फ़ंक्शन हैं। यह मूल वर्ण सेट में पढ़ने/लिखने की भी अनुमति देता है।

प्रोग्रामर इसका उपयोग किसी भी प्रकार की ऑपरेटिंग सिस्टम फाइल लिखने के लिए कर सकता है और फाइल सीधे डेटाबेस सर्वर पर लिखी जाएगी। लिखते समय नाम और निर्देशिका पथ का उल्लेख किया जाएगा।

सारांश

अब हम पैकेज के बारे में जान चुके हैं PL / SQL, और अब आप निम्नलिखित में काम करने में सक्षम होंगे।

  • PL/SQL पैकेज और उसके घटक
  • पैकेज की विशेषताएं
  • पैकेज तत्वों को संदर्भित करना और ओवरलोड करना
  • पैकेजों में निर्भरता का प्रबंधन
  • पैकेज की जानकारी देखना
  • UTL फ़ाइल क्या है?