Oracle PL/SQL ऑब्जेक्ट प्रकार: उदाहरणों सहित CREATE TYPE

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

PL/SQL में ऑब्जेक्ट प्रकार ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को संभव बनाते हैं। Oracleये आपको विशेषताओं और विधियों के साथ वास्तविक दुनिया की संस्थाओं को मॉडल करने की सुविधा देते हैं। ये कंस्ट्रक्टर, इनहेरिटेंस और समानता तुलना का समर्थन करते हैं, इसलिए एक ही स्कीमा-स्तरीय प्रकार संरचित डेटा को संग्रहीत और संसाधित कर सकता है।

  • 🧱 ऑब्जेक्ट प्रकार के घटक: एक ऑब्जेक्ट प्रकार में डेटा संग्रहीत करने वाले एट्रिब्यूट और उसकी प्रोसेसिंग लॉजिक को परिभाषित करने वाले मेंबर या मेथड शामिल होते हैं।
  • 🏗️ ऑब्जेक्ट बनाएं: ऑब्जेक्ट प्रकारों को स्कीमा स्तर पर CREATE TYPE कमांड के साथ बनाया जाता है, और उनकी विधियों को एक अलग CREATE TYPE BODY में परिभाषित किया जाता है।
  • 🔧 कंस्ट्रक्टर्स: प्रत्येक ऑब्जेक्ट प्रकार में उस प्रकार के नाम पर एक अंतर्निहित कंस्ट्रक्टर होता है, और आप डिफ़ॉल्ट मान सेट करने के लिए एक स्पष्ट कंस्ट्रक्टर परिभाषित कर सकते हैं।
  • 🧬 विरासत: एक NOT FINAL पैरेंट टाइप को UNDER के साथ विस्तारित किया जाता है, इसलिए एक सब-टाइप पैरेंट के सभी एट्रिब्यूट्स और मेंबर्स को इनहेरिट करता है।
  • समानता: ORDER नामक सदस्य फ़ंक्शन दो ऑब्जेक्ट इंस्टेंस की तुलना करता है और एक ऋणात्मक, शून्य या धनात्मक संख्या लौटाता है।
  • 🤖 एआई सहायता: GitHub Copilot जैसे AI सहायक, किसी टिप्पणी से CREATE TYPE परिभाषाएँ, कंस्ट्रक्टर और ORDER विधियाँ तैयार करते हैं।

Oracle PL/SQL ऑब्जेक्ट प्रकार, जिसमें CREATE TYPE को एट्रिब्यूट और मेथड के साथ दिखाया गया है।

PL/SQL में ऑब्जेक्ट प्रकार क्या है?

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग विशेष रूप से पुन: प्रयोज्य घटकों और जटिल अनुप्रयोगों के निर्माण के लिए उपयुक्त है। प्रोग्राम "क्रियाओं" के बजाय "ऑब्जेक्ट्स" के इर्द-गिर्द व्यवस्थित होते हैं; यानी, वे किसी एक क्रिया के बजाय संपूर्ण ऑब्जेक्ट के साथ काम करने और परस्पर क्रिया करने के लिए डिज़ाइन किए जाते हैं। यह दृष्टिकोण प्रोग्रामर को ऑब्जेक्ट-एंटिटी स्तर पर विवरणों को भरने और उनमें हेरफेर करने की सुविधा देता है।

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

बैंक खाते को PL/SQL में एट्रिब्यूट्स और मेथड्स के साथ एक ऑब्जेक्ट टाइप के रूप में मॉडल किया गया है।

In PL / SQLऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ऑब्जेक्ट प्रकारों पर आधारित है। एक ऑब्जेक्ट प्रकार किसी भी वास्तविक दुनिया की इकाई का प्रतिनिधित्व कर सकता है। नीचे दिए गए अनुभाग ऑब्जेक्ट प्रकारों, उनके घटकों और उन्हें बनाने और उपयोग करने के तरीके के बारे में बताते हैं।

ऑब्जेक्ट प्रकार के घटक

एक PL/SQL ऑब्जेक्ट प्रकार में मुख्य रूप से दो घटक होते हैं।

  1. गुण
  2. सदस्य/विधि

गुण

एट्रिब्यूट वे कॉलम या फ़ील्ड होते हैं जिनमें डेटा संग्रहित होता है। प्रत्येक एट्रिब्यूट को उस डेटाटाइप से मैप किया जाता है जो उस एट्रिब्यूट के लिए प्रोसेसिंग और स्टोरेज प्रकार को परिभाषित करता है। एक एट्रिब्यूट किसी भी मान्य प्रकार का हो सकता है। PL/SQL डेटाटाइप, या यह किसी अन्य ऑब्जेक्ट प्रकार का हो सकता है.

सदस्य/विधि

सदस्य, या विधियाँ, हैं उपकार्यक्रम ऑब्जेक्ट टाइप के अंदर परिभाषित किए गए ये सदस्य डेटा को स्टोर करने के लिए उपयोग नहीं किए जाते हैं; बल्कि, ये ऑब्जेक्ट टाइप के अंदर की जाने वाली प्रोसेसिंग को परिभाषित करते हैं — उदाहरण के लिए, ऑब्जेक्ट में डेटा भरने से पहले उसका सत्यापन करना। इन्हें ऑब्जेक्ट टाइप स्पेसिफिकेशन में घोषित किया जाता है और ऑब्जेक्ट टाइप बॉडी में परिभाषित किया जाता है। बॉडी वैकल्पिक है: यदि कोई सदस्य मौजूद नहीं है, तो ऑब्जेक्ट टाइप का कोई बॉडी पार्ट नहीं होता है।

इसमें ऑब्जेक्ट बनाएं Oracle

ऑब्जेक्ट टाइप को सबप्रोग्राम स्तर पर नहीं बनाया जा सकता; इसे केवल स्कीमा स्तर पर ही बनाया जा सकता है। स्कीमा में ऑब्जेक्ट टाइप परिभाषित हो जाने के बाद, इसे सबप्रोग्राम में उपयोग किया जा सकता है। ऑब्जेक्ट टाइप को "CREATE TYPE" स्टेटमेंट का उपयोग करके बनाया जाता है, और टाइप बॉडी को इसके ऑब्जेक्ट टाइप के अस्तित्व में आने के बाद ही बनाया जा सकता है।

नीचे दिए गए स्क्रीनशॉट ऑब्जेक्ट विनिर्देश के लिए CREATE TYPE सिंटैक्स और इसके तरीकों को परिभाषित करने वाले CREATE TYPE BODY सिंटैक्स को दर्शाते हैं।

CREATE TYPE सिंटैक्स, जिसमें विशेषताओं के साथ एक ऑब्जेक्ट विनिर्देश को परिभाषित किया गया है। Oracle CREATE TYPE BODY सिंटैक्स एक PL/SQL ऑब्जेक्ट प्रकार के तरीकों को परिभाषित करता है।

CREATE TYPE<object_type_name> AS OBJECT
(
<attribute_l><datatype>,
.
.
);
/
CREATE TYPE BODY<object_type_name> AS OBJECT
(
MEMBER[PROCEDURE|FUNCTION]<member_name> 
IS
<declarative section>
BEGIN
<execution part>
END;
.
.
);
/

वाक्यविन्यास स्पष्टीकरण:

  • ऊपर दिया गया सिंटैक्स एट्रिब्यूट्स वाले एक ऑब्जेक्ट और मेथड्स वाले एक ऑब्जेक्ट बॉडी के निर्माण को दर्शाता है।
  • विधियों को ऑब्जेक्ट बॉडी में ओवरलोड भी किया जा सकता है।

ऑब्जेक्ट प्रकार की घोषणा आरंभीकरण

PL/SQL के अन्य घटकों की तरह, ऑब्जेक्ट प्रकारों को प्रोग्राम में उपयोग करने से पहले घोषित करना आवश्यक है। ऑब्जेक्ट प्रकार बन जाने के बाद, इसका उपयोग किसी सबप्रोग्राम के डिक्लेरेटिव सेक्शन में उस ऑब्जेक्ट प्रकार के वेरिएबल को घोषित करने के लिए किया जा सकता है।

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

नीचे दिया गया स्क्रीनशॉट एक वेरिएबल को ऑब्जेक्ट प्रकार के रूप में घोषित किए जाने को दर्शाता है। PL/SQL ब्लॉक.

PL/SQL ब्लॉक के डिक्लेरेटिव सेक्शन में ऑब्जेक्ट प्रकार के वेरिएबल की घोषणा करना

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

वाक्यविन्यास स्पष्टीकरण:

  • ऊपर दिया गया सिंटैक्स एक घोषणा को दर्शाता है। परिवर्तनशील घोषणात्मक अनुभाग में एक ऑब्जेक्ट प्रकार के रूप में।

एक बार जब किसी सबप्रोग्राम में वेरिएबल को ऑब्जेक्ट प्रकार के रूप में घोषित कर दिया जाता है, तो वह एटॉमिक रूप से नल होता है—पूरा ऑब्जेक्ट ही नल होता है। प्रोग्राम में उपयोग करने से पहले इसे मानों से इनिशियलाइज़ करना आवश्यक है। ऑब्जेक्ट को कंस्ट्रक्टर का उपयोग करके इनिशियलाइज़ किया जाता है।

कंस्ट्रक्टर किसी ऑब्जेक्ट का अंतर्निहित मेथड होता है जिसे ऑब्जेक्ट टाइप के समान नाम से संदर्भित किया जा सकता है। नीचे दिया गया स्क्रीनशॉट ऑब्जेक्ट टाइप इंस्टेंस के आरंभीकरण को दर्शाता है।

किसी ऑब्जेक्ट प्रकार के इंस्टेंस को उसके कंस्ट्रक्टर का उपयोग करके null से इनिशियलाइज़ करना

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

वाक्यविन्यास स्पष्टीकरण:

  • ऊपर दिया गया सिंटैक्स ऑब्जेक्ट टाइप इंस्टेंस को नल वैल्यू से इनिशियलाइज़ करने को दर्शाता है।
  • ऑब्जेक्ट स्वयं इनिशियलाइज़ होने के बाद नल नहीं रहता है, लेकिन ऑब्जेक्ट के अंदर के एट्रिब्यूट तब तक नल रहते हैं जब तक उन्हें मान असाइन नहीं किए जाते हैं।

कंस्ट्रक्टर्स

कंस्ट्रक्टर किसी ऑब्जेक्ट का वह अंतर्निहित मेथड होता है जिसे ऑब्जेक्ट टाइप के समान नाम से संदर्भित किया जा सकता है। जब भी ऑब्जेक्ट को पहली बार संदर्भित किया जाता है, तो यह कंस्ट्रक्टर स्वतः ही कॉल हो जाता है।

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

उदाहरण 1: निम्नलिखित उदाहरण में, हम ऑब्जेक्ट टाइप मेंबर का उपयोग करके ('RRR', 1005, 20000, 1000) और ('PPP', 1006, 20000, 1001) मानों के साथ emp टेबल में रिकॉर्ड सम्मिलित करते हैं। डेटा सम्मिलित होने के बाद, हम ऑब्जेक्ट टाइप मेंबर का उपयोग करके इसे प्रदर्शित करते हैं। हम दूसरे रिकॉर्ड के लिए मैनेजर आईडी को डिफ़ॉल्ट मान 1001 से भरने के लिए एक स्पष्ट कंस्ट्रक्टर का भी उपयोग करते हैं।

हम इसे निम्नलिखित चरणों में क्रियान्वित करते हैं।

  • चरण 1: ऑब्जेक्ट प्रकार और ऑब्जेक्ट प्रकार का बॉडी बनाएं।
  • चरण 2: emp_no 1005 के लिए अंतर्निहित कंस्ट्रक्टर के माध्यम से ऑब्जेक्ट प्रकार को कॉल करने के लिए एक अनाम ब्लॉक बनाएं।
  • चरण 3: emp_no 1006 के लिए स्पष्ट कंस्ट्रक्टर के माध्यम से ऑब्जेक्ट प्रकार को कॉल करने के लिए एक अनाम ब्लॉक बनाएं।

चरण 1) ऑब्जेक्ट प्रकार और ऑब्जेक्ट प्रकार बॉडी बनाएं।

नीचे दिए गए स्क्रीनशॉट में emp_object ऑब्जेक्ट प्रकार विनिर्देश को उसके एट्रिब्यूट और सदस्यों के साथ बनाते हुए दिखाया गया है।

एट्रिब्यूट्स और मेंबर्स के साथ emp_object ऑब्जेक्ट टाइप स्पेसिफिकेशन बनाना

CREATE TYPE emp_object AS OBJECT(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager NUMBER,
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2,
p_salary NUMBER) RETURN SELF AS RESULT),
MEMBER PROCEDURE insert_records,
MEMBER PROCEDURE display_records);
/

नीचे दिए गए स्क्रीनशॉट में स्पष्ट कंस्ट्रक्टर और सदस्य प्रक्रियाओं के साथ emp_object प्रकार के बॉडी का निर्माण दिखाया गया है।

एक स्पष्ट कंस्ट्रक्टर और सदस्य प्रक्रियाओं के साथ emp_object प्रकार के बॉडी को परिभाषित करना

CREATE OR REPLACE TYPE BODY emp_object AS
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,
p_salary NUMBER)
RETURN SELF AS RESULT
IS
BEGIN
Dbms_output.put_line('Constructor fired..');
SELF.emp_no:=p_emp_no;
SELF.emp_name:=p_emp_name;
SELF.salary:=p_salary;
SELF.manager:=1001;
RETURN;
END;
MEMBER PROCEDURE insert_records
IS
BEGIN
INSERT INTO emp VALUES(emp_no,emp_name,salary,manager);
END;
MEMBER PROCEDURE display_records
IS
BEGIN
Dbms_output.put_line('Employee Name:'||emp_name);
Dbms_output.put_line('Employee Number:'||emp_no);
Dbms_output.put_line('Salary:'||salary);
Dbms_output.put_line('Manager:'||manager);
END;
END;
/

Code व्याख्या

  • Code पंक्ति 1-9: 'emp_object' ऑब्जेक्ट प्रकार बनाया जा रहा है जिसमें 4 विशेषताएँ और 3 सदस्य हैं। इसमें केवल 3 मापदंडों वाले एक कंस्ट्रक्टर की परिभाषा शामिल है। (वास्तविक अंतर्निहित कंस्ट्रक्टर में ऑब्जेक्ट प्रकार में मौजूद विशेषताओं की संख्या के बराबर मापदंड होते हैं।)
  • Code पंक्ति 10: टाइप बॉडी का निर्माण करना।
  • Code पंक्ति 11-21: स्पष्ट कंस्ट्रक्टर को परिभाषित करना। पैरामीटर मानों को एट्रिब्यूट्स को असाइन करना और एट्रिब्यूट 'मैनेजर' को डिफ़ॉल्ट मान '1001' असाइन करना।
  • Code पंक्ति 22-26: 'insert_records' नामक सदस्य को परिभाषित करना, जिसमें विशेषता मानों को 'emp' तालिका में सम्मिलित किया जाता है।
  • Code पंक्ति 27-34: 'display_records' नामक सदस्य को परिभाषित करना, जो ऑब्जेक्ट प्रकार के एट्रिब्यूट के मानों को प्रदर्शित करता है।

आउटपुट:

प्रकार बनाया गया

प्रकार बॉडी बनाई गई

चरण 2) emp_no 1005 के लिए अंतर्निहित कंस्ट्रक्टर के माध्यम से निर्मित ऑब्जेक्ट प्रकार को कॉल करने के लिए एक अनाम ब्लॉक बनाना।

नीचे दिया गया स्क्रीनशॉट उस अनाम ब्लॉक को दर्शाता है जो इम्प्लिसिट कंस्ट्रक्टर के माध्यम से emp_object को कॉल करता है।

emp_no 1005 के लिए अंतर्निहित कंस्ट्रक्टर के माध्यम से emp_object को कॉल करने वाला अनाम ब्लॉक

DECLARE
guru_emp_det emp_object;
BEGIN
guru_emp_det:=emp_object(1005,'RRR',20000,1000);
guru_emp_det.display_records;
guru_emp_det.insert_records;
COMMIT;
END;

Code व्याख्या

  • Code पंक्ति 37-45: इम्प्लिसिट कंस्ट्रक्टर का उपयोग करके रिकॉर्ड सम्मिलित किए जा रहे हैं। कंस्ट्रक्टर को किए गए कॉल में एट्रिब्यूट मानों की वास्तविक संख्या शामिल होती है।
  • Code पंक्ति 38: 'guru_emp_det' को 'emp_object' ऑब्जेक्ट प्रकार के रूप में घोषित करता है।
  • Code पंक्ति 41: 'guru_emp_det.display_records' स्टेटमेंट 'display_records' मेंबर को कॉल करता है और एट्रिब्यूट वैल्यू प्रदर्शित होती हैं।
  • Code पंक्ति 42: 'guru_emp_det.insert_records' स्टेटमेंट 'insert_records' मेंबर को कॉल करता है और एट्रिब्यूट वैल्यू टेबल में इंसर्ट हो जाती हैं। इसके बाद ब्लॉक कमिट हो जाता है। ट्रांजेक्शन.

आउटपुट:

कर्मचारी का नाम: आरआरआर

कर्मचारी संख्या: 1005

वेतन : 20000

प्रबंधक : 1000

चरण 3) emp_no 1006 के लिए स्पष्ट कंस्ट्रक्टर के माध्यम से निर्मित ऑब्जेक्ट प्रकार को कॉल करने के लिए एक अनाम ब्लॉक बनाना।

नीचे दिया गया स्क्रीनशॉट उस अनाम ब्लॉक को दर्शाता है जो तीन आर्गुमेंट के साथ स्पष्ट कंस्ट्रक्टर के माध्यम से emp_object को कॉल करता है।

emp_no 1006 के लिए स्पष्ट कंस्ट्रक्टर के माध्यम से emp_object को कॉल करने वाला अनाम ब्लॉक

DECLARE
guru_emp_det emp_object;
BEGIN
guru_emp_det:=emp_object(1006,'PPP',20000);
guru_emp_det.display_records;
guru_emp_det.insert_records;
COMMIT;
END;
/

उत्पादन

Employee Name:PPP 
Employee Number:1006 
Salary:20000 
Manager:1001

Code स्पष्टीकरण:

  • Code पंक्ति 46-53: स्पष्ट कंस्ट्रक्टर का उपयोग करके रिकॉर्ड सम्मिलित करना।
  • Code पंक्ति 46: 'guru_emp_det' को 'emp_object' ऑब्जेक्ट प्रकार के रूप में घोषित करता है।
  • Code पंक्ति 50: 'guru_emp_det.display_records' स्टेटमेंट 'display_records' मेंबर को कॉल करता है और एट्रिब्यूट वैल्यू प्रदर्शित होती हैं।
  • Code पंक्ति 51: 'guru_emp_det.insert_records' स्टेटमेंट 'insert_records' मेंबर को कॉल करता है और एट्रिब्यूट वैल्यू टेबल में इंसर्ट हो जाती हैं। चूंकि केवल तीन आर्गुमेंट पास किए जाते हैं, इसलिए एक्सप्लिसिट कंस्ट्रक्टर मैनेजर आईडी को उसके डिफ़ॉल्ट मान 1001 पर सेट कर देता है।

ऑब्जेक्ट प्रकार में वंशानुक्रम

इनहेरिटेंस प्रॉपर्टी एक सब-ऑब्जेक्ट टाइप को सुपर ऑब्जेक्ट टाइप या पैरेंट ऑब्जेक्ट टाइप के सभी एट्रीब्यूट्स और मेंबर्स तक पहुंचने की अनुमति देती है।

सब-ऑब्जेक्ट प्रकार को इनहेरिटेड ऑब्जेक्ट प्रकार कहा जाता है, और सुपर ऑब्जेक्ट प्रकार को पैरेंट ऑब्जेक्ट प्रकार कहा जाता है। नीचे दिया गया सिंटैक्स पैरेंट और इनहेरिटेड ऑब्जेक्ट प्रकार बनाने का तरीका दर्शाता है। नीचे दिए गए स्क्रीनशॉट में पैरेंट (सुपर) प्रकार का सिंटैक्स दिखाया गया है जिसे 'नॉट फाइनल' के रूप में चिह्नित किया गया है।

इनहेरिटेंस में उपयोग किए जाने वाले NOT FINAL पैरेंट ऑब्जेक्ट टाइप के लिए CREATE TYPE सिंटैक्स

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

वाक्यविन्यास स्पष्टीकरण:

  • ऊपर दिया गया सिंटैक्स SUPER टाइप के निर्माण को दर्शाता है। NOT FINAL क्लॉज़ टाइप को इनहेरिट करने की अनुमति देता है।

नीचे दिया गया स्क्रीनशॉट UNDER कीवर्ड का उपयोग करके बनाए गए इनहेरिटेड (SUB) प्रकार के सिंटैक्स को दर्शाता है।

पैरेंट से इनहेरिट करने वाले सब-ऑब्जेक्ट टाइप के लिए CREATE TYPE UNDER सिंटैक्स

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

वाक्यविन्यास स्पष्टीकरण:

  • ऊपर दिया गया सिंटैक्स SUB प्रकार के निर्माण को दर्शाता है। इसमें पैरेंट ऑब्जेक्ट प्रकार के सभी सदस्य और विशेषताएँ शामिल हैं।

उदाहरण 1: नीचे दिए गए उदाहरण में, हम रिकॉर्ड ('RRR', 1007, 20000) के लिए प्रबंधक आईडी '1002' के साथ एक रिकॉर्ड सम्मिलित करने के लिए इनहेरिटेंस प्रॉपर्टी का उपयोग करते हैं। हम निम्नलिखित चरणों में प्रोग्राम को निष्पादित करते हैं।

  • चरण 1: सुपर टाइप बनाएं।
  • चरण 2: SUB प्रकार और बॉडी बनाएं।
  • चरण 3: SUB प्रकार को कॉल करने के लिए एक अनाम ब्लॉक बनाएं।

चरण 1) सुपर टाइप या पैरेंट टाइप बनाएं।

नीचे दिए गए स्क्रीनशॉट में NOT FINAL क्लॉज़ के साथ emp_object सुपर टाइप को बनाते हुए दिखाया गया है।

इनहेरिटेंस उदाहरण के लिए emp_object NOT FINAL सुपर टाइप बनाना

CREATE TYPE emp_object AS OBJECT(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager NUMBER,
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50),
p_salary NUMBER)RETURN SELF AS RESULT),
MEMBER PROCEDURE insert_records,
MEMBER PROCEDURE display_records)NOT FINAL;
/

Code स्पष्टीकरण:

  • Code पंक्ति 1-9: 'emp_object' ऑब्जेक्ट प्रकार बनाया जा रहा है जिसमें 4 विशेषताएँ और 3 सदस्य हैं। इसमें केवल 3 मापदंडों वाले एक कंस्ट्रक्टर की परिभाषा शामिल है। इसे 'NOT FINAL' घोषित किया गया है, इसलिए यह एक पैरेंट प्रकार है।

चरण 2) सुपर टाइप के अंतर्गत सब टाइप बनाएं।

नीचे दिए गए स्क्रीनशॉट में सब_एम्प_ऑब्जेक्ट इनहेरिटेड टाइप और उसके बॉडी के निर्माण को दिखाया गया है।

insert_default_mgr का उपयोग करके sub_emp_object इनहेरिटेड टाइप और उसके बॉडी को बनाना।

CREATE OR REPLACE TYPE sub_emp_object 
UNDER emp_object
(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);
/


CREATE OR REPLACE TYPE BODY sub_emp_object 
AS
MEMBER PROCEDURE insert_default_mgr 
IS
BEGIN
INSERT INTO emp
VALUES(emp_no,emp_name,salary,manager);
END;
END;
/

Code स्पष्टीकरण:

  • Code पंक्ति 10-13: 'sub_emp_object' को एक अतिरिक्त विशेषता 'default_manager' और एक सदस्य प्रक्रिया घोषणा के साथ विरासत में मिले प्रकार के रूप में बनाया जा रहा है।
  • Code पंक्ति 14: इनहेरिटेड ऑब्जेक्ट टाइप के लिए बॉडी बनाना।
  • Code पंक्ति 16-21: यह सदस्य प्रक्रिया 'emp' तालिका में SUPER ऑब्जेक्ट प्रकार के मानों के साथ रिकॉर्ड सम्मिलित करती है, सिवाय प्रबंधक मान के। प्रबंधक मान के लिए, यह SUB प्रकार से 'default_manager' का उपयोग करती है।

चरण 3) SUB प्रकार को कॉल करने के लिए अनाम ब्लॉक बनाना।

नीचे दिया गया स्क्रीनशॉट उस अनाम ब्लॉक को दर्शाता है जो SUB प्रकार को कॉल करता है और डिफ़ॉल्ट प्रबंधक आईडी सम्मिलित करता है।

सब_एम्प_ऑब्जेक्ट प्रकार को कॉल करने वाला अनाम ब्लॉक डिफ़ॉल्ट मैनेजर आईडी सम्मिलित करता है

DECLARE
guru_emp_det sub_emp_object;
BEGIN
guru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);
guru_emp_det.insert_default_mgr;
COMMIT;
END;
/

Code स्पष्टीकरण:

  • Code पंक्ति 25: 'guru_emp_det' को 'sub_emp_object' प्रकार के रूप में घोषित करना।
  • Code पंक्ति 27: ऑब्जेक्ट को इम्प्लिसिट कंस्ट्रक्टर से इनिशियलाइज़ किया जा रहा है। इस कंस्ट्रक्टर में 5 पैरामीटर हैं (पैरेंट टाइप के 4 एट्रीब्यूट और सब टाइप का 1 एट्रीब्यूट)। अंतिम पैरामीटर (1002) default_manager एट्रीब्यूट के लिए मान निर्धारित करता है।
  • Code पंक्ति 28: कंस्ट्रक्टर में पास किए गए डिफ़ॉल्ट मैनेजर आईडी के साथ रिकॉर्ड डालने के लिए 'insert_default_mgr' सदस्य को कॉल करना।

PL/SQL ऑब्जेक्ट्स की समानता

एक ही ऑब्जेक्ट प्रकार से संबंधित ऑब्जेक्ट इंस्टेंस की समानता की तुलना की जा सकती है। ऐसा करने के लिए, ऑब्जेक्ट प्रकार को ORDER नामक एक विशेष विधि की आवश्यकता होती है।

यह ORDER विधि एक फ़ंक्शन होनी चाहिए जो संख्यात्मक प्रकार का मान लौटाती है। यह इनपुट के रूप में दो पैरामीटर लेती है (पहला पैरामीटर: स्वयं ऑब्जेक्ट इंस्टेंस की आईडी; दूसरा पैरामीटर: किसी अन्य ऑब्जेक्ट इंस्टेंस की आईडी)।

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

  • एक धनात्मक मान यह दर्शाता है कि SELF ऑब्जेक्ट इंस्टेंस दूसरे इंस्टेंस से बड़ा है।
  • ऋणात्मक मान यह दर्शाता है कि SELF ऑब्जेक्ट इंस्टेंस अन्य इंस्टेंस से छोटा है।
  • शून्य यह दर्शाता है कि SELF ऑब्जेक्ट इंस्टेंस दूसरे इंस्टेंस के बराबर है।
  • यदि दोनों में से कोई भी इंस्टेंस null है, तो फ़ंक्शन null लौटाता है।

नीचे दिया गया स्क्रीनशॉट ORDER सदस्य फ़ंक्शन के सिंटैक्स को दर्शाता है जिसे समानता जांच के लिए टाइप बॉडी में शामिल किया जाना चाहिए।

ORDER सदस्य फ़ंक्शन का सिंटैक्स ऑब्जेक्ट इंस्टेंस की समानता की तुलना करने के लिए उपयोग किया जाता है।

CREATE TYPE BODY<object_type_name_ 1>AS OBJECT
(
  ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1)
  RETURN INTEGER IS
  BEGIN
    IF <attribute_name>parameter <attribute_name>THEN
      RETURN -1; --any negative number will do
    ELSIF id>c.id THEN
      RETURN 1; --any positive number will do
    ELSE
      RETURN 0;
    END IF;
  END;
  .
  .
);
/

वाक्यविन्यास स्पष्टीकरण:

  • ऊपर दिया गया सिंटैक्स ORDER फ़ंक्शन को दर्शाता है जिसे समानता की जांच के लिए टाइप बॉडी में शामिल किया जाना चाहिए।
  • इस फ़ंक्शन के लिए पैरामीटर समान ऑब्जेक्ट प्रकार का एक उदाहरण होना चाहिए।
  • इस फ़ंक्शन को “obj_instance_1.match(obj_instance_2)” के रूप में कॉल किया जा सकता है, और यह अभिव्यक्ति दिखाया गया संख्यात्मक मान लौटाती है, जहाँ obj_instance_1 और obj_instance_2 ऑब्जेक्ट प्रकार के इंस्टेंस हैं।

उदाहरण 1: निम्नलिखित उदाहरण में, हम दो ऑब्जेक्ट की तुलना करते हैं। हम दो इंस्टेंस बनाते हैं और उनके बीच 'वेतन' विशेषता की तुलना करते हैं। हम यह दो चरणों में करते हैं।

  • चरण 1: ऑब्जेक्ट प्रकार और बॉडी बनाएं।
  • चरण 2: ऑब्जेक्ट इंस्टेंस की तुलना करने के लिए अनाम ब्लॉक बनाएं।

चरण 1) ऑब्जेक्ट प्रकार और बॉडी बनाना।

नीचे दिए गए स्क्रीनशॉट emp_object_equality विनिर्देश और उसके बॉडी को दिखाते हैं, जो ORDER फ़ंक्शन को परिभाषित करता है जो वेतन विशेषता की तुलना करता है।

ORDER फ़ंक्शन के साथ emp_object_equality ऑब्जेक्ट प्रकार विनिर्देश बनाना emp_object_equality प्रकार के मुख्य भाग को परिभाषित करना जो वेतन विशेषता की तुलना करता है

CREATE TYPE emp_object_equality AS OBJECT(
salary NUMBER,
ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER);
/
CREATE TYPE BODY emp_object_equality AS
ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER 
IS
BEGIN
IF salary<c.salary
THEN RETURN -1;
ELSIF salary>c.salary
THEN RETURN 1;
ELSE
RETURN 0;
END IF;
END;
END;
/

Code स्पष्टीकरण:

  • Code पंक्ति 1-4: 'emp_object_equality' ऑब्जेक्ट प्रकार को 1 विशेषता और 1 सदस्य के साथ बनाया जा रहा है।
  • Code पंक्ति 6-16: ORDER फ़ंक्शन को परिभाषित करना जो SELF इंस्टेंस और पैरामीटर इंस्टेंस के 'वेतन' विशेषता की तुलना करता है। यह SELF वेतन कम होने पर ऋणात्मक मान, SELF वेतन अधिक होने पर धनात्मक मान और वेतन बराबर होने पर 0 लौटाता है।

Code आउटपुट:

प्रकार बनाया गया

चरण 2) ऑब्जेक्ट इंस्टेंस की तुलना करने के लिए अनाम ब्लॉक बनाना।

नीचे दिया गया स्क्रीनशॉट उस अनाम ब्लॉक को दर्शाता है जो वेतन के आधार पर दो emp_object_equality इंस्टेंस की तुलना करता है।

वेतन के आधार पर दो emp_object_equality इंस्टेंस की तुलना करने वाला अनाम ब्लॉक

DECLARE
l_obj_1 emp_object_equality;
l_obj_2 emp_object_equality;
BEGIN
l_obj_1:=emp_object_equality(15000); 
l_obj_2:=emp_object_equality(17000);
IF l_obj_1.equals(l_obj_2)>0
THEN
Dbms_output.put_line('Salary of first instance is greater');
ELSIF l_obj_1.equals(l_obj_2)<0
THEN
Dbms_output.put_line('Salary of second instance is greater'); 
ELSE
Dbms_output.put_line('Salaries are equal');
END IF;
END;
/

उत्पादन

Salary of second instance is greater

Code स्पष्टीकरण:

  • Code पंक्ति 20: 'emp_object_equality' प्रकार के 'l_obj_1' की घोषणा करना।
  • Code पंक्ति 21: 'emp_object_equality' प्रकार के 'l_obj_2' की घोषणा करना।
  • Code पंक्ति 23: 'l_obj_1' को वेतन मान '15000' से प्रारंभ किया जा रहा है।
  • Code पंक्ति 24: 'l_obj_2' को वेतन मान '17000' से प्रारंभ किया जा रहा है।
  • Code पंक्ति 25-33: ORDER फ़ंक्शन द्वारा लौटाए गए नंबर के आधार पर संदेश प्रिंट करना।

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

एक ऑब्जेक्ट प्रकार विशेषताओं और विधियों के साथ एक एकल वास्तविक-विश्व इकाई का मॉडल बनाता है। संग्रह एक VARRAY, नेस्टेड टेबल या एसोसिएटिव ऐरे में एक ही डेटाटाइप के कई तत्व होते हैं। ऑब्जेक्ट टाइप संरचना और व्यवहार का वर्णन करते हैं, जबकि कलेक्शन कई मानों को स्टोर करते हैं।

दोनों ऑब्जेक्ट इंस्टेंस की तुलना करते हैं। एक MAP विधि एक एकल स्केलर मान लौटाती है जो Oracle ऑब्जेक्ट्स को सॉर्ट करने या उनकी तुलना करने के लिए ORDER मेथड का उपयोग किया जाता है, जबकि ORDER मेथड दो इंस्टेंसेस की सीधे तुलना करता है और एक ऋणात्मक, शून्य या धनात्मक संख्या लौटाता है। एक टाइप केवल एक मेथड को परिभाषित कर सकता है, दोनों को नहीं।

हाँ। आप एक ऑब्जेक्ट टेबल बना सकते हैं जहाँ प्रत्येक पंक्ति एक ऑब्जेक्ट इंस्टेंस हो, या किसी ऑब्जेक्ट प्रकार को टेबल कॉलम के डेटाटाइप के रूप में उपयोग कर सकते हैं। इससे यह संभव होता है। Oracle संरचित वस्तुओं को केवल मेमोरी में रखने के बजाय सीधे डेटाबेस में सहेजा जाता है।

एक गैर-इंस्टैंशिएबल प्रकार सीधे ऑब्जेक्ट नहीं बना सकता; यह एक निरपेक्ष इकाई के रूप में कार्य करता है।tracयह एक ऐसा आधार है जिसे अन्य प्रकार विस्तारित करते हैं। NOT FINAL के साथ संयुक्त रूप से, यह एक सुपरटाइप को परिभाषित करता है जिसके सबटाइप इसके घोषित विधियों का ठोस कार्यान्वयन प्रदान करते हैं।

एट्रिब्यूट और मेथड जोड़ने या हटाने के लिए ALTER TYPE का उपयोग करें, आश्रित ऑब्जेक्ट को अपडेट करने के लिए CASCADE जोड़ें, और टाइप को हटाने के लिए DROP TYPE का उपयोग करें। टेबल या अन्य टाइप द्वारा उपयोग किए जा रहे टाइप को तब तक नहीं हटाया जा सकता जब तक कि उन आश्रितों को पहले हैंडल न कर लिया जाए।

टाइप के नाम जानने के लिए USER_TYPES और ALL_TYPES डेटा डिक्शनरी व्यू का उपयोग करें, और उनके एट्रिब्यूट और मेथड जानने के लिए USER_TYPE_ATTRS और USER_TYPE_METHODS व्यू का उपयोग करें। ये व्यू आपको सोर्स कोड पढ़े बिना किसी मौजूदा ऑब्जेक्ट मॉडल का ऑडिट करने की सुविधा देते हैं।

हां. गिटहब कोपिलॉट यह एक टिप्पणी से CREATE TYPE विनिर्देश, TYPE BODY विधियाँ, कंस्ट्रक्टर और ORDER फ़ंक्शन तैयार करता है। Revजनरेट किए गए टाइप को डिप्लॉय करने से पहले एट्रिब्यूट डेटाटाइप, कंस्ट्रक्टर पैरामीटर और इनहेरिटेंस क्लॉज़ की समीक्षा करें।

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

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