Oracle 在pl/sql中使用xmlelement获取所有关系表数据
我需要获取所有连接的表数据,同时获取xml格式的值 到目前为止,我可以生成如下的具体表格结果 表1Oracle 在pl/sql中使用xmlelement获取所有关系表数据,oracle,plsql,xmlelement,Oracle,Plsql,Xmlelement,我需要获取所有连接的表数据,同时获取xml格式的值 到目前为止,我可以生成如下的具体表格结果 表1 id name rollNo 1 aaa 10 2 bbb 15 表2 id rollNo div 1 10 a 2 15 b 查询 SELECT XMLElement("table1", XMLAttributes(t.id, t.name, t.rollno)) AS "RESULT" FROM table1 t whe
id name rollNo
1 aaa 10
2 bbb 15
表2
id rollNo div
1 10 a
2 15 b
查询
SELECT XMLElement("table1",
XMLAttributes(t.id, t.name, t.rollno))
AS "RESULT"
FROM table1 t where t.rollno=15
结果
<table1 id="2" name="bbb" rollno="15"></table1>
但通过这种方式,我只能获取特定表的数据。
我想通过外键获取与父表相关的所有表的xml数据
假设这里的表3与表1相关,或者表4与表3相关,这也应该是生成的xml。基本上,我在寻找完整的树
预期结果:
<table1 id="2" name="bbb" rollno="15"></table1>
<table2 id="2" rollno="15" div="b"></table2>
<table3.. and so on
您可以创建一个函数,该函数组合数据字典查询以查找父子关系,并使用DBMS_XMLGEN.GETXML
生成和组合XML
下面的函数获取一个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;
/
调用该函数很容易。当前版本没有以您想要的格式返回数据,您可能需要转换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>
您可以创建一个函数,该函数组合数据字典查询以查找父子关系,并使用DBMS_XMLGEN.GETXML
生成和组合XML
下面的函数获取一个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;
/
调用该函数很容易。当前版本没有以您想要的格式返回数据,您可能需要转换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>
谢谢你会尝试让你知道谢谢你会尝试让你知道