आप एक ऐसा फ़ंक्शन बना सकते हैं जो अभिभावक-बाल संबंधों और 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;