sql >> Database teknologi >  >> RDS >> Oracle

få alle relationelle tabeller data ved hjælp af xmlelement i pl/sql

Du kan oprette en funktion, der kombinerer dataordbogsforespørgsler for at finde forældre-underordnede relationer og DBMS_XMLGEN.GETXML at generere og kombinere XML.

Nedenstående funktion tager en ROWID , finder den overordnede og underordnede tabel og genererer XML for de relevante rækker. Der er mange antagelser her, og det kan kræve en enorm mængde arbejde at få arbejdet med rigtige data.

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

Det er nemt at ringe til funktionen. Den aktuelle version returnerer ikke data i præcis det format, du ønsker, du skal muligvis transformere 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>

Her er prøveskemaet, jeg brugte til at generere ovenstående resultater. Dette er et simpelt skema, med kun én forældre-barn-relation, baseret på en enkelt kolonne, der har samme navn i begge tabeller.

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. Hvor henter mysql_ssl_rsa_setup OpenSSL-filer?

  2. Eksempler på JDBC-erklæringer – Indsæt, Slet, Opdater, Vælg Record

  3. Sammenkæd/flet matrixværdier under gruppering/aggregering

  4. Globale Temp-tabeller - SQL Server vs Oracle