2011-08-03 23 views
6

पर इम्प्रोड फ़ंक्शन के लिए पीएल/एसक्यूएल क्या पीएल/एसक्यूएल में एक इंपोडोड रूटीन बनाने का कोई तरीका है जो पैरामीटर के रूप में कोई कस्टम डेटाटाइप लेता है और कुछ निर्दिष्ट स्ट्रिंग द्वारा सीमित सदस्यों को जोड़ता है?कस्टम प्रकार

उदाहरण के लिए, कहते हैं कि मैं निम्न प्रकार है:

CREATE TYPE myPerson AS OBJECT(
    forename VARCHAR2(50), 
    surname VARCHAR2(50), 
    age  NUMBER 
); 

फिर, का कहना है कि एक समारोह प्रकार myPerson की एक वस्तु देता है, लेकिन मैं स्तंभों को एक साथ concatenated हैं:

SELECT implode(getPerson(1234),'$$') from dual; 

वापस लौटने के लिए (इस संकलित उदाहरण में डेटा का अनुमान लगाया गया है):

John$$Doe$$55 

जहां डिलीमीटर को वैकल्पिक पैरामीटर के रूप में निर्दिष्ट किया जा सकता है, लेकिन पहले पैरामीटर का प्रकार कुछ भी हो सकता है (आवश्यक नहीं myPerson)।

उत्तर

7

आपकी कस्टम डेटाटाइप विधियों का समर्थन कर सकती है और विधियों में पैरामीटर हो सकते हैं।

CREATE TYPE myPerson AS OBJECT( 
    forename VARCHAR2(50), 
    surname VARCHAR2(50), 
    age  NUMBER, 

    MEMBER FUNCTION 
    get_record(pGlue IN varchar2) RETURN VARCHAR2); 

CREATE TYPE BODY myPerson 
AS 
    MEMBER FUNCTION get_record(pGlue varchar2) RETURN VARCHAR2 

IS 
BEGIN 
RETURN forename || pGlue || surname || pGlue || age ; 
END get_record; 

END; 
4

यह इन तार से निपटने, विरासत और बहुरूपता का उपयोग करके की एक सामान्य तरीके का निर्माण संभव है। यदि हम वस्तुओं का उपयोग करने जा रहे हैं, तो हमें ऑब्जेक्ट-ऑरिनेटेड प्रोग्रामिंग की क्षमताओं का लाभ उठाना चाहिए।

सबसे पहले हमें रूट ऑब्जेक्ट की आवश्यकता है। यह प्रकार तत्काल नहीं है, जिसका अर्थ है कि हम वास्तव में इसका एक उदाहरण घोषित नहीं कर सकते हैं। ध्यान दें कि TO_STRING() सदस्य फ़ंक्शन को INSTANTIABLE के रूप में भी घोषित नहीं किया गया है। इसका अर्थ यह है कि STRINGABLE_TYPE से प्राप्त होने वाले किसी भी प्रकार के पास विधि का अपना कार्यान्वयन होना चाहिए।

SQL> create or replace type stringable_type as object 
    2  (id number(7,0) 
    3   , NOT INSTANTIABLE member function to_string 
    4       return varchar2 
    5  ) 
    6 not final not instantiable 
    7/

Type created. 

SQL> 

यहाँ एक प्रकार है जो STRINGABLE_TYPE से विरासत है। ओवरराइडिंग कीवर्ड अनिवार्य है, भले ही माता-पिता के प्रकार की घोषणा हमें लागू करने के लिए मजबूर करती है।

SQL> create or replace type emp_type under stringable_type 
    2 (empno number(7,0) 
    3  , ename varchar2(20) 
    4  , sal number(7,2) 
    5  , OVERRIDING member function to_string 
    6       return varchar2 
    7  ); 
    8/

Type created. 

SQL> create or replace type body emp_type 
    2 is 
    3  OVERRIDING member function to_string 
    4       return varchar2 
    5  is 
    6  begin 
    7   return 'EMP>>'||self.id||'='||self.empno||'::'||self.ename||'::'||self.sal; 
    8  end; 
    9 end; 
10/

Type body created. 

SQL> 

इधर, एक अन्य प्रकार

SQL> create or replace type dept_type under stringable_type 
    2 (deptno number(2,0) 
    3  , dname varchar2(30) 
    4  , OVERRIDING member function to_string 
    5       return varchar2 
    6  ); 
    7/

Type created. 

SQL> create or replace type body dept_type 
    2 is 
    3  OVERRIDING member function to_string 
    4       return varchar2 
    5  is 
    6  begin 
    7   return 'DEPT>>'||self.id||'='||self.deptno||'::'||self.dname; 
    8  end; 
    9 end; 
10/

Type body created. 

SQL> 

है ... अब हम एक समारोह जो सामान्य प्रकार लेता है और सामान्य विधि को आमंत्रित कर सकते हैं: के चमत्कार के माध्यम से

SQL> create or replace function type_to_string 
    2  (p_obj in stringable_type) 
    3  return varchar2 
    4 is 
    5 begin 
    6  return p_obj.to_string(); 
    7 end; 
    8/

Function created. 

SQL> 

polymorphism हम समारोह में दो अलग-अलग वस्तुओं को पारित कर सकते हैं, जो वास्तव में ओवरराइडिंग विधि निष्पादित करेगा:

SQL> set serveroutput on 
SQL> declare 
    2  obj1 emp_type; 
    3  obj2 dept_type; 
    4 begin 
    5  obj1 := emp_type(1, 8000, 'VAN WIJK', 3500); 
    6  obj2 := dept_type(2, 20, 'COMMUNICATIONS'); 
    7  dbms_output.put_line(type_to_string(obj1)); 
    8  dbms_output.put_line(type_to_string(obj2)); 
    9 end; 
10/
EMP>>1=8000::VAN WIJK::3500 
DEPT>>2=20::COMMUNICATIONS 

PL/SQL procedure successfully completed. 

SQL> 

इस बिंदु पर पहुंचने के लिए यह काफी काम है। ओरेकल के प्रकार में कम से कम एक सारणी TO_STRING() में बेक्ड होने पर यह साफ होगा, जिसे हम केवल ओवरराइड कर सकते हैं। लेकिन यह उनके ऑब्जेक्ट कार्यान्वयन में कई ढीले सिरों में से एक है 8-)

+0

ऑब्जेक्ट प्रकारों का ग्रेट विरासत उदाहरण! –

संबंधित मुद्दे