Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

lấy tất cả dữ liệu bảng quan hệ bằng cách sử dụng xmlelement trong pl / sql

Bạn có thể tạo một hàm kết hợp các truy vấn từ điển dữ liệu để tìm mối quan hệ mẹ-con và DBMS_XMLGEN.GETXML để tạo và kết hợp XML.

Hàm dưới đây nhận ROWID , tìm bảng cha và bảng con, đồng thời tạo XML cho các hàng có liên quan. Có rất nhiều giả định ở đây và điều này có thể mất một lượng lớn công việc để làm việc với dữ liệu thực.

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;
/

Gọi hàm rất dễ dàng. Phiên bản hiện tại không trả về dữ liệu ở định dạng chính xác mà bạn muốn, bạn có thể cần phải chuyển đổi 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>

Đây là lược đồ mẫu mà tôi đã sử dụng để tạo ra các kết quả ở trên. Đây là một lược đồ đơn giản, chỉ có một mối quan hệ cha-con, dựa trên một cột duy nhất có cùng tên trong cả hai bảng.

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. Cách giải quyết ORA-29913 với bảng bên ngoài

  2. Giảm 19 cột xuống 5 cột

  3. Chuyển CLOB thành NUMBER để so sánh - Oracle

  4. oracle bỏ qua lỗi định danh không hợp lệ trong truy vấn con

  5. Cách định cấu hình Máy chủ WebLogic cho Eclipse hiện có