Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

pl/sql में xmlelement का उपयोग करके सभी रिलेशनल टेबल डेटा प्राप्त करें

आप एक ऐसा फ़ंक्शन बना सकते हैं जो अभिभावक-बाल संबंधों और DBMS_XMLGEN.GETXML को खोजने के लिए डेटा डिक्शनरी क्वेरी को जोड़ती है। एक्सएमएल उत्पन्न और संयोजित करने के लिए।

नीचे दिया गया फ़ंक्शन एक ROWID लेता है , पैरेंट और चाइल्ड टेबल ढूंढता है, और प्रासंगिक पंक्तियों के लिए XML बनाता है। यहां कई धारणाएं हैं, और वास्तविक डेटा के साथ काम करने में बड़ी मात्रा में काम लग सकता है।

create or replace function get_related_xml(p_rowid rowid) return xmltype is
    v_child_table_owner varchar2(128);
    v_child_table_name varchar2(128);

    v_parent_table_owner varchar2(128);
    v_parent_table_name varchar2(128);
    v_column varchar2(128);

    v_child_xml xmltype;
    v_parent_xml xmltype;
    v_combined_xml xmltype;
begin
    --Get child table directly referenced by ROWID.
    select owner, object_name
    into v_child_table_owner, v_child_table_name
    from all_objects
    where object_type = 'TABLE'
        and object_id = dbms_rowid.rowid_object(p_rowid);

    --Get parent table based on child table ROWID, and join columns.
    --(ASSUMPTION: Tables only have one column, with the same name, that joins the tables.)
    select owner, table_name, column_name
    into v_parent_table_owner, v_parent_table_name, v_column
    from all_cons_columns
        where (owner, constraint_name) in
        (
            --Foreign key constraints based on the relevant table.
            select r_owner, r_constraint_name
            from all_constraints
            where constraint_type = 'R'
                and (owner, table_name) in
                (
                    --Table referenced by ROWID.
                    select owner, object_name
                    from all_objects
                    where object_type = 'TABLE'
                        and object_id = dbms_rowid.rowid_object(p_rowid)
                )
        );

    --Generate child XML.
    v_child_xml := dbms_xmlgen.getXMLType
        (
            'select c.*
            from '||v_child_table_owner||'.'||v_child_table_name||' c
            join '||v_parent_table_owner||'.'||v_parent_table_name||' p
                on c.'||v_column||' = p.'||v_column||'
            where c.rowid = '''||p_rowid||''''
        );

    --Generate parent XML.
    v_parent_xml := dbms_xmlgen.getXMLType
        (
            'select p.*
            from '||v_child_table_owner||'.'||v_child_table_name||' c
            join '||v_parent_table_owner||'.'||v_parent_table_name||' p
                on c.'||v_column||' = p.'||v_column||'
            where c.rowid = '''||p_rowid||''''
        );

    --Combine the XML and return them.
    select xmlconcat(v_child_xml, v_parent_xml)
    into v_combined_xml
    from dual;

    return v_combined_xml;
end get_related_xml;
/

फ़ंक्शन को कॉल करना आसान है। वर्तमान संस्करण डेटा को ठीक उसी प्रारूप में नहीं लौटाता है जैसा आप चाहते हैं, आपको एक्सएमएल को बदलने की आवश्यकता हो सकती है।

select get_related_xml(rowid)
from table1
where rollno=15;

<ROWSET>
 <ROW>
  <ID>2</ID>
  <NAME>bbb</NAME>
  <ROLLNO>15</ROLLNO>
 </ROW>
</ROWSET>
<ROWSET>
 <ROW>
  <ID>2</ID>
  <ROLLNO>15</ROLLNO>
  <DIV>b</DIV>
 </ROW>
</ROWSET>

यहाँ नमूना स्कीमा है जिसका उपयोग मैंने उपरोक्त परिणाम उत्पन्न करने के लिए किया था। यह एक साधारण स्कीमा है, जिसमें केवल एक माता-पिता-बच्चे के संबंध हैं, जो एक एकल स्तंभ पर आधारित है जिसका नाम दोनों तालिकाओं में समान है।

create table table2(id number primary key, rollNo number unique, div varchar2(100));
insert into table2
select 1, 10, 'a' from dual union all
select 2, 15, 'b' from dual;

create table table1(id number primary key, name varchar2(100), rollNo number,
    constraint table1_fk foreign key (rollNo) references table2(rollNo));
insert into table1
select 1, 'aaa', 10 from dual union all
select 2, 'bbb', 15 from dual;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle दो तिथियों के बीच स्ट्रिंग के रूप में स्वरूपित दिनांक प्राप्त करें

  2. Oracle RAC और अनुक्रम

  3. सिस्टम () रिटर्न -1, त्रुटि =10 जब ओरेकल में लॉग इन किया जाता है

  4. पीएल/एसक्यूएल ब्लॉक में एक अद्वितीय बाधा त्रुटि कैसे पकड़ें?

  5. दो कॉलम में अधिकतम मान वाले रिकॉर्ड का चयन कैसे करें?