XMLType.schemavalidate() results in LSX-00310

I have the following problem: I want to insert schemabased XML documents into a XMLType column. Since XMLType offers the schemavalidate() method, I want it to check the document if it is correct.
However, the check always ends in a LSX-00310 Error (local element or attribute should be namespace qualified), although other tools like XMLSPY tell me that the document is fine.
I can't figure out if there is something wrong in the way I registered the schema since it appears to me that the parser can't resolve the namespace for my schema. The script for the schema registration looks like this:
Register schema
declare
doc varchar2(5000) := '
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdb="http://xmlns.oracle.com/xdb">
<xs:element name="MeisterSklaveSzenario" xdb:defaultTable="MeisterSklaveSzenario">
<!-- list of all existing objects for the MeisterSklaveSzenario -->
<xs:complexType>
<xs:sequence>
<xs:element name="Meister" type="MeisterType" maxOccurs="unbounded"/>
<xs:element name="Sklave" type="SklaveType" maxOccurs="unbounded"/>
<xs:element name="MeisterProfil" type="MeisterProfilType" maxOccurs="unbounded"/>
<xs:element name="SklaveProfil" type="SklaveProfilType" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
<!-- key definitions within the range of root-element MeisterSklaveSzenario -->
<xs:key name="MeisterKey">
<xs:selector xpath=".//Meister"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="MeisterProfilKey">
<xs:selector xpath=".//MeisterProfil"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="SklaveKey">
<xs:selector xpath=".//Sklave"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="SklaveProfilKey">
<xs:selector xpath=".//SklaveProfil"/>
<xs:field xpath="@id"/>
</xs:key>
<!-- key reference definitions within the range of root-element MeisterSklaveSzenario -->
<xs:keyref name="besitztRef" refer="SklaveKey">
<xs:selector xpath=".//Meister/besitzt"/>
<xs:field xpath="@idref"/>
</xs:keyref>
<xs:keyref name="hatMeisterProfilRef" refer="MeisterProfilKey">
<xs:selector xpath=".//Meister/hatMeisterProfil"/>
<xs:field xpath="@idref"/>
</xs:keyref>
<xs:keyref name="hatSklaveProfilRef" refer="SklaveProfilKey">
<xs:selector xpath=".//Sklave/hatSklaveProfil"/>
<xs:field xpath="@idref"/>
</xs:keyref>
</xs:element>
<!-- definitions of the used complexTypes -->
<xs:complexType name="MeisterType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Vermoegen" type="xs:integer"/>
<xs:element name="besitzt" maxOccurs="4">
<xs:complexType>
<xs:attribute name="idref" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="hatMeisterProfil">
<xs:complexType>
<xs:attribute name="idref" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
<xs:complexType name="SklaveType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Alter" type="xs:positiveInteger"/>
<xs:element name="hatSklaveProfil">
<xs:complexType>
<xs:attribute name="idref" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
<xs:complexType name="MeisterProfilType">
<xs:sequence>
<xs:element name="Gemeinheit">
<xs:simpleType>
<xs:restriction base="xs:short">                    <xs:minInclusive value="1"/>
<xs:maxInclusive value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Wahnsinnigkeit">
<xs:simpleType>
<xs:restriction base="xs:short">                    <xs:minInclusive value="1"/>
<xs:maxInclusive value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
<xs:complexType name="SklaveProfilType">
<xs:sequence>
<xs:element name="Aufgabe" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="Wert" type="xs:positiveInteger"/>
</xs:sequence>
<xs:attribute name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:schema>
begin
dbms_xmlschema.registerSchema('http://www.chrisch.org/MeisterSklaveSzenario', doc);
end;
The script file I want to insert a sample file with looks like this:
Sample File
insert into Szenario2 values ('Klogg',XMLType(
'<?xml version="1.0" encoding="UTF-8"?>
<MeisterSklaveSzenario
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.chrisch.org/MeisterSklaveSzenario"
id="1">
<Meister id="1">
<Name>Zarniwoop</Name>
<Vermoegen>500000</Vermoegen>
<besitzt idref="1"/>
<hatMeisterProfil idref="2"/>
</Meister>
<Sklave id="1">
<Name>Quosl</Name>
<Alter>31</Alter>
<hatSklaveProfil idref="1"/>
</Sklave>
<MeisterProfil id="1">
<Gemeinheit>7</Gemeinheit>
<Wahnsinnigkeit>3</Wahnsinnigkeit>
</MeisterProfil>
<SklaveProfil id="1">
<Aufgabe>Rumrennen</Aufgabe>
<Aufgabe>Saubermachen</Aufgabe>
<Wert>341</Wert>
</SklaveProfil>
</MeisterSklaveSzenario>
'));

Will need your schema and document to debug this. Sometimes we catch things SPY doesn't and sometime they catch things we miss...

Similar Messages

  • LSX-00310: local element or attribute should be namespace qualified

    I am getting the following error
    ORA-31154: invalid XML document
    ORA-19202: Fout in XML-verwerking (
    LSX-00310: local element or attribute should be namespace qualified)
    I am doing
    declare
    l_xmldoc XMLType;
    BEGIN
    l_xmldoc := xdburiType('/home/1.xml').getXML();
    l_xmldoc.schemavalidate;
    END;
    the schema and xml file are valid , I checked them
    with xmlspy
    does this error mean
    thanx Edwin

    Will need your schema and document to debug this. Sometimes we catch things SPY doesn't and sometime they catch things we miss...

  • Schemavalidate gives lsx-00023 intermittently, reporting garbage namespace

    I am getting the error "LSX-00023: unknown namespace URI" intermittently from xmltype.schemavalidate. The URI shown in the error message is a series of garbage characters, usually starting with 4 'y's with umlauts (must be a name for that, but I don't know it), then a series of other characters mostly not generally found on my keyboard, other accented characters, squares, etc. The error may or may not happen on identical XML, I can sit with PL/SQL Developer hitting execute on the same script and it usually shows the error the first time, then may work fine for 4, 6, 8 executions before failing again. The XML is valid, I can validate it with other tools, here's a sample:
    <?xml version="1.0" standalone="yes"?>
    <metadata version="1.0" xmlns="http://schemas.syp.police.uk/actionMetadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <plan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="bailPlanType" taskType="BRREQ">
    <custodySerialNumber>652897</custodySerialNumber>
    <custodyReference>
    <bcu>H</bcu>
    <number>1332</number>
    <year>2009</year>
    </custodyReference>
    <bailedPerson>
    <bailedPersonSerialNumber>NOM-1234567</bailedPersonSerialNumber>
    <name>
    <surname>XXXX</surname>
    <firstName>YYYY</firstName>
    <middleName>ZZZZ</middleName>
    </name>
    <dateOfBirth>1985-03-21</dateOfBirth>
    <pncNumber xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    </bailedPerson>
    </plan>
    <action xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="bailReleaseRequestActionType" taskType="BRREQ">
    <bail>
    <id>522687</id>
    <officerInCase>
    <ns3:officerSerialNumber xmlns:ns3="http://schemas.syp.police.uk/common">39211</ns3:officerSerialNumber>
    <ns3:name xmlns:ns3="http://schemas.syp.police.uk/common">
    <ns3:surname>AAAA</ns3:surname>
    <ns3:firstName>BBBB</ns3:firstName>
    <ns3:middleName/>
    </ns3:name>
    <ns3:sex xmlns:ns3="http://schemas.syp.police.uk/common">MALE</ns3:sex>
    <ns3:rank xmlns:ns3="http://schemas.syp.police.uk/common">DS</ns3:rank>
    <ns3:collarNumber xmlns:ns3="http://schemas.syp.police.uk/common">956</ns3:collarNumber>
    <ns3:employeeReferenceNumber xmlns:ns3="http://schemas.syp.police.uk/common">006301</ns3:employeeReferenceNumber>
    <ns3:unit xmlns:ns3="http://schemas.syp.police.uk/common">A</ns3:unit>
    </officerInCase>
    <bailedTo>
    <code>H1</code>
    <description>ABCDEFG</description>
    </bailedTo>
    <dateTimeSurrender>2009-04-01T09:00:00</dateTimeSurrender>
    </bail>
    <releaseRequest>
    <requester>
    <id>3400055</id>
    <name>AAA, BBBB, CCCC</name>
    </requester>
    <responder>
    <id>35927</id>
    <name>TEST-CASELOAD</name>
    </responder>
    <reason>qqq</reason>
    <evidenceOfAuthority>aaa</evidenceOfAuthority>
    </releaseRequest>
    </action>
    </metadata>
    Any ideas on how to proceed would be appreciated. I also notice that when I write out the xml with dbms_output.put_line, it always stops part way through the xml (after the <description> element), not sure if that might be related.

    I have now submitted this to Oracle as a service request.
    It seems to be somehow related to the client, though I don't see how since the code is executing on the server, and all the data is there, the client is just calling a package procedure, passing a number. The error only seems to happen when using a windows client, whether SQLPlus, PL/SQL developer or JDBC (Oracle Thin driver). I've tried several XP machines, both 32 & 64 bit, both of which show the problem. When running the same thing on sqlplus running on the database host (which is running Solaris), or via JDBC from an application server (running Red Hat), I don't see the error.

  • Unexpected result from XMLELEMENT() - nothing but XMLTYPE()

    In testing XML DB thru SQL*PLUS under an Oracle 9.2 environment, I issued following query:
    <QueryStatement>
    SELECT XMLELEMENT("Name", p.name) as "Result" FROM PROD_PERIODS p
    </QueryStatement>
    But it returned nothing but following message that contain only "XMLTYPE()":
    <ReturnedMessage>
    Result()
    XMLTYPE()
    XMLTYPE()
    </ReturnedMessage>
    The table PROD_PERIODS does contain data for the test, which has been proved by removing the XMLELEMENT() function call.
    Is there any setting should have been done before hand?
    Any hints will be highly appreciated!
    Thanks!
    Spenser

    Hi Mark,
    Thanks for the hint and yes you're right the SQL*PLUS I was using, v8.1.7, is not XML aware.
    Regards,
    Spenser

  • Seems taht XMLType.toObject() doesn't work well ...

    Hello,
    We are trying to convert XML file into XMLType object and then to our custom object type using registered XSD definition. So we doing this : clob with xml -> XMLObject -> our MMS_T object.
    The problem we experienced with transfering values of "type" and "status" attributes to object values MMS_T.TYPE and MMS_T.STATUS. Note that types MMS_T and ERROR_T are automatically created during schema
    (XSD) registration. See and try Listing 1.
    The second Listing contains anonymous pl/sql block with our testcase, please run it after registering schema. The output You will get should look like this one :
    Schema based
    Well-formed
    <?xml version="1.0" encoding="UTF-8"?>
    <mms-provisioning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xdb="http://xmlns.oracle.com/xdb"
    type="subscription"
    status="error">
    <error code="1">Some error</error>
    <serviceID>iDnes</ser
    Type:,Status:,Error:1-Some error,ServiceID:iDnes,Method:SMS,MSISDN:+420602609903
    The problem is visible on the last line, where "Type" and "Status" object attributes should have its values that should come from XML, but they haven't. Where we were wrong ?
    Please help,
    Thanks & Regards,
    Radim.
    Note
    ====
    When we are trying to do xml.schemaValidate() in our example, it raises folowong errors :
    ORA-31154: invalid XML document
    ORA-19202: Error occurred in XML processing
    LSX-00310: local element or attribute should be namespace qualified
    ORA-06512: at "SYS.XMLTYPE", line 0
    ORA-06512: at line 27
    Listing 1
    =========
    declare
    xsd clob:=
    '<?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xdb="http://xmlns.oracle.com/xdb"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    xdb:mapStringToNCHAR="false"
    xdb:mapUnboundedStringToLob="false"
    xdb:storeVarrayAsTable="false"
    >
         <xs:element name="mms-provisioning" xdb:SQLType="MMS_T">
              <xs:complexType>
                   <xs:sequence>
                        <xs:element name="error" minOccurs="0" xdb:SQLName="ERROR" xdb:SQLType="ERROR_T">
                             <xs:complexType>
                                  <xs:simpleContent>
                                       <xs:extension base="xs:string">
                                            <xs:attribute name="code" type="xs:decimal" use="required" xdb:SQLName="CODE" xdb:SQLType="NUMBER"/>
                                       </xs:extension>
                                  </xs:simpleContent>
                             </xs:complexType>
                        </xs:element>
                        <xs:element name="serviceID" type="xs:string" xdb:SQLName="SERVICEID" xdb:SQLType="VARCHAR2"/>
                        <xs:element name="method" type="xs:string" xdb:SQLName="METHOD" xdb:SQLType="VARCHAR2"/>
                        <xs:element name="msisdn" type="xs:string" xdb:SQLName="MSISDN" xdb:SQLType="VARCHAR2"/>
                   </xs:sequence>
                   <xs:attribute name="type" type="type_t" use="required" xdb:SQLName="TYP" xdb:SQLType="VARCHAR2"/>
                   <xs:attribute name="status" type="status_t" use="required" xdb:SQLName="STATUS" xdb:SQLType="VARCHAR2"/>
              </xs:complexType>
         </xs:element>
         <xs:simpleType name="status_t">
              <xs:restriction base="xs:string">
                   <xs:maxLength value="30"/>
                   <xs:enumeration value="new"/>
                   <xs:enumeration value="pending"/>
                   <xs:enumeration value="subscribed"/>
                   <xs:enumeration value="error"/>
              </xs:restriction>
         </xs:simpleType>
         <xs:simpleType name="type_t">
              <xs:restriction base="xs:string">
              <xs:maxLength value="30"/>
              <xs:enumeration value="subscription"/>
              <xs:enumeration value="unsubscription"/>
              </xs:restriction>
         </xs:simpleType>
    </xs:schema>';
    begin
    dbms_XMLSchema.RegisterSchema (
    SchemaURL => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd',
    SchemaDoc => xsd
    end;
    Listing 2
    =========
    declare
    o mms_t;
    doc clob :=
    '<?xml version="1.0" encoding="UTF-8"?>
    <mms-provisioning type="subscription" status="error">
         <error code="1">Some error</error>
         <serviceID>iDnes</serviceID>
         <method>SMS</method>
         <msisdn>+420602608696</msisdn>
    </mms-provisioning>';
    xml XMLType;
    begin
    xml := XMLType.createXML(XMLData => doc,schema => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd');
    if xml.isSchemaBased() = 1 then
    dbms_output.put_line('Schema based');
    else
    dbms_output.put_line('Non-Schema based');
    end if;
    if xml.isFragment() = 1 then
    dbms_output.put_line('Fragment');
    else
    dbms_output.put_line('Well-formed');
    end if;
    --Crashes with errors
    --xml.schemaValidate();
    dbms_output.put_line(substr(xml.getstringval(),1,255));
    xml.toObject(o,schema => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd', element => 'mms-provisioning');
    dbms_output.put_line(
    'Type:'||o.typ||
    ',Status:'||o.status||
    ',Error:'||o.error.code||'-'||o.error.sys_xdbbody$||
    ',ServiceID:'||o.serviceid||
    ',Method:'||o.method||
    ',MSISDN:'||o.msisdn);
    end;
    /

    Hello,
    We are trying to convert XML file into XMLType object and then to our custom object type using registered XSD definition. So we doing this : clob with xml -> XMLObject -> our MMS_T object.
    The problem we experienced with transfering values of "type" and "status" attributes to object values MMS_T.TYPE and MMS_T.STATUS. Note that types MMS_T and ERROR_T are automatically created during schema
    (XSD) registration. See and try Listing 1.
    The second Listing contains anonymous pl/sql block with our testcase, please run it after registering schema. The output You will get should look like this one :
    Schema based
    Well-formed
    <?xml version="1.0" encoding="UTF-8"?>
    <mms-provisioning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xdb="http://xmlns.oracle.com/xdb"
    type="subscription"
    status="error">
    <error code="1">Some error</error>
    <serviceID>iDnes</ser
    Type:,Status:,Error:1-Some error,ServiceID:iDnes,Method:SMS,MSISDN:+420602609903
    The problem is visible on the last line, where "Type" and "Status" object attributes should have its values that should come from XML, but they haven't. Where we were wrong ?
    Please help,
    Thanks & Regards,
    Radim.
    Note
    ====
    When we are trying to do xml.schemaValidate() in our example, it raises folowong errors :
    ORA-31154: invalid XML document
    ORA-19202: Error occurred in XML processing
    LSX-00310: local element or attribute should be namespace qualified
    ORA-06512: at "SYS.XMLTYPE", line 0
    ORA-06512: at line 27
    Listing 1
    =========
    declare
    xsd clob:=
    '<?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xdb="http://xmlns.oracle.com/xdb"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    xdb:mapStringToNCHAR="false"
    xdb:mapUnboundedStringToLob="false"
    xdb:storeVarrayAsTable="false"
    >
         <xs:element name="mms-provisioning" xdb:SQLType="MMS_T">
              <xs:complexType>
                   <xs:sequence>
                        <xs:element name="error" minOccurs="0" xdb:SQLName="ERROR" xdb:SQLType="ERROR_T">
                             <xs:complexType>
                                  <xs:simpleContent>
                                       <xs:extension base="xs:string">
                                            <xs:attribute name="code" type="xs:decimal" use="required" xdb:SQLName="CODE" xdb:SQLType="NUMBER"/>
                                       </xs:extension>
                                  </xs:simpleContent>
                             </xs:complexType>
                        </xs:element>
                        <xs:element name="serviceID" type="xs:string" xdb:SQLName="SERVICEID" xdb:SQLType="VARCHAR2"/>
                        <xs:element name="method" type="xs:string" xdb:SQLName="METHOD" xdb:SQLType="VARCHAR2"/>
                        <xs:element name="msisdn" type="xs:string" xdb:SQLName="MSISDN" xdb:SQLType="VARCHAR2"/>
                   </xs:sequence>
                   <xs:attribute name="type" type="type_t" use="required" xdb:SQLName="TYP" xdb:SQLType="VARCHAR2"/>
                   <xs:attribute name="status" type="status_t" use="required" xdb:SQLName="STATUS" xdb:SQLType="VARCHAR2"/>
              </xs:complexType>
         </xs:element>
         <xs:simpleType name="status_t">
              <xs:restriction base="xs:string">
                   <xs:maxLength value="30"/>
                   <xs:enumeration value="new"/>
                   <xs:enumeration value="pending"/>
                   <xs:enumeration value="subscribed"/>
                   <xs:enumeration value="error"/>
              </xs:restriction>
         </xs:simpleType>
         <xs:simpleType name="type_t">
              <xs:restriction base="xs:string">
              <xs:maxLength value="30"/>
              <xs:enumeration value="subscription"/>
              <xs:enumeration value="unsubscription"/>
              </xs:restriction>
         </xs:simpleType>
    </xs:schema>';
    begin
    dbms_XMLSchema.RegisterSchema (
    SchemaURL => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd',
    SchemaDoc => xsd
    end;
    Listing 2
    =========
    declare
    o mms_t;
    doc clob :=
    '<?xml version="1.0" encoding="UTF-8"?>
    <mms-provisioning type="subscription" status="error">
         <error code="1">Some error</error>
         <serviceID>iDnes</serviceID>
         <method>SMS</method>
         <msisdn>+420602608696</msisdn>
    </mms-provisioning>';
    xml XMLType;
    begin
    xml := XMLType.createXML(XMLData => doc,schema => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd');
    if xml.isSchemaBased() = 1 then
    dbms_output.put_line('Schema based');
    else
    dbms_output.put_line('Non-Schema based');
    end if;
    if xml.isFragment() = 1 then
    dbms_output.put_line('Fragment');
    else
    dbms_output.put_line('Well-formed');
    end if;
    --Crashes with errors
    --xml.schemaValidate();
    dbms_output.put_line(substr(xml.getstringval(),1,255));
    xml.toObject(o,schema => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd', element => 'mms-provisioning');
    dbms_output.put_line(
    'Type:'||o.typ||
    ',Status:'||o.status||
    ',Error:'||o.error.code||'-'||o.error.sys_xdbbody$||
    ',ServiceID:'||o.serviceid||
    ',Method:'||o.method||
    ',MSISDN:'||o.msisdn);
    end;
    /

  • [9i] poor performance with XMLType.transform

    Hello,
    I've got a problem with the Oracle function XMLType.transform.
    When I try to apply a XSL to a big XML, it is very very slow, and it evens consumes all the CPU, and other users are not able to work until the processing is complete...
    So I was wondering if my XSL was corrupted, but it does not seem so, because when i apply it with Internet Explorer (by just double-clicking on the .xml), it is immediately applied. I've also even tried with oraxsl, and the processing is quick and good.
    So, i tried to use XDB, but it does not work, maybe I should upgrade to a newer version of XDB?
    Please find the ZIP file here :
    http://perso.modulonet.fr/~tleoutre/Oracle/samples.zip
    Please find in this file :
    1) The XSL file k_xsl.xsl
    2) The "big" XML file big_xml.xml
    Here you can try to apply the XSL on the XML with Internet Explorer : processing is very quick...
    3) The batch file transform.bat
    Here you can launch it, it calls oraxsl, and produces a result very quickly...
    4) The SQL file test_xsl_with_xmltype_transform.sql.
    You can try to launch it... First, it applies the same XSL with a little XML, and it's OK... And then, it applies the XSL to the same big XML as in point 1), and then, it takes a lot of time and CPU...
    5) The SQL file test_xsl_with_xdb_1.sql ...
    On my server, it fails... So I tried to change the XSL in the next point :
    6) The SQL file test_xsl_with_xdb_2.sql with a "cleaned" XSL...
    And then, it fails with exactly the same problem as in :
    TransformerConfigurationException  (Unknown expression at EOF: *|/.)
    Any help would be greatly appreciated!
    Thank you!
    P.S. : Sorry for my bad english, I'm a French man :-)

    This is what I see...
    Your tests are measuring the wrong thing. You are measuring the time to create the sample documents, which is being done very innefficiently, as well
    as the time take to do the transform.
    Below is the correct way to get mesasurements for each task..
    Here's what I see on a PIV 2.4Ghz with 10.2.0.2.0 and 2GB of RAM
    Fragments SourceSize  TargetSize createSource       Parse     Transform
            50      28014      104550  00:00:00.04 00:00:00.04   00:00:00.12
           100      55964      209100  00:00:00.03 00:00:00.05   00:00:00.23
           500     279564     1045500  00:00:00.16 00:00:00.23   00:00:01.76
          1000     559064     2091000  00:00:00.28 00:00:00.28   00:00:06.04
          2000    1118064     4182000  00:00:00.34 00:00:00.42   00:00:24.43
          5000    2795064    10455000  00:00:00.87 00:00:02.02   00:03:19.02I think this clearly shows the pattern.
    Of course what this testing really shows is that you've clearly missed the point of performing XSLT transformation inside the database.
    The idea behind database based transformation is to optimize XSLT processing by
    (1), not having to parse the XML and build a DOM tree before commencing the XSLT processing. In this example this is not possible since the
    XML is being created from a CLOB based XMLType, not a schema based XMLType.
    (2) Leveraging the Lazily Loaded Virtual DOM when doing sparse transformation ( A Sparse transformation is one where there are large parts of the
    source document that are not required to create the target document. Again in this case the XSL requires you to walk all the nodes to generate the
    required output.
    If is necessary to process all of the nodes in the source document to generate the entire output it probably makes more sense to use a midtier XSL engine.
    Here's the code I used to generate the numbers in the above example
    BTW in terms of BIG XML we've successully processed 12G documents with Schema Based Storage...So nothing you have hear comes any where our defintion of big.- 1 with Oracle 10g Express on Linux
    Also, please remember that 9.2.0.1.0 is not a supported release for any XML DB related features.
    SQL*Plus: Release 10.2.0.2.0 - Production on Fri Feb 10 07:44:59 2006
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> spool createDocument.log
    SQL> --
    SQL> connect &1/&2
    Connected.
    SQL> --
    SQL> create or replace directory &1 as '&3'
      2  /
    old   1: create or replace directory &1 as '&3'
    new   1: create or replace directory SCOTT as '/home/mdrake/bugs/xslTest'
    Directory created.
    SQL> drop table source_data_table
      2  /
    Table dropped.
    SQL> create table source_data_table
      2  (
      3    fragCount number,
      4    xml_text  clob,
      5    xml       xmlType,
      6    result    clob
      7  )
      8  /
    Table created.
    SQL> create or replace procedure createDocument(fragmentCount number)
      2  as
      3    fragmentText clob :=
      4  '<AFL LIGNUM="1999">
      5    <mat>20000001683</mat>
      6    <name>DOE</name>
      7    <firstname>JOHN</firstname>
      8    <name2>JACK</name2>
      9    <SEX>MALE</SEX>
    10    <birthday>1970-05-06</birthday>
    11    <salary>5236</salary>
    12    <code1>5</code1>
    13    <code2>6</code2>
    14    <code3>7</code3>
    15    <date>2006-05-06</date>
    16    <dsp>8.665</dsp>
    17    <dsp_2000>455.45</dsp_2000>
    18    <darr04>5.3</darr04>
    19    <darvap04>6</darvap04>
    20    <rcrr>8</rcrr>
    21    <rcrvap>9</rcrvap>
    22    <rcrvav>10</rcrvav>
    23    <rinet>11.231</rinet>
    24    <rmrr>12</rmrr>
    25    <rmrvap>14</rmrvap>
    26    <ro>15</ro>
    27    <rr>189</rr>
    28    <date2>2004-05-09</date2>
    29  </AFL>';
    30
    31    xmlText CLOB;
    32
    33  begin
    34    dbms_lob.createTemporary(xmlText,true,DBMS_LOB.CALL);
    35    dbms_lob.write(xmlText,5,1,'<PRE>');
    36    for i in 1..fragmentCount loop
    37       dbms_lob.append(xmlText,fragmentText);
    38    end loop;
    39    dbms_lob.append(xmlText,xmlType('<STA><COD>TER</COD><MSG>Op?ation R?ssie</MSG></STA>').getClobVal());
    40    dbms_lob.append(xmlText,'</PRE>');
    41    insert into source_data_table (fragCount,xml_text) values (fragmentCount, xmlText);
    42    commit;
    43    dbms_lob.freeTemporary(xmlText);
    44  end;
    45  /
    Procedure created.
    SQL> show errors
    No errors.
    SQL> --
    SQL> set timing on
    SQL> --
    SQL> call createDocument(50)
      2  /
    Call completed.
    Elapsed: 00:00:00.04
    SQL> call createDocument(100)
      2  /
    Call completed.
    Elapsed: 00:00:00.03
    SQL> call createDocument(500)
      2  /
    Call completed.
    Elapsed: 00:00:00.16
    SQL> call createDocument(1000)
      2  /
    Call completed.
    Elapsed: 00:00:00.28
    SQL> call createDocument(2000)
      2  /
    Call completed.
    Elapsed: 00:00:00.34
    SQL> call createDocument(5000)
      2  /
    Call completed.
    Elapsed: 00:00:00.87
    SQL> select fragCount dbms_lob.getLength(xmlText)
      2    from sample_data_table
      3  /
    select fragCount dbms_lob.getLength(xmlText)
    ERROR at line 1:
    ORA-00923: FROM keyword not found where expected
    Elapsed: 00:00:00.00
    SQL> quit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    SQL*Plus: Release 10.2.0.2.0 - Production on Fri Feb 10 07:45:01 2006
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> spool testcase_&3..log
    SQL> --
    SQL> connect &1/&2
    Connected.
    SQL> --
    SQL> set timing on
    SQL> --
    SQL> update source_data_table
      2     set xml = xmltype(xml_text)
      3   where fragCount = &3
      4  /
    old   3:  where fragCount = &3
    new   3:  where fragCount = 50
    1 row updated.
    Elapsed: 00:00:00.04
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.01
    SQL> update source_data_table
      2     set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
      3   where fragCount = &3
      4  /
    old   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    new   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'k_xsl.xsl'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    old   3:  where fragCount = &3
    new   3:  where fragCount = 50
    1 row updated.
    Elapsed: 00:00:00.12
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.01
    SQL> select fragCount, dbms_lob.getLength(xml_text),dbms_lob.getLength(result)
      2    from source_data_table
      3  /
    FRAGCOUNT DBMS_LOB.GETLENGTH(XML_TEXT) DBMS_LOB.GETLENGTH(RESULT)
            50                        28014                     104550
           100                        55964
           500                       279564
          1000                       559064
          2000                      1118064
          5000                      2795064
    6 rows selected.
    Elapsed: 00:00:00.01
    SQL> quit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    SQL*Plus: Release 10.2.0.2.0 - Production on Fri Feb 10 07:45:02 2006
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> spool testcase_&3..log
    SQL> --
    SQL> connect &1/&2
    Connected.
    SQL> --
    SQL> set timing on
    SQL> --
    SQL> update source_data_table
      2     set xml = xmltype(xml_text)
      3   where fragCount = &3
      4  /
    old   3:  where fragCount = &3
    new   3:  where fragCount = 100
    1 row updated.
    Elapsed: 00:00:00.05
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.01
    SQL> update source_data_table
      2     set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
      3   where fragCount = &3
      4  /
    old   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    new   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'k_xsl.xsl'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    old   3:  where fragCount = &3
    new   3:  where fragCount = 100
    1 row updated.
    Elapsed: 00:00:00.23
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.03
    SQL> select fragCount, dbms_lob.getLength(xml_text),dbms_lob.getLength(result)
      2    from source_data_table
      3  /
    FRAGCOUNT DBMS_LOB.GETLENGTH(XML_TEXT) DBMS_LOB.GETLENGTH(RESULT)
            50                        28014                     104550
           100                        55964                     209100
           500                       279564
          1000                       559064
          2000                      1118064
          5000                      2795064
    6 rows selected.
    Elapsed: 00:00:00.01
    SQL> quit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    SQL*Plus: Release 10.2.0.2.0 - Production on Fri Feb 10 07:45:02 2006
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> spool testcase_&3..log
    SQL> --
    SQL> connect &1/&2
    Connected.
    SQL> --
    SQL> set timing on
    SQL> --
    SQL> update source_data_table
      2     set xml = xmltype(xml_text)
      3   where fragCount = &3
      4  /
    old   3:  where fragCount = &3
    new   3:  where fragCount = 500
    1 row updated.
    Elapsed: 00:00:00.12
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.03
    SQL> update source_data_table
      2     set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
      3   where fragCount = &3
      4  /
    old   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    new   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'k_xsl.xsl'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    old   3:  where fragCount = &3
    new   3:  where fragCount = 500
    1 row updated.
    Elapsed: 00:00:01.76
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.00
    SQL> select fragCount, dbms_lob.getLength(xml_text),dbms_lob.getLength(result)
      2    from source_data_table
      3  /
    FRAGCOUNT DBMS_LOB.GETLENGTH(XML_TEXT) DBMS_LOB.GETLENGTH(RESULT)
            50                        28014                     104550
           100                        55964                     209100
           500                       279564                    1045500
          1000                       559064
          2000                      1118064
          5000                      2795064
    6 rows selected.
    Elapsed: 00:00:00.00
    SQL> quit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    SQL*Plus: Release 10.2.0.2.0 - Production on Fri Feb 10 07:45:04 2006
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> spool testcase_&3..log
    SQL> --
    SQL> connect &1/&2
    Connected.
    SQL> --
    SQL> set timing on
    SQL> --
    SQL> update source_data_table
      2     set xml = xmltype(xml_text)
      3   where fragCount = &3
      4  /
    old   3:  where fragCount = &3
    new   3:  where fragCount = 1000
    1 row updated.
    Elapsed: 00:00:00.28
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.01
    SQL> update source_data_table
      2     set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
      3   where fragCount = &3
      4  /
    old   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    new   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'k_xsl.xsl'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    old   3:  where fragCount = &3
    new   3:  where fragCount = 1000
    1 row updated.
    Elapsed: 00:00:06.04
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.00
    SQL> select fragCount, dbms_lob.getLength(xml_text),dbms_lob.getLength(result)
      2    from source_data_table
      3  /
    FRAGCOUNT DBMS_LOB.GETLENGTH(XML_TEXT) DBMS_LOB.GETLENGTH(RESULT)
            50                        28014                     104550
           100                        55964                     209100
           500                       279564                    1045500
          1000                       559064                    2091000
          2000                      1118064
          5000                      2795064
    6 rows selected.
    Elapsed: 00:00:00.00
    SQL> quit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    SQL*Plus: Release 10.2.0.2.0 - Production on Fri Feb 10 07:45:11 2006
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> spool testcase_&3..log
    SQL> --
    SQL> connect &1/&2
    Connected.
    SQL> --
    SQL> set timing on
    SQL> --
    SQL> update source_data_table
      2     set xml = xmltype(xml_text)
      3   where fragCount = &3
      4  /
    old   3:  where fragCount = &3
    new   3:  where fragCount = 2000
    1 row updated.
    Elapsed: 00:00:00.42
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.02
    SQL> update source_data_table
      2     set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
      3   where fragCount = &3
      4  /
    old   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    new   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'k_xsl.xsl'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    old   3:  where fragCount = &3
    new   3:  where fragCount = 2000
    1 row updated.
    Elapsed: 00:00:24.43
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.03
    SQL> select fragCount, dbms_lob.getLength(xml_text),dbms_lob.getLength(result)
      2    from source_data_table
      3  /
    FRAGCOUNT DBMS_LOB.GETLENGTH(XML_TEXT) DBMS_LOB.GETLENGTH(RESULT)
            50                        28014                     104550
           100                        55964                     209100
           500                       279564                    1045500
          1000                       559064                    2091000
          2000                      1118064                    4182000
          5000                      2795064
    6 rows selected.
    Elapsed: 00:00:00.00
    SQL> quit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    SQL*Plus: Release 10.2.0.2.0 - Production on Fri Feb 10 07:45:36 2006
    Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.
    SQL> spool testcase_&3..log
    SQL> --
    SQL> connect &1/&2
    Connected.
    SQL> --
    SQL> set timing on
    SQL> --
    SQL> update source_data_table
      2     set xml = xmltype(xml_text)
      3   where fragCount = &3
      4  /
    old   3:  where fragCount = &3
    new   3:  where fragCount = 5000
    1 row updated.
    Elapsed: 00:00:02.02
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.05
    SQL> update source_data_table
      2     set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
      3   where fragCount = &3
      4  /
    old   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'&4'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    new   2:    set result = xmltransform(xml,xmltype(bfilename(USER,'k_xsl.xsl'),nls_charset_id('WE8ISO8859P1'))).getClobVal()
    old   3:  where fragCount = &3
    new   3:  where fragCount = 5000
    1 row updated.
    Elapsed: 00:03:19.02
    SQL> commit
      2  /
    Commit complete.
    Elapsed: 00:00:00.01
    SQL> select fragCount, dbms_lob.getLength(xml_text),dbms_lob.getLength(result)
      2    from source_data_table
      3  /
    FRAGCOUNT DBMS_LOB.GETLENGTH(XML_TEXT) DBMS_LOB.GETLENGTH(RESULT)
            50                        28014                     104550
           100                        55964                     209100
           500                       279564                    1045500
          1000                       559064                    2091000
          2000                      1118064                    4182000
          5000                      2795064                   10455000
    6 rows selected.
    Elapsed: 00:00:00.04
    SQL> quit
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
    With the Partitioning, OLAP and Data Mining options
    bash-2.05b$

  • Constraints on a XMLTYPE table

    Hi,
    Has anyone been able to construct constraints on a XMLTYPE table as shown on page 5-52 of the XDB Developers
    guide.
    Whatever I try I get errors:
    create table poc_wip2 of xmltype
    element "http://www.derwent.co.uk/wpi.xsd#WPI"
    (unique(XMLDATA.WPI_TYPE.BibPt2645_T.co))
    (unique(XMLDATA.WPI_TYPE.BibPt2645_T.co))
    ERROR at line 3:
    ORA-00922: missing or invalid option
    create table poc_wip2 p of xmltype
    element "http://www.derwent.co.uk/wpi.xsd#WPI"
    (unique(extract(value(p),/WPI/BibPt@co')))
    create table poc_wip2 p of xmltype
    ERROR at line 1:
    ORA-00922: missing or invalid option
    What I would like to be able to do is to define a primary key constraint based on three attribute values. Is this possible
    using XMLTYPE?
    Thanks
    Pete

    Peter
    Remember that the attribute names generated from the Schema are case sensitive bu SQL is not. You will have to use something like XMLDATA.WPI_TYPE."BibPt2645_T"."co" in the constraint definition
    It may be easier to create the table via registerSchema and then alter the constraint onto the table..
    EG.
    alter table purchaseorder
    add constraint REFERENCE_IS_UNIQUE
    unique (xmldata."Reference")
    alter table purchaseorder
    add constraint USER_IS_VALID
    foreign key (xmldata."User") references SCOTT.emp(ename)
    create trigger VALIDATE_PURCHASEORDER
    before insert on purchaseorder
    for each row
    declare
    XMLDATA xmltype;
    begin
    XMLDATA := :new.sys_nc_rowinfo$;
    xmltype.schemavalidate(XMLDATA);
    end;
    --quit
    The reason for this is that if you want to keep a table created from a schema in_sync with the resource view you need to call
    dbms_xdbz.enableHierarchy(SCHEMA,TABLE) after creating the table..

  • APPENDCHILDXML, XMLType, Working with XML

    Hi, i woud like to ask whats the best way to create a xml document in oracle. I've been researching and what i have come up with is this:
    insert into R_BD_SS_XML_SP (MSGXML, IDSP, TIME_S) values ('<API_SP_SOAP_OUT></API_SP_SOAP_OUT>', v_numCons, sysdate);
    dadosAvaria := dbms_xmlgen.newContext('SELECT Id_Avaria, num_posto from t_avarias');
    DBMS_XMLGen.setRowTag(dadosAvaria, 'R_Acti_API_SP');
    result := DBMS_XMLQuery.getXML(dadosAvaria);
    v_final := sys.xmltype.createXML(result);
    UPDATE R_BD_SS_XML_SP SET MENSAGEMXML = APPENDCHILDXML(documento,'API_SP_SOAP_OUT', v_final);
    This seems a good aproach to me, but it doesn't recognise the APPENDCHILDXML function. I took this function from [this site|http://www.psoug.org/reference/xml_functions.html].
    What am i doing wrong?
    Best Regards
    JoĂŁo Lopes

    I think this thread answeres my question
    APPENDCHILDXML for ORACLE 9i DATABASE
    thank you

  • How to map XML to database object ?

    Hello,
    We are trying to convert XML file into XMLType object and then to our custom object type using registered XSD definition. So we doing this : clob with xml -> XMLObject -> our MMS_T object.
    The problem we experienced with transfering values of "type" and "status" attributes to object values MMS_T.TYPE and MMS_T.STATUS. Note that types MMS_T and ERROR_T are automatically created during schema
    (XSD) registration. See and try Listing 1.
    The second Listing contains anonymous pl/sql block with our testcase, please run it after registering schema. The output You will get should look like this one :
    Schema based
    Well-formed
    <?xml version="1.0" encoding="UTF-8"?>
    <mms-provisioning xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xdb="http://xmlns.oracle.com/xdb" type="subscription"
    status="error">
    <error code="1">Some error</error>
    <serviceID>iDnes</ser
    Type:,Status:,Error:1-Some error,ServiceID:iDnes,Method:SMS,MSISDN:+420602609903
    The problem is visible on the last line, where "Type" and "Status" object attributes should have its values that should come from XML, but they haven't. Where we were wrong ?
    Please help,
    Thanks & Regards,
    Radim.
    Note
    ====
    When we are trying to do xml.schemaValidate() in our example, it raises folowong errors :
    ORA-31154: invalid XML document
    ORA-19202: Error occurred in XML processing
    LSX-00310: local element or attribute should be namespace qualified
    ORA-06512: at "SYS.XMLTYPE", line 0
    ORA-06512: at line 27
    Listing 1
    =========
    declare
    xsd clob:=
    '<?xml version="1.0" encoding="UTF-8"?>
    <xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    xdb:mapStringToNCHAR="false"
    xdb:mapUnboundedStringToLob="false"
    xdb:storeVarrayAsTable="false"
    >
    <xs:element name="mms-provisioning" xdb:SQLType="MMS_T">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="error" minOccurs="0" xdb:SQLName="ERROR" xdb:SQLType="ERROR_T">
    <xs:complexType>
    <xs:simpleContent>
    <xs:extension base="xs:string">
    <xs:attribute name="code" type="xs:decimal" use="required" xdb:SQLName="CODE" xdb:SQLType="NUMBER"/>
    </xs:extension>
    </xs:simpleContent>
    </xs:complexType>
    </xs:element>
    <xs:element name="serviceID" type="xs:string" xdb:SQLName="SERVICEID" xdb:SQLType="VARCHAR2"/>
    <xs:element name="method" type="xs:string" xdb:SQLName="METHOD" xdb:SQLType="VARCHAR2"/>
    <xs:element name="msisdn" type="xs:string" xdb:SQLName="MSISDN" xdb:SQLType="VARCHAR2"/>
    </xs:sequence>
    <xs:attribute name="type" type="type_t" use="required" xdb:SQLName="TYP" xdb:SQLType="VARCHAR2"/>
    <xs:attribute name="status" type="status_t" use="required" xdb:SQLName="STATUS" xdb:SQLType="VARCHAR2"/>
    </xs:complexType>
    </xs:element>
    <xs:simpleType name="status_t">
    <xs:restriction base="xs:string">
    <xs:maxLength value="30"/>
    <xs:enumeration value="new"/>
    <xs:enumeration value="pending"/>
    <xs:enumeration value="subscribed"/>
    <xs:enumeration value="error"/>
    </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="type_t">
    <xs:restriction base="xs:string">
    <xs:maxLength value="30"/>
    <xs:enumeration value="subscription"/>
    <xs:enumeration value="unsubscription"/>
    </xs:restriction>
    </xs:simpleType>
    </xs:schema>';
    begin
    dbms_XMLSchema.RegisterSchema (
    SchemaURL => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd', SchemaDoc => xsd
    end;
    Listing 2
    =========
    declare
    o mms_t;
    doc clob :=
    '<?xml version="1.0" encoding="UTF-8"?>
    <mms-provisioning type="subscription" status="error">
    <error code="1">Some error</error>
    <serviceID>iDnes</serviceID>
    <method>SMS</method>
    <msisdn>+420602608696</msisdn>
    </mms-provisioning>';
    xml XMLType;
    begin
    xml := XMLType.createXML(XMLData => doc,schema => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd'); --
    if xml.isSchemaBased() = 1 then
    dbms_output.put_line('Schema based');
    else
    dbms_output.put_line('Non-Schema based');
    end if;
    if xml.isFragment() = 1 then
    dbms_output.put_line('Fragment');
    else
    dbms_output.put_line('Well-formed');
    end if;
    --Crashes with errors
    --xml.schemaValidate();
    dbms_output.put_line(substr(xml.getstringval(),1,255));
    xml.toObject(o,schema => 'http://www.eurotel.cz/xsd/mms-provisioning.xsd', element => 'mms-provisioning');
    dbms_output.put_line(
    'Type:'||o.typ||
    ',Status:'||o.status||
    ',Error:'||o.error.code||'-'||o.error.sys_xdbbody$||
    ',ServiceID:'||o.serviceid||
    ',Method:'||o.method||
    ',MSISDN:'||o.msisdn);
    end;
    /

    thanks for the reply
    my source XML response will be looking something like this (it will be reponsed in a long string):
    <?xml version='1.0' encoding='UTF-8'?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
    <SOAP-ENV:Header>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
    <status>
    <retCode>00</retCode>
    <retCodeDesc>OK</retCodeDesc>
    <rRobjectId>09002347802d2981</rRobjectId>
    <rFileSize>7</rFileSize>
    <rTotalPages>1</rTotalPages>
    </status>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    my RFC is:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:sap-com:document:sap:rfc:functions" targetNamespace="urn:sap-com:document:sap:rfc:functions">
    <xsd:element name="ZRFC_SET_DOCUMENT.Response">
    <xsd:complexType>
    <xsd:all>
    <xsd:element name="RETCODE" type="xsd:string" minOccurs="0" />
    <xsd:element name="RETCODEDESC" type="xsd:string" minOccurs="0" />
    <xsd:element name="RFILESIZE" type="xsd:string" minOccurs="0" />
    <xsd:element name="RROJECTID" type="xsd:string" minOccurs="0" />
    <xsd:element name="RTOTALPAGES" type="xsd:string" minOccurs="0" />
    </xsd:all>
    </xsd:complexType>
    </xsd:element>
    </xsd:schema>

  • WhiteSpace collapse

    Does 10gR2 (EE/XE) support the 'whiteSpace value="collapse"' restriction in schema definitions? I would have expected an instance string of this subtype being trimmed after xmltype.schemavalidate() - but it is not!?
    TIA,
    Herbert

    Well,
    hope this meets your need: Here goes a very simple XSD snippet:
    <xsd:element name="GebindeID">
    <xsd:simpleType>
    <xsd:restriction base="xsd:string">
    <xsd:maxLength value="3"/>
    <xsd:whiteSpace value="collapse"/>
    </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
    I did a dbms_xmlschema.registerschema without generating types.
    An instance gets loaded via schemabound xmltype.createxml, followed by schemavalidate. Then the string is retrieved via extract('...').getStringVal.
    Leading and trailing blanks remain. Contiguous blanks are not reduced to one. E.g. '1 1' with two blanks is accepted with string length of four while '12 1' with one blank results in a LSX-00222 as expected.
    I test with XE 10.2.0.1. After some days I should be able to test on EE 10.2.0.3.
    Thanks,
    Herbert

  • DBMS_XMLSCHEMA.CopyEvolve produces ORA-30945: Could not create mapping tabl

    Hi,
    I am trying to update a XML Schema concerning the documents relaties.xsd (the old one) and relaties_v2.xsd (the new one containing only a minor change).
    The document relaties.xsd looks like this:
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xdb="http://xmlns.oracle.com/xdb"
    elementFormDefault="unqualified"
    attributeFormDefault="unqualified"
    version="1.0">
         <xsd:element name="Relatie" xdb:defaultTable="">
              <xsd:complexType>
                   <xsd:sequence>
                        <xsd:element name="Voornaam" type="xsd:string"/>
                        <xsd:element name="Achternaam" type="xsd:string"/>
                        <xsd:element name="Tussenvoegsel" type="xsd:string"/>
                        <xsd:element name="Geboortedatum" type="xsd:date"/>
                        <xsd:element name="Geslacht">
    <xsd:simpleType>
    <xsd:restriction base="xsd:string">
    <xsd:enumeration value="M"/>
    <xsd:enumeration value="V"/>
    </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
                        <xsd:element name="Sofinummer">
    <xsd:simpleType>
    <xsd:restriction base="xsd:string">
    <xsd:pattern value="\d{9}"/>
    </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
                        <xsd:element name="Straatnaam" type="xsd:string"/>
                        <xsd:element name="Huisnummer" type="xsd:string"/>
                        <xsd:element name="Woonplaats" type="xsd:string"/>
                        <!--xsd:element name="Postcode" type="xsd:string"/-->
                        <xsd:element name="Postcode">
    <xsd:simpleType>
    <xsd:restriction base="xsd:string">
    <xsd:pattern value="\d{4} [A-Z]{2}"/>
    </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
                        <xsd:element name="Zrn">
    <xsd:simpleType>
    <xsd:restriction base="xsd:integer">
    <xsd:minInclusive value="1000000"/>
    <xsd:maxInclusive value="99999999999999"/>
    </xsd:restriction>
    </xsd:simpleType>
    </xsd:element>
                   </xsd:sequence>
              </xsd:complexType>
         </xsd:element>
    </xsd:schema>
    Here are the steps I took.
    DECLARE
    res BOOLEAN;
    BEGIN
    res := DBMS_XDB.createResource('/xsd/relaties.xsd',
    bfilename('XSDDIR', 'relaties.xsd')
    END;
    DECLARE
    res BOOLEAN;
    BEGIN
    res := DBMS_XDB.createResource('/xsd/relaties_v2.xsd',
    bfilename('XSDDIR', 'relaties_v2.xsd')
    END;
    BEGIN
    DBMS_XMLSCHEMA.registerSchema(
    'http://localhost:8080/xsd/relaties.xsd',
    XDBURIType('/xsd/relaties.xsd').getClob(),
    TRUE,
    FALSE,
    FALSE,
    TRUE);
    END;
    CREATE
    TABLE relatie_documenten OF XMLTYPE
    XMLSCHEMA "http://localhost:8080/xsd/relaties.xsd"
    ELEMENT "Relatie"
    CREATE OR REPLACE
    TRIGGER upo_rdt_ai
    AFTER INSERT ON relatie_documenten
    FOR EACH ROW
    DECLARE
    doc XMLType;
    BEGIN
    doc := :new.SYS_NC_ROWINFO$;
    XMLType.schemaValidate(doc);
    END;
    Then I inserted some xml documents into the table relatie_documenten. The XSD worked fine.
    Then I executed the following statement:
    BEGIN
    DBMS_XMLSCHEMA.copyEvolve
    ( schemaURLs => xdb$string_list_t('http://localhost:8080/xsd/relaties.xsd')
    , newSchemas => XMLSequenceType(XDBURIType('/xsd/relaties_v2.xsd').getXML())
    , preserveOldDocs => TRUE
    , mapTabName => 'RELATIE_DOCUMENTEN_TEMP'
    , generateTables => FALSE
    END;
    This resulted in:
    ERROR at line 1:
    ORA-30945: Could not create mapping table 'RELATIE_DOCUMENTEN_TEMP'
    ORA-00600: internal error code, arguments: [kqludp2], [0x66AB407C], [0], [],
    ORA-06512: at "XDB.DBMS_XMLSCHEMA_INT", line 113
    ORA-06512: at "XDB.DBMS_XMLSCHEMA", line 210
    ORA-06512: at line 2
    I checked system priviliges as documented in XML DB Developers Guide, Chapter 8 XML Schema Evolution. No other users were connected. The mapping table RELATIE_DOCUMENTEN_TEMP nor any other object named RELATIE_DOCUMENTEN_TEMP did not exist.
    Anyone an idea why I cannot create my mapping table ?
    Gregor

    Which release / platform are you working with
    With 10.2.0.2.1 on Widows I get
    SQL> var schemaURL varchar2(256)
    SQL> var schemaPath varchar2(256)
    SQL> --
    SQL> begin
      2    :schemaURL := 'http://localhost:8080/xsd/relaties.xsd';
      3    :schemaPath := '/public/relaties.xsd';
      4  end;
      5  /
    PL/SQL procedure successfully completed.
    SQL> call dbms_xmlSchema.deleteSchema(:schemaURL,4)
      2  /
    Call completed.
    SQL> declare
      2    res boolean;
      3    xmlSchema xmlType := xmlType(
      4  '<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      5              xmlns:xdb="http://xmlns.oracle.com/xdb"
      6                 elementFormDefault="unqualified"
      7                 attributeFormDefault="unqualified"
      8                 version="1.0">
      9     <xsd:element name="Relatie" xdb:defaultTable="">
    10             <xsd:complexType>
    11                     <xsd:sequence>
    12                             <xsd:element name="Voornaam" type="xsd:string"/>
    13                             <xsd:element name="Achternaam" type="xsd:string"/>
    14                             <xsd:element name="Tussenvoegsel" type="xsd:string"/>
    15                             <xsd:element name="Geboortedatum" type="xsd:date"/>
    16                             <xsd:element name="Geslacht">
    17                 <xsd:simpleType>
    18                    <xsd:restriction base="xsd:string">
    19                       <xsd:enumeration value="M"/>
    20                       <xsd:enumeration value="V"/>
    21                    </xsd:restriction>
    22                 </xsd:simpleType>
    23              </xsd:element>
    24                     <xsd:element name="Sofinummer">
    25                 <xsd:simpleType>
    26                    <xsd:restriction base="xsd:string">
    27                       <xsd:pattern value="\d{9}"/>
    28                    </xsd:restriction>
    29                 </xsd:simpleType>
    30              </xsd:element>
    31                             <xsd:element name="Straatnaam" type="xsd:string"/>
    32                             <xsd:element name="Huisnummer" type="xsd:string"/>
    33                             <xsd:element name="Woonplaats" type="xsd:string"/>
    34                             <!--xsd:element name="Postcode" type="xsd:string"/-->
    35                             <xsd:element name="Postcode">
    36                 <xsd:simpleType>
    37                    <xsd:restriction base="xsd:string">
    38                       <xsd:pattern value="\d{4} [A-Z]{2}"/>
    39                    </xsd:restriction>
    40                 </xsd:simpleType>
    41              </xsd:element>
    42                             <xsd:element name="Zrn">
    43                 <xsd:simpleType>
    44                    <xsd:restriction base="xsd:integer">
    45                       <xsd:minInclusive value="1000000"/>
    46                       <xsd:maxInclusive value="99999999999999"/>
    47                    </xsd:restriction>
    48                 </xsd:simpleType>
    49              </xsd:element>
    50                     </xsd:sequence>
    51             </xsd:complexType>
    52     </xsd:element>
    53  </xsd:schema>');
    54  begin
    55    if (dbms_xdb.existsResource(:schemaPath)) then
    56      dbms_xdb.deleteResource(:schemaPath);
    57    end if;
    58    res := dbms_xdb.createResource(:schemaPath,xmlSchema);
    59  end;
    60  /
    PL/SQL procedure successfully completed.
    SQL> BEGIN
      2    DBMS_XMLSCHEMA.registerSchema(
      3      :schemaURL,
      4      XDBURIType(:schemaPath).getClob(),
      5      TRUE,
      6      FALSE,
      7      FALSE,
      8      TRUE);
      9  END;
    10  /
    PL/SQL procedure successfully completed.
    SQL> DROP TABLE relatie_documenten FORCE
      2  /
    Table dropped.
    SQL> CREATE TABLE relatie_documenten OF XMLTYPE
      2         XMLSCHEMA "http://localhost:8080/xsd/relaties.xsd"
      3         ELEMENT "Relatie"
      4  /
    Table created.
    SQL> CREATE OR REPLACE TRIGGER upo_rdt_ai
      2  AFTER INSERT ON relatie_documenten
      3  FOR EACH ROW
      4  DECLARE
      5     doc XMLType;
      6  BEGIN
      7     doc := :new.SYS_NC_ROWINFO$;
      8     XMLType.schemaValidate(doc);
      9  END;
    10  /
    Trigger created.
    SQL> INSERT
      2  INTO   relatie_documenten
      3  VALUES (XMLType
      4           ('<Relatie>
      5                <Voornaam>Johan</Voornaam>
      6                <Achternaam>Hermans</Achternaam>
      7                <Tussenvoegsel/>
      8                <Geboortedatum>1978-01-02</Geboortedatum>
      9                <Geslacht>M</Geslacht>
    10                <Sofinummer>233300417</Sofinummer>
    11                <Straatnaam>Stationstraat</Straatnaam>
    12                <Huisnummer>10</Huisnummer>
    13                <Woonplaats>Weesp</Woonplaats>
    14                <Postcode>1383 AK</Postcode>
    15                <Zrn>1234567</Zrn>
    16             </Relatie>'
    17          ).CreateSchemaBasedXML(:schemaURL))
    18  /
    1 row created.
    SQL> commit
      2  /
    Commit complete.
    SQL> INSERT
      2  INTO   relatie_documenten
      3  VALUES (XMLType
      4           ('<Relatie>
      5                <Voornaam>Johanna</Voornaam>
      6                <Achternaam>Gurts</Achternaam>
      7                <Tussenvoegsel/>
      8                <Geboortedatum>1975-11-12</Geboortedatum>
      9                <Geslacht>V</Geslacht>
    10                <Sofinummer>234109807</Sofinummer>
    11                <Straatnaam>Stationstraat</Straatnaam>
    12                <Huisnummer>10</Huisnummer>
    13                <Woonplaats>Weesp</Woonplaats>
    14                <Postcode>1383 AK</Postcode>
    15                <Zrn>7654321</Zrn>
    16             </Relatie>').CreateSchemaBasedXML(:schemaURL))
    17  /
    1 row created.
    SQL> commit
      2  /
    Commit complete.
    SQL> INSERT
      2  INTO   relatie_documenten
      3  VALUES (XMLType
      4           ('<Relatie>
      5                <Voornaam>Johanna</Voornaam>
      6                <Achternaam>Gurts</Achternaam>
      7                <Tussenvoegsel/>
      8                <Geboortedatum>1975-11-12</Geboortedatum>
      9                <Geslacht>O</Geslacht>
    10                <Sofinummer>234109807</Sofinummer>
    11                <Straatnaam>Stationstraat</Straatnaam>
    12                <Huisnummer>10</Huisnummer>
    13                <Woonplaats>Weesp</Woonplaats>
    14                <Postcode>1383 AK</Postcode>
    15                <Zrn>7654321</Zrn>
    16             </Relatie>').CreateSchemaBasedXML(:schemaURL))
    17  /
    VALUES (XMLType
    ERROR at line 3:
    ORA-31038: Invalid enumeration value: "O"
    ORA-06512: at "SYS.XMLTYPE", line 345
    ORA-06512: at "SCOTT.UPO_RDT_AI", line 5
    ORA-04088: error during execution of trigger 'SCOTT.UPO_RDT_AI'
    SQL> commit
      2  /
    Commit complete.
    SQL> declare
      2    xmlschema xmltype;
      3    res       boolean;
      4  begin
      5    select xdburitype(:schemaPath).getXML()
      6      into xmlSchema
      7      from dual;
      8    dbms_xdb.deleteResource(:schemaPath);
      9    select insertChildXML
    10           (
    11             xmlschema,
    12             '/xsd:schema//xsd:element[@name="Geslacht"]/xsd:simpleType/xsd:restriction',
    13             'xsd:enumeration',
    14             xmltype('<xsd:enumeration xmlns:xsd="http://www.w3.org/2001/XMLSchema" value="O"/>'),
    15             'xmlns:xsd="http://www.w3.org/2001/XMLSchema"'
    16           )
    17    into xmlSchema
    18    from dual;
    19    res := dbms_xdb.createResource(:schemaPath,xmlSchema);
    20  end;
    21  /
    PL/SQL procedure successfully completed.
    SQL> commit
      2  /
    Commit complete.
    SQL> set long 100000 pages 200 lines 140
    SQL> --
    SQL> select xdburitype(:schemaPath).getXML()
      2    from dual
      3  /
    XDBURITYPE(:SCHEMAPATH).GETXML()
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" elementFormDefault="unqualified" attributeF
    ormDefault="unqualified" version="1.0">
      <xsd:element name="Relatie" xdb:defaultTable="">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Voornaam" type="xsd:string"/>
            <xsd:element name="Achternaam" type="xsd:string"/>
            <xsd:element name="Tussenvoegsel" type="xsd:string"/>
            <xsd:element name="Geboortedatum" type="xsd:date"/>
            <xsd:element name="Geslacht">
              <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                  <xsd:enumeration value="M"/>
                  <xsd:enumeration value="V"/>
                  <xsd:enumeration xmlns:xsd="http://www.w3.org/2001/XMLSchema" value="O"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
            <xsd:element name="Sofinummer">
              <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                  <xsd:pattern value="\d{9}"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
            <xsd:element name="Straatnaam" type="xsd:string"/>
            <xsd:element name="Huisnummer" type="xsd:string"/>
            <xsd:element name="Woonplaats" type="xsd:string"/>
            <!--xsd:element name="Postcode" type="xsd:string"/-->
            <xsd:element name="Postcode">
              <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                  <xsd:pattern value="\d{4} [A-Z]{2}"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
            <xsd:element name="Zrn">
              <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                  <xsd:minInclusive value="1000000"/>
                  <xsd:maxInclusive value="99999999999999"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
    SQL> DROP TABLE RELATIE_DOCUMENTEN_TEMP
      2  /
    Table dropped.
    SQL> BEGIN
      2    DBMS_XMLSCHEMA.copyEvolve
      3      ( schemaURLs      => xdb$string_list_t(:schemaURL)
      4      , newSchemas      => XMLSequenceType(XDBURIType(:schemaPath).getXML())
      5      , preserveOldDocs => TRUE
      6      , mapTabName      => 'RELATIE_DOCUMENTEN_TEMP'
      7      , generateTables  => FALSE
      8      );
      9  END;
    10  /
    PL/SQL procedure successfully completed.
    SQL> CREATE TABLE relatie_documenten OF XMLTYPE
      2         XMLSCHEMA "http://localhost:8080/xsd/relaties.xsd"
      3         ELEMENT "Relatie"
      4  /
    Table created.
    SQL> CREATE OR REPLACE TRIGGER upo_rdt_ai
      2  AFTER INSERT ON relatie_documenten
      3  FOR EACH ROW
      4  DECLARE
      5     doc XMLType;
      6  BEGIN
      7     doc := :new.SYS_NC_ROWINFO$;
      8     XMLType.schemaValidate(doc);
      9  END;
    10  /
    Trigger created.
    SQL> declare
      2    tablename varchar2(2000);
      3  begin
      4    select temp_tabname
      5      into tablename
      6      from RELATIE_DOCUMENTEN_TEMP
      7     where table_name = USER || '.' || upper('relatie_documenten');
      8    execute immediate 'insert into relatie_documenten select xmltype(data) from ' || tablename;
      9    commit;
    10  end;
    11  /
    PL/SQL procedure successfully completed.
    SQL> select *
      2    from relatie_documenten
      3  /
    SYS_NC_ROWINFO$
    <Relatie>
      <Voornaam>Johan</Voornaam>
      <Achternaam>Hermans</Achternaam>
      <Tussenvoegsel/>
      <Geboortedatum>1978-01-02</Geboortedatum>
      <Geslacht>M</Geslacht>
      <Sofinummer>233300417</Sofinummer>
      <Straatnaam>Stationstraat</Straatnaam>
      <Huisnummer>10</Huisnummer>
      <Woonplaats>Weesp</Woonplaats>
      <Postcode>1383 AK</Postcode>
      <Zrn>1234567</Zrn>
    </Relatie>
    <Relatie>
      <Voornaam>Johanna</Voornaam>
      <Achternaam>Gurts</Achternaam>
      <Tussenvoegsel/>
      <Geboortedatum>1975-11-12</Geboortedatum>
      <Geslacht>V</Geslacht>
      <Sofinummer>234109807</Sofinummer>
      <Straatnaam>Stationstraat</Straatnaam>
      <Huisnummer>10</Huisnummer>
      <Woonplaats>Weesp</Woonplaats>
      <Postcode>1383 AK</Postcode>
      <Zrn>7654321</Zrn>
    </Relatie>
    SQL> INSERT
      2  INTO   relatie_documenten
      3  VALUES (XMLType
      4           ('<Relatie>
      5                <Voornaam>Johanna</Voornaam>
      6                <Achternaam>Gurts</Achternaam>
      7                <Tussenvoegsel/>
      8                <Geboortedatum>1975-11-12</Geboortedatum>
      9                <Geslacht>O</Geslacht>
    10                <Sofinummer>234109807</Sofinummer>
    11                <Straatnaam>Stationstraat</Straatnaam>
    12                <Huisnummer>10</Huisnummer>
    13                <Woonplaats>Weesp</Woonplaats>
    14                <Postcode>1383 AK</Postcode>
    15                <Zrn>7654321</Zrn>
    16             </Relatie>').CreateSchemaBasedXML(:schemaURL))
    17  /
    1 row created.
    SQL> commit
      2  /
    Commit complete.
    SQL> select *
      2    from relatie_documenten
      3  /
    SYS_NC_ROWINFO$
    <Relatie>
      <Voornaam>Johan</Voornaam>
      <Achternaam>Hermans</Achternaam>
      <Tussenvoegsel/>
      <Geboortedatum>1978-01-02</Geboortedatum>
      <Geslacht>M</Geslacht>
      <Sofinummer>233300417</Sofinummer>
      <Straatnaam>Stationstraat</Straatnaam>
      <Huisnummer>10</Huisnummer>
      <Woonplaats>Weesp</Woonplaats>
      <Postcode>1383 AK</Postcode>
      <Zrn>1234567</Zrn>
    </Relatie>
    <Relatie>
      <Voornaam>Johanna</Voornaam>
      <Achternaam>Gurts</Achternaam>
      <Tussenvoegsel/>
      <Geboortedatum>1975-11-12</Geboortedatum>
      <Geslacht>V</Geslacht>
      <Sofinummer>234109807</Sofinummer>
      <Straatnaam>Stationstraat</Straatnaam>
      <Huisnummer>10</Huisnummer>
      <Woonplaats>Weesp</Woonplaats>
      <Postcode>1383 AK</Postcode>
      <Zrn>7654321</Zrn>
    </Relatie>
    <Relatie>
      <Voornaam>Johanna</Voornaam>
      <Achternaam>Gurts</Achternaam>
      <Tussenvoegsel/>
      <Geboortedatum>1975-11-12</Geboortedatum>
      <Geslacht>O</Geslacht>
      <Sofinummer>234109807</Sofinummer>
      <Straatnaam>Stationstraat</Straatnaam>
      <Huisnummer>10</Huisnummer>
      <Woonplaats>Weesp</Woonplaats>
      <Postcode>1383 AK</Postcode>
      <Zrn>7654321</Zrn>
    </Relatie>
    SQL>Here's the SQL, can you cut'n'paste and run the whole thing as XML_OWNER
    var schemaURL varchar2(256)
    var schemaPath varchar2(256)
    begin
      :schemaURL := 'http://localhost:8080/xsd/relaties.xsd';
      :schemaPath := '/public/relaties.xsd';
    end;
    call dbms_xmlSchema.deleteSchema(:schemaURL,4)
    declare
      res boolean;
      xmlSchema xmlType := xmlType(
    '<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xdb="http://xmlns.oracle.com/xdb"
                   elementFormDefault="unqualified"
                   attributeFormDefault="unqualified"
                   version="1.0">
         <xsd:element name="Relatie" xdb:defaultTable="">
              <xsd:complexType>
                   <xsd:sequence>
                        <xsd:element name="Voornaam" type="xsd:string"/>
                        <xsd:element name="Achternaam" type="xsd:string"/>
                        <xsd:element name="Tussenvoegsel" type="xsd:string"/>
                        <xsd:element name="Geboortedatum" type="xsd:date"/>
                        <xsd:element name="Geslacht">
                   <xsd:simpleType>
                      <xsd:restriction base="xsd:string">
                         <xsd:enumeration value="M"/>
                         <xsd:enumeration value="V"/>
                      </xsd:restriction>
                   </xsd:simpleType>
                </xsd:element>
                     <xsd:element name="Sofinummer">
                   <xsd:simpleType>
                      <xsd:restriction base="xsd:string">
                         <xsd:pattern value="\d{9}"/>
                      </xsd:restriction>
                   </xsd:simpleType>
                </xsd:element>
                        <xsd:element name="Straatnaam" type="xsd:string"/>
                        <xsd:element name="Huisnummer" type="xsd:string"/>
                        <xsd:element name="Woonplaats" type="xsd:string"/>
                        <!--xsd:element name="Postcode" type="xsd:string"/-->
                        <xsd:element name="Postcode">
                   <xsd:simpleType>
                      <xsd:restriction base="xsd:string">
                         <xsd:pattern value="\d{4} [A-Z]{2}"/>
                      </xsd:restriction>
                   </xsd:simpleType>
                </xsd:element>
                        <xsd:element name="Zrn">
                   <xsd:simpleType>
                      <xsd:restriction base="xsd:integer">
                         <xsd:minInclusive value="1000000"/>
                         <xsd:maxInclusive value="99999999999999"/>
                      </xsd:restriction>
                   </xsd:simpleType>
                </xsd:element>
                   </xsd:sequence>
              </xsd:complexType>
         </xsd:element>
    </xsd:schema>');
    begin
      if (dbms_xdb.existsResource(:schemaPath)) then
        dbms_xdb.deleteResource(:schemaPath);
      end if;
      res := dbms_xdb.createResource(:schemaPath,xmlSchema);
    end;
    BEGIN
      DBMS_XMLSCHEMA.registerSchema(
        :schemaURL,
        XDBURIType(:schemaPath).getClob(),
        TRUE,
        FALSE,
        FALSE,
        TRUE);
    END;
    DROP TABLE relatie_documenten FORCE
    CREATE TABLE relatie_documenten OF XMLTYPE
           XMLSCHEMA "http://localhost:8080/xsd/relaties.xsd"
           ELEMENT "Relatie"
    CREATE OR REPLACE TRIGGER upo_rdt_ai
    AFTER INSERT ON relatie_documenten
    FOR EACH ROW
    DECLARE
       doc XMLType;
    BEGIN
       doc := :new.SYS_NC_ROWINFO$;
       XMLType.schemaValidate(doc);
    END;
    INSERT
    INTO   relatie_documenten
    VALUES (XMLType
             ('<Relatie>
                  <Voornaam>Johan</Voornaam>
                  <Achternaam>Hermans</Achternaam>
                  <Tussenvoegsel/>
                  <Geboortedatum>1978-01-02</Geboortedatum>
                  <Geslacht>M</Geslacht>
                  <Sofinummer>233300417</Sofinummer>
                  <Straatnaam>Stationstraat</Straatnaam>
                  <Huisnummer>10</Huisnummer>
                  <Woonplaats>Weesp</Woonplaats>
                  <Postcode>1383 AK</Postcode>
                  <Zrn>1234567</Zrn>
               </Relatie>'
            ).CreateSchemaBasedXML(:schemaURL))
    commit
    INSERT
    INTO   relatie_documenten
    VALUES (XMLType
             ('<Relatie>
                  <Voornaam>Johanna</Voornaam>
                  <Achternaam>Gurts</Achternaam>
                  <Tussenvoegsel/>
                  <Geboortedatum>1975-11-12</Geboortedatum>
                  <Geslacht>V</Geslacht>
                  <Sofinummer>234109807</Sofinummer>
                  <Straatnaam>Stationstraat</Straatnaam>
                  <Huisnummer>10</Huisnummer>
                  <Woonplaats>Weesp</Woonplaats>
                  <Postcode>1383 AK</Postcode>
                  <Zrn>7654321</Zrn>
               </Relatie>').CreateSchemaBasedXML(:schemaURL))
    commit
    INSERT
    INTO   relatie_documenten
    VALUES (XMLType
             ('<Relatie>
                  <Voornaam>Johanna</Voornaam>
                  <Achternaam>Gurts</Achternaam>
                  <Tussenvoegsel/>
                  <Geboortedatum>1975-11-12</Geboortedatum>
                  <Geslacht>O</Geslacht>
                  <Sofinummer>234109807</Sofinummer>
                  <Straatnaam>Stationstraat</Straatnaam>
                  <Huisnummer>10</Huisnummer>
                  <Woonplaats>Weesp</Woonplaats>
                  <Postcode>1383 AK</Postcode>
                  <Zrn>7654321</Zrn>
               </Relatie>').CreateSchemaBasedXML(:schemaURL))
    commit
    declare
      xmlschema xmltype;
      res       boolean;
    begin
      select xdburitype(:schemaPath).getXML()
        into xmlSchema
        from dual;
      dbms_xdb.deleteResource(:schemaPath);
      select insertChildXML
               xmlschema,
               '/xsd:schema//xsd:element[@name="Geslacht"]/xsd:simpleType/xsd:restriction',
               'xsd:enumeration',
               xmltype('<xsd:enumeration xmlns:xsd="http://www.w3.org/2001/XMLSchema" value="O"/>'),
               'xmlns:xsd="http://www.w3.org/2001/XMLSchema"'
      into xmlSchema
      from dual;
      res := dbms_xdb.createResource(:schemaPath,xmlSchema);
    end;
    commit
    set long 100000 pages 200 lines 140
    select xdburitype(:schemaPath).getXML()
      from dual
    DROP TABLE RELATIE_DOCUMENTEN_TEMP
    BEGIN
      DBMS_XMLSCHEMA.copyEvolve
        ( schemaURLs      => xdb$string_list_t(:schemaURL)
        , newSchemas      => XMLSequenceType(XDBURIType(:schemaPath).getXML())
        , preserveOldDocs => TRUE
        , mapTabName      => 'RELATIE_DOCUMENTEN_TEMP'
        , generateTables  => FALSE
    END;
    CREATE TABLE relatie_documenten OF XMLTYPE
           XMLSCHEMA "http://localhost:8080/xsd/relaties.xsd"
           ELEMENT "Relatie"
    CREATE OR REPLACE TRIGGER upo_rdt_ai
    AFTER INSERT ON relatie_documenten
    FOR EACH ROW
    DECLARE
       doc XMLType;
    BEGIN
       doc := :new.SYS_NC_ROWINFO$;
       XMLType.schemaValidate(doc);
    END;
    declare
      tablename varchar2(2000);
    begin
      select temp_tabname
        into tablename
        from RELATIE_DOCUMENTEN_TEMP
       where table_name = USER || '.' || upper('relatie_documenten');
      execute immediate 'insert into relatie_documenten select xmltype(data) from ' || tablename;
      commit;
    end;
    select *
      from relatie_documenten
    INSERT
    INTO   relatie_documenten
    VALUES (XMLType
             ('<Relatie>
                  <Voornaam>Johanna</Voornaam>
                  <Achternaam>Gurts</Achternaam>
                  <Tussenvoegsel/>
                  <Geboortedatum>1975-11-12</Geboortedatum>
                  <Geslacht>O</Geslacht>
                  <Sofinummer>234109807</Sofinummer>
                  <Straatnaam>Stationstraat</Straatnaam>
                  <Huisnummer>10</Huisnummer>
                  <Woonplaats>Weesp</Woonplaats>
                  <Postcode>1383 AK</Postcode>
                  <Zrn>7654321</Zrn>
               </Relatie>').CreateSchemaBasedXML(:schemaURL))
    commit
    select *
      from relatie_documenten
    /

  • Oracle XML vaidation causes database connection lost.

    Schema document:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
         <xsd:annotation>
              <xsd:documentation xml:lang="en">
              </xsd:documentation>
         </xsd:annotation>
         <xsd:element name="BDDString" type="xsd:string"/>
    </xsd:schema>
    XML document:
    <?xml version="1.0" encoding="UTF-8"?>
    <BDDString><Path>USA</Path></BDDString>
    Result http://apps.gotdotnet.com/xmltools/xsdvalidator/Default.aspx validation:
    Validation error:
    <?xml version="1.0" encoding="UTF-8"?>
    <BDDString
    Error at (2,14): The element 'BDDString' has invalid child element 'Path'. An error occurred at , (2, 14).
    Error at (2,14): The 'Path' element is not declared. An error occurred at , (2, 14).
    <Path>USA</Path></BDDString>ORACLE validation:
    Declare
         xmlObj XMLType;
    begin
         xmlObj := XMLType('<?xml version="1.0" encoding="UTF-8"?><BDDString><Path>USA</Path></BDDString>',
         'cb78db306e061027a7c4b02b1a84d6fb');
         XMLType.schemavalidate(xmlObj);
    end;
    Result: Oracle XML vaidation causes database connection lost!
    *** SCRIPT START : Session:M1GLOBAL_DEV15@MATRIX(5) 3-&#1084;&#1072;&#1088;-2005 14:05:41 ***
    Start SQL Editor Execution ...
    Processing ...
    xmlObj := XMLType('<?xml version="1.0" encoding="UTF-8"?>
    ORA-03113: end-of-file on communication channel
    *** SCRIPT END : Session:M1GLOBAL_DEV15@MATRIX(5) 3-&#1084;&#1072;&#1088;-2005 14:08:02 ***
    End SQL Editor Execution
    Task "SQL Editor Execution": Operation aborted
    SQL Editor Execution terminated with errors
    Task "SQL Editor Execution" in DoTerminate(): Session Manager: No connection to M1GLOBAL_DEV15@MATRIX
    Help!
    Question:
         1)Why Oracle validation incorrectly works?
         2)How it to correct?

    Hi,
    1- what is the Reports version being used?
    2- What is the error you are getting?
    3- Have you tried to enable reports trace and see what is happening in trace file?
    Thanks, Roberto

  • Deleting Schemas:  What am I missing?

    Hi.
    I am on 11.2.0.3.0 - 64bit Production.
    I have deleted a schema using DBMS_XMLSCHEMA.DELETESSCHEMA and delete_option 3.
    I have then also deleted the resource using DBMS_XDB.DELETERESOURCE.
    I then execute the XMLTYPE schemaValidate method on a record that was based on the schema just deleted and the result is an error that could only occur if the schema as still there (being more than one occurrence of an element that must have only one occurrence).
    What am I missing?
    Context:  This is a development database and I am trying to replace an incorrect schema without having to spend a lot of time (slow performing system) migrating data using that schema.

    OK.  I have formulated a hypothesis while trying to get together a test case for this forum and Oracle support.
    Originally I replaced the XSD only as a resource using the DBMS_XDB.DELETERESOURCE method.  Life went on and eventually testing hit an error that lead me to believe I should have done something more.
    I then discovered the DBMS_XMLSCHEMA.DELETESSCHEMA method and tried to use that in conjunction with the DBMS_XDB.DELETERESOURCE method.  It was after this, when I could see the schema said one thing but the XMLTYPE schemaValidate method said something different, that I started this discussion and raised an Oracle Support call.
    Since then, I have been restoring the DB and repeating tests in order to produce a test case, but everything has then been working as expected.
    Hypothesis:  Removing the XSD originally using only the DBMS_XDB.DELETERESOURCE method left the system in some sort of inconsistent state that the subsequent use of the DBMS_XMLSCHEMA.DELETESSCHEMA method could not correct.
    Thanks to anyone who spent some time giving this some consideration.

  • ORA 01792 maximum number of columns in a table or view is 1000

    Hello every1, I wish to register a large xmlschema doc, I am using the command
    begin
    dbms_xmlschema.registerschema(
    schemaurl=>'xxxx',
    schemadoc=>bfilename('XMLDIR','xxxxxx.xsd'),
    csid=>nls_charset_id('AL32UTF8'));
    end;
    But the schema file exists 1000 col and it gives me the error msg of
    ORA-01792: maximum number of columns in a table or view is 1000
    is there anyway to solve the problems without edit the original schema document?
    Thanks for your help

    First create this package
    create or replace package XDB_ANALYZE_XMLSCHEMA_10200
    authid CURRENT_USER
    as
      function analyzeStorageModel(P_COMPLEX_TYPE_NAME VARCHAR2) return XMLTYPE;
      function analyzeComplexType(COMPLEX_TYPE VARCHAR2) return XMLTYPE;
      procedure renameCollectionTable (XMLTABLE varchar2, XPATH varchar2, COLLECTION_TABLE_PREFIX varchar2);
      function printNestedTables(XML_TABLE varchar2) return XMLType;
      function getComplexTypeElementList(P_SQLTYPE VARCHAR2, P_SQLSCHEMA VARCHAR2) return XDB.XDB$XMLTYPE_REF_LIST_T;
      procedure scopeXMLReferences;
      procedure indexXMLReferences(INDEX_NAME VARCHAR2);
      function generateSchemaFromTable(P_TABLE_NAME varchar2, P_OWNER varchar2 default USER) return XMLTYPE;
      function showSQLTypes(schemaFolder varchar2) return XMLType;
      function generateCreateTableStatement(XML_TABLE_NAME varchar2, NEW_TABLE_NAME varchar2) return CLOB;
    end XDB_ANALYZE_XMLSCHEMA_10200;
    show errors
    create or replace package body XDB_ANALYZE_XMLSCHEMA_10200
    as
    G_DEPTH_COUNT NUMBER(2) := 0;
    TYPE BASETYPE_T is RECORD  
      SUBTYPE               varchar2(128),
      SUBTYPE_OWNER         varchar2(32),
      BASETYPE              varchar2(128),
      BASETYPE_OWNER        varchar2(32)
    TYPE BASETYPE_LIST_T IS TABLE OF BASETYPE_T;
    BASETYPE_LIST            BASETYPE_LIST_T := BASETYPE_LIST_T();
    function findStorageModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2,  P_INCLUDE_SUBTYPES VARCHAR2 DEFAULT 'YES') return XMLType;
    function getLocalAttributes(P_TYPE_NAME varchar2, P_TYPE_OWNER VARCHAR2) return XMLType;
    function makeElement(P_NAME varchar2)
    return xmltype
    as
      V_NAME varchar2(4000) := P_NAME;
    begin
      -- -- dbms_output.put_line('Processing : ' || P_NAME);
      if (P_NAME LIKE '%$') then
        V_NAME := SUBSTR(V_NAME,1,LENGTH(V_NAME) - 1);
      end if;
      if (P_NAME LIKE '%$%') then
        V_NAME := REPLACE(V_NAME,'$','_0x22_');
      end if;
      return XMLTYPE( '<' || V_NAME || '/>');
    end;
    function getPathToRoot(SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2)
    return varchar2
    as
      TYPE_HIERARCHY varchar2(4000);
    begin
       SELECT sys_connect_by_path( OWNER || '.' || TYPE_NAME , '/')
         INTO TYPE_HIERARCHY
         FROM ALL_TYPES
        WHERE TYPE_NAME = SUBTYPE
          AND OWNER = SUBTYPE_OWNER
              CONNECT BY SUPERTYPE_NAME = PRIOR TYPE_NAME
                     AND SUPERTYPE_OWNER = PRIOR OWNER
              START WITH SUPERTYPE_NAME IS NULL
                     AND SUPERTYPE_OWNER IS NULL;
       return TYPE_HIERARCHY;
    end;
    function expandSQLType(ATTR_NAME VARCHAR2, SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2)
    return XMLType
    as
      STORAGE_MODEL       XMLTYPE;
      ATTRIBUTES          XMLTYPE;
      EXTENDED_TYPE       XMLTYPE;
      ATTR_COUNT          NUMBER := 0;
      CURSOR FIND_EXTENDED_TYPES
      is
      select TYPE_NAME, OWNER
        from ALL_TYPES
       where SUPERTYPE_NAME  = SUBTYPE
         and SUPERTYPE_OWNER = SUBTYPE_OWNER;
    begin
      -- dbms_output.put_line('Processing SQLType  : "' || SUBTYPE_OWNER || '.' || SUBTYPE || '".' );
      STORAGE_MODEL := makeElement(ATTR_NAME);
      select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@type',SUBTYPE)
        into STORAGE_MODEL
        from dual;
      select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@typeOwner',SUBTYPE_OWNER)
        into STORAGE_MODEL
        from dual;
      ATTRIBUTES := getLocalAttributes(SUBTYPE, SUBTYPE_OWNER);         
      ATTR_COUNT := ATTR_COUNT + ATTRIBUTES.extract('/' || ATTRIBUTES.getRootElement() || '/@columns').getNumberVal();
      select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),ATTRIBUTES)
        into STORAGE_MODEL        
        from DUAL;
      for t in FIND_EXTENDED_TYPES loop
         EXTENDED_TYPE := expandSQLType('ExtendedType',T.TYPE_NAME,T.OWNER);
         ATTR_COUNT := ATTR_COUNT + EXTENDED_TYPE.extract('/' || EXTENDED_TYPE.getRootElement() || '/@columns').getNumberVal();
         select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),EXTENDED_TYPE)
           into STORAGE_MODEL
           from DUAL;   
      end loop;
      select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@columns',ATTR_COUNT)
        into STORAGE_MODEL
        from dual;
      return STORAGE_MODEL;
    end;
    function getLocalAttributes(P_TYPE_NAME varchar2, P_TYPE_OWNER VARCHAR2)
    return XMLType
    as
      V_ATTRIBUTE_COUNT     NUMBER := 0;
      V_TOTAL_ATTRIBUTES    NUMBER := 0;
      V_TEMP_RESULT         NUMBER;
      V_COLLECTION_TYPE     varchar2(32);
      V_COLLECTION_OWNER    varchar2(32);
      CURSOR FIND_CHILD_ATTRS
      is
      select ATTR_NAME, ATTR_TYPE_OWNER, ATTR_TYPE_NAME, INHERITED
        from ALL_TYPE_ATTRS
       where TYPE_NAME = P_TYPE_NAME
         and OWNER = P_TYPE_OWNER
         and INHERITED = 'NO'
       order by ATTR_NO;       
      V_ATTR                    DBMS_XMLDOM.DOMATTR;
      V_ATTRIBUTE_LIST      XMLTYPE;
      V_ATTRIBUTE_LIST_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
      V_ATTRIBUTE_LIST_ROOT     DBMS_XMLDOM.DOMELEMENT;
      V_ATTRIBUTE           XMLTYPE;
      V_ATTRIBUTE_DOCUMENT                DBMS_XMLDOM.DOMDOCUMENT;
      V_ATTRIBUTE_ROOT                    DBMS_XMLDOM.DOMELEMENT;
      V_TYPE_DEFINITION     XMLTYPE;
      V_TYPE_DEFINITION_DOCUMENT  DBMS_XMLDOM.DOMDOCUMENT;
      V_TYPE_DEFINITION_ROOT      DBMS_XMLDOM.DOMELEMENT;
    begin    
      V_ATTRIBUTE_LIST          := makeElement('Attributes');
      V_ATTRIBUTE_LIST_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE_LIST);
      V_ATTRIBUTE_LIST_ROOT     := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_LIST_DOCUMENT);
      for ATTR in FIND_CHILD_ATTRS loop
        -- Finding Element / Attribute Name could be tricky. Use SQLName
        V_ATTRIBUTE          := makeElement(ATTR.ATTR_NAME);
        V_ATTRIBUTE_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE);
        V_ATTRIBUTE_ROOT     := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_DOCUMENT);
        begin
          -- Check for Attributes based on collection types, With Nested Table storage each Collection will cost 2 columns.
          select ELEM_TYPE_NAME, ELEM_TYPE_OWNER
            into V_COLLECTION_TYPE, V_COLLECTION_OWNER
            from ALL_COLL_TYPES
           where TYPE_NAME = ATTR.ATTR_TYPE_NAME
             and OWNER = ATTR.ATTR_TYPE_OWNER;
          -- -- dbms_output.put_line('Adding "' || ATTR.ATTR_NAME || '". Collection of "' || ATTR.ATTR_TYPE_OWNER || '"."' || ATTR.ATTR_TYPE_NAME || '".');
          -- Attribute is a Collection Type.
          -- Collection will be managed as a NESTED TABLE
          -- Each Collection cost 2 columns.
          -- May want to count the number of columns in the NESTED_TABLE at a later date.
          V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLCollType');
                         DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_NAME);
          V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
          V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLCollTypeOwner');
                         DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_OWNER);
          V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
          V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLType');
                         DBMS_XMLDOM.SETVALUE(V_ATTR,V_COLLECTION_TYPE);
          V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
          V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLTypeOwner');
                         DBMS_XMLDOM.SETVALUE(V_ATTR,V_COLLECTION_OWNER);
          V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
          V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
                         DBMS_XMLDOM.SETVALUE(V_ATTR,2);
          V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
        exception
          when no_data_found then
            -- Attribute is not a collection type.
            begin
              -- Check for Attributes based on non-scalar types.
              select 1
                into V_TEMP_RESULT
                from ALL_TYPES
               where TYPE_NAME = ATTR.ATTR_TYPE_NAME
                 and OWNER = ATTR.ATTR_TYPE_OWNER;
              -- Attribute is based on a non-scalar type. Find the Storage Model for this type.
              V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLType');
                             DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_NAME);
              V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
              V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLTypeOwner');
                             DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_OWNER);
              V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
              V_TYPE_DEFINITION            := findStorageModel(ATTR.ATTR_TYPE_NAME, ATTR.ATTR_TYPE_OWNER, 'YES');   
              V_TYPE_DEFINITION_DOCUMENT   := DBMS_XMLDOM.NEWDOMDOCUMENT(V_TYPE_DEFINITION);
              V_TYPE_DEFINITION_ROOT       := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_TYPE_DEFINITION_DOCUMENT);
              V_ATTRIBUTE_COUNT            := DBMS_XMLDOM.GETATTRIBUTE(V_TYPE_DEFINITION_ROOT,'columns');
              V_TYPE_DEFINITION_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_ATTRIBUTE_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),TRUE));
              V_TYPE_DEFINITION_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_ROOT),DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT)));
              DBMS_XMLDOM.FREEDOCUMENT(V_TYPE_DEFINITION_DOCUMENT);
              if (ATTR.ATTR_TYPE_NAME = 'XDB$ENUM_T' and ATTR.ATTR_TYPE_OWNER = 'XDB') then
                -- The cost of a XDB$ENUM_T is 2 columns
                V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
                               DBMS_XMLDOM.SETVALUE(V_ATTR,2);
                V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
              else
                -- The cost of a non scalar Type is the number of attributes plus one for Type and one for the TYPEID.
                V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
                               DBMS_XMLDOM.SETVALUE(V_ATTR,V_ATTRIBUTE_COUNT + 2);
                V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
              end if;
            exception
              when no_data_found then
                 -- Attribute is based on a scalar type
                 V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLType');
                                DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_NAME);
                 V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
                 V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
                                DBMS_XMLDOM.SETVALUE(V_ATTR,1);
                 V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
            end;
        end;
        V_TOTAL_ATTRIBUTES     := V_TOTAL_ATTRIBUTES + DBMS_XMLDOM.GETATTRIBUTE(V_ATTRIBUTE_ROOT,'columns');
        V_ATTRIBUTE_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_ATTRIBUTE_LIST_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_ROOT),TRUE));
        V_ATTRIBUTE_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT),DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_ROOT)));
        DBMS_XMLDOM.FREEDOCUMENT(V_ATTRIBUTE_DOCUMENT);
        if (V_TOTAL_ATTRIBUTES > 25000) then
          exit;
        end if;
      end loop;
      V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_LIST_DOCUMENT,'columns');
                     DBMS_XMLDOM.SETVALUE(V_ATTR,V_TOTAL_ATTRIBUTES);
      V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_LIST_ROOT,V_ATTR);
      return V_ATTRIBUTE_LIST;
    end;
    function getSubTypes(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2)
    return XMLType
    as
      CURSOR FIND_SUBTYPES
      is
      select TYPE_NAME, OWNER
        from ALL_TYPES
       where SUPERTYPE_NAME  = P_TYPE_NAME
         and SUPERTYPE_OWNER = P_TYPE_OWNER; 
      CURSOR FIND_SUBTYPE_HEIRARCHY
      is
      select LEVEL, TYPE_NAME, OWNER
        from ALL_TYPES
       where TYPE_NAME <> P_TYPE_NAME
         and OWNER <> P_TYPE_OWNER
             connect by SUPERTYPE_NAME = PRIOR TYPE_NAME
                    and SUPERTYPE_OWNER = PRIOR OWNER
             start with TYPE_NAME = P_TYPE_NAME
                    and OWNER = P_TYPE_OWNER;
      V_SUBTYPE_LIST                 XMLType;
      V_SUBTYPE_LIST_DOCUMENT        DBMS_XMLDOM.DOMDOCUMENT;
      V_SUBTYPE_LIST_ROOT            DBMS_XMLDOM.DOMELEMENT;
      V_TYPE_DEFINITION              XMLType;
      V_TYPE_DEFINITION_DOCUMENT     DBMS_XMLDOM.DOMDOCUMENT;
      V_TYPE_DEFINITION_ROOT         DBMS_XMLDOM.DOMELEMENT;
      V_SUBTYPE_DEFINITIONS          XMLType;
      V_SUBTYPE_DEFINITIONS_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
      V_SUBTYPE_DEFINITIONS_ROOT     DBMS_XMLDOM.DOMELEMENT;
      V_ATTRIBUTE_LIST               XMLType;
      V_ATTRIBUTE_LIST_DOCUMENT      DBMS_XMLDOM.DOMDOCUMENT;
      V_ATTRIBUTE_LIST_ROOT          DBMS_XMLDOM.DOMELEMENT;
      V_SUBTYPES_EXIST               BOOLEAN := FALSE;
      V_TOTAL_columns                number;
      V_ATTRIBUTE_COUNT              number;
      V_ATTR                         DBMS_XMLDOM.DOMATTR;
      V_COMPLEX_TYPE                 VARCHAR2(256);
    begin
      V_SUBTYPE_LIST          := makeElement('SubTypeDefinitions');
      V_SUBTYPE_LIST_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUBTYPE_LIST);
      V_SUBTYPE_LIST_ROOT     := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUBTYPE_LIST_DOCUMENT);
      V_TOTAL_columns := 0;
      for t in FIND_SUBTYPES() loop
        V_SUBTYPES_EXIST  := TRUE;
        V_TYPE_DEFINITION            := makeElement(t.TYPE_NAME);
        V_TYPE_DEFINITION_DOCUMENT   := DBMS_XMLDOM.NEWDOMDOCUMENT(V_TYPE_DEFINITION);
        V_TYPE_DEFINITION_ROOT       := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_TYPE_DEFINITION_DOCUMENT);
        V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_TYPE_DEFINITION_DOCUMENT,'SQLTypeOwner');
                       DBMS_XMLDOM.SETVALUE(V_ATTR,t.OWNER);
        V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_TYPE_DEFINITION_ROOT,V_ATTR);
        begin
          select x.XMLDATA.NAME
            into V_COMPLEX_TYPE
            from XDB.XDB$COMPLEX_TYPE x
           where x.XMLDATA.SQLTYPE = t.TYPE_NAME
             and x.XMLDATA.SQLSCHEMA = t.OWNER;
          V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_TYPE_DEFINITION_DOCUMENT,'type');
                         DBMS_XMLDOM.SETVALUE(V_ATTR,V_COMPLEX_TYPE);
          V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_TYPE_DEFINITION_ROOT,V_ATTR);
          -- Consider adding Schema URL Attribute
        exception
          when no_data_found then
            null;
          when others then
            raise;
        end;
        V_ATTRIBUTE_LIST            := getLocalAttributes(t.TYPE_NAME, t.OWNER);  
        V_ATTRIBUTE_LIST_DOCUMENT   := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE_LIST);
        V_ATTRIBUTE_LIST_ROOT       := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_LIST_DOCUMENT);
        V_ATTRIBUTE_COUNT           := DBMS_XMLDOM.GETATTRIBUTE(V_ATTRIBUTE_LIST_ROOT,'columns');
        V_ATTRIBUTE_LIST_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_TYPE_DEFINITION_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT),TRUE));
        V_ATTRIBUTE_LIST_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT)));
        DBMS_XMLDOM.FREEDOCUMENT(V_ATTRIBUTE_LIST_DOCUMENT);
        V_SUBTYPE_DEFINITIONS       := getSubTypes(t.TYPE_NAME,t.OWNER);
        if (V_SUBTYPE_DEFINITIONS is not NULL) then
          V_SUBTYPE_DEFINITIONS_DOCUMENT   := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUBTYPE_DEFINITIONS);
          V_SUBTYPE_DEFINITIONS_ROOT       := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUBTYPE_DEFINITIONS_DOCUMENT);
          V_ATTRIBUTE_COUNT                := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_SUBTYPE_DEFINITIONS_ROOT,'columns');
          V_SUBTYPE_DEFINITIONS_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_TYPE_DEFINITION_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_SUBTYPE_DEFINITIONS_ROOT),TRUE));
          V_SUBTYPE_DEFINITIONS_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),DBMS_XMLDOM.MAKENODE(V_SUBTYPE_DEFINITIONS_ROOT)));
        end if;
        V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_TYPE_DEFINITION_DOCUMENT,'columns');
                       DBMS_XMLDOM.SETVALUE(V_ATTR,V_ATTRIBUTE_COUNT);
        V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_TYPE_DEFINITION_ROOT,V_ATTR);
        V_TYPE_DEFINITION_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_SUBTYPE_LIST_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),TRUE));
        V_TYPE_DEFINITION_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_SUBTYPE_LIST_ROOT),DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT)));
        V_TOTAL_columns := V_TOTAL_columns + V_ATTRIBUTE_COUNT;
      end loop;
      if (V_SUBTYPES_EXIST) then
        V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_SUBTYPE_LIST_DOCUMENT,'columns');
                       DBMS_XMLDOM.SETVALUE(V_ATTR,V_TOTAL_columns);
        V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_SUBTYPE_LIST_ROOT,V_ATTR);
        return V_SUBTYPE_LIST;
      else
        return NULL;
      end if;
    end;
    function findSuperTypeModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2)
    return XMLType
    as
    begin
      -- dbms_output.put_line('Processing Super Type : "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '"');
      return findStorageModel(P_TYPE_NAME, P_TYPE_OWNER,'NO');
    end;
    function getStorageModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2, P_INCLUDE_SUBTYPES VARCHAR2 DEFAULT 'YES')
    return XMLType
    as
      V_TYPE_DEFINITION      XMLTYPE;
      V_ATTRIBUTE_COUNT      NUMBER := 0;
      SUBTYPE_STORAGE_MODEL  XMLTYPE;
      V_SUPERTYPE_DEFINITION XMLTYPE;
      V_SUPERTYPE_DOCUMENT   DBMS_XMLDOM.DOMDOCUMENT;
      V_SUPERTYPE_ROOT       DBMS_XMLDOM.DOMELEMENT;
      V_SUBTYPE_DEFINITION XMLTYPE;
      V_SUBTYPE_DOCUMENT   DBMS_XMLDOM.DOMDOCUMENT;
      V_SUBTYPE_ROOT       DBMS_XMLDOM.DOMELEMENT;
      V_ATTRIBUTE_LIST          XMLTYPE;
      V_ATTRIBUTE_LIST_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
      V_ATTRIBUTE_LIST_ROOT     DBMS_XMLDOM.DOMELEMENT;
      cursor FIND_SUPERTYPE_HEIRARCHY
      is
      select TYPE_NAME, OWNER
        from ALL_TYPES
       where TYPE_NAME <> P_TYPE_NAME
         and OWNER <> P_TYPE_OWNER
             connect by TYPE_NAME = PRIOR SUPERTYPE_NAME
                    and OWNER = PRIOR SUPERTYPE_OWNER
             start with TYPE_NAME = P_TYPE_NAME
                    and OWNER = P_TYPE_OWNER
       order by LEVEL;
      V_COMPLEX_TYPE        varchar2(256);
      V_SUPERTYPE_NAME      varchar2(256);
      v_SUPERTYPE_OWNER     varchar2(256);
      V_DOCUMENT            DBMS_XMLDOM.DOMDOCUMENT;
      V_ROOT                DBMS_XMLDOM.DOMELEMENT;
      V_ATTR                DBMS_XMLDOM.DOMATTR;
    begin
      -- dbms_output.put_line('Generating Storage Model for : "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '"');
      V_TYPE_DEFINITION := makeElement(P_TYPE_NAME);
      V_DOCUMENT  := DBMS_XMLDOM.NEWDOMDOCUMENT(V_TYPE_DEFINITION);
      V_ROOT      := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_DOCUMENT);
      V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLTypeOwner');
                     DBMS_XMLDOM.SETVALUE(V_ATTR,P_TYPE_OWNER);
      V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
      begin
        select x.XMLDATA.NAME
          into V_COMPLEX_TYPE
          from XDB.XDB$COMPLEX_TYPE x
         where x.XMLDATA.SQLTYPE = P_TYPE_NAME
           and x.XMLDATA.SQLSCHEMA = P_TYPE_OWNER;
        V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'type');
                       DBMS_XMLDOM.SETVALUE(V_ATTR,V_COMPLEX_TYPE);
        V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
        -- Consider adding Schema URL Attribute
      exception
        when no_data_found then
          null;
        when others then
          raise;
      end;
      select SUPERTYPE_NAME, SUPERTYPE_OWNER
        into V_SUPERTYPE_NAME, V_SUPERTYPE_OWNER
        from ALL_TYPES
       where TYPE_NAME = P_TYPE_NAME
         and OWNER = P_TYPE_OWNER;
      -- Process SuperType. 
      if (V_SUPERTYPE_NAME is not null) then
        V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLParentType');
                       DBMS_XMLDOM.SETVALUE(V_ATTR,V_SUPERTYPE_NAME);
        V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
        V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLParentTypeOwner');
                       DBMS_XMLDOM.SETVALUE(V_ATTR,V_SUPERTYPE_OWNER);
        V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
        -- Find the Definition for the super type. Do not include the definition of it's subtypes.
        V_SUPERTYPE_DEFINITION := findSuperTypeModel(V_SUPERTYPE_NAME, V_SUPERTYPE_OWNER);
        -- -- dbms_output.put_line(dbms_lob.substr(V_SUPERTYPE_DEFINITION.getClobVal(),1000,1));
        V_SUPERTYPE_DOCUMENT   := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUPERTYPE_DEFINITION);
        V_SUPERTYPE_ROOT       := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUPERTYPE_DOCUMENT);
        V_ATTRIBUTE_COUNT      := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_SUPERTYPE_ROOT,'columns');
        V_SUPERTYPE_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_SUPERTYPE_ROOT),TRUE));
        V_SUPERTYPE_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_SUPERTYPE_ROOT)));
        DBMS_XMLDOM.FREEDOCUMENT(V_SUPERTYPE_DOCUMENT);
      end if;
      -- Process Attributes defined directly by the Type.
      V_ATTRIBUTE_LIST            := getLocalAttributes(P_TYPE_NAME, P_TYPE_OWNER);  
      V_ATTRIBUTE_LIST_DOCUMENT   := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE_LIST);
      V_ATTRIBUTE_LIST_ROOT       := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_LIST_DOCUMENT);
      V_ATTRIBUTE_COUNT           := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_ATTRIBUTE_LIST_ROOT,'columns');
      V_ATTRIBUTE_LIST_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT),TRUE));
      V_ATTRIBUTE_LIST_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT)));
      DBMS_XMLDOM.FREEDOCUMENT(V_ATTRIBUTE_LIST_DOCUMENT);
      if (P_INCLUDE_SUBTYPES = 'YES') then
        -- Process any Sub-Types...
        V_SUBTYPE_DEFINITION := getSubTypes(P_TYPE_NAME, P_TYPE_OWNER);
        if (V_SUBTYPE_DEFINITION is not null) then
          V_SUBTYPE_DOCUMENT   := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUBTYPE_DEFINITION);
          V_SUBTYPE_ROOT       := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUBTYPE_DOCUMENT);
          V_ATTRIBUTE_COUNT    := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_SUBTYPE_ROOT,'columns');
          V_SUBTYPE_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_SUBTYPE_ROOT),TRUE));
          V_SUBTYPE_ROOT       := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_SUBTYPE_ROOT)));   
          DBMS_XMLDOM.FREEDOCUMENT(V_SUBTYPE_DOCUMENT);
        end if;
      end if;
      V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'columns');
                     DBMS_XMLDOM.SETVALUE(V_ATTR,V_ATTRIBUTE_COUNT);
      V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
      -- Cache the type definition.
      -- dbms_output.put_line('Cached Storage Model for "' || P_TYPE_OWNER || '.' || P_TYPE_NAME || '".');
      insert into XDBPM.XDBPM_STORAGE_MODEL_CACHE (TYPE_NAME, TYPE_OWNER, EXTENDED_DEFINITION, STORAGE_MODEL) VALUES (P_TYPE_NAME, P_TYPE_OWNER, P_INCLUDE_SUBTYPES, V_TYPE_DEFINITION);
      return V_TYPE_DEFINITION;
    end;
    function findStorageModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2, P_INCLUDE_SUBTYPES VARCHAR2 DEFAULT 'YES')
    -- Find the Storage Model for the Base Type.
    -- If the type is derived from another type we need the storage model of the Base Type
    -- As storage models are calculated they are cached in the global temporary table XDBPM_STORAGE_MODEL_CACHE. This makes
    -- the process much more efficient. A global temporary table is used to minimize memory usage.
    return XMLType
    as
      V_STORAGE_MODEL          XMLType;
      V_STORAGE_MODEL_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
      V_STORAGE_MODEL_ROOT     DBMS_XMLDOM.DOMELEMENT;
      V_ATTRIBUTE_COUNT        VARCHAR2(10);
    begin
      dbms_output.put_line('findStorageModel(' || G_DEPTH_COUNT || ') : Processing "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '".' );
      begin
        SELECT STORAGE_MODEL
          into V_STORAGE_MODEL
          from XDBPM.XDBPM_STORAGE_MODEL_CACHE
         where TYPE_NAME = P_TYPE_NAME
           and TYPE_OWNER = P_TYPE_OWNER
           and EXTENDED_DEFINITION = P_INCLUDE_SUBTYPES;
         -- dbms_output.put_line('Resolved Storage Model from cache.');
      exception
        when no_data_found then
          G_DEPTH_COUNT := G_DEPTH_COUNT + 1;
          V_STORAGE_MODEL := getStorageModel(P_TYPE_NAME,P_TYPE_OWNER, P_INCLUDE_SUBTYPES);
          G_DEPTH_COUNT := G_DEPTH_COUNT - 1; 
        when others then
          raise;
      end;
      V_STORAGE_MODEL_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_STORAGE_MODEL);
      V_STORAGE_MODEL_ROOT     := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_STORAGE_MODEL_DOCUMENT);
      V_ATTRIBUTE_COUNT          := DBMS_XMLDOM.GETATTRIBUTE(V_STORAGE_MODEL_ROOT,'columns');
      dbms_output.put_line('findStorageModel : Attribute Count for "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '" = ' || V_ATTRIBUTE_COUNT || '.' );
      return V_STORAGE_MODEL;
    end;
    function analyzeStorageModel(P_COMPLEX_TYPE_NAME VARCHAR2, P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2)
    -- Generate a map showing the number of columns required to persist an instance of the SQL type.
    return XMLType
    as
      V_STORAGE_MODEL       XMLTYPE;
      V_COUNT               NUMBER := 0;
      V_DOCUMENT            DBMS_XMLDOM.DOMDOCUMENT;
      V_ROOT                DBMS_XMLDOM.DOMELEMENT;
      V_ATTR                DBMS_XMLDOM.DOMATTR;
      V_MODEL               DBMS_XMLDOM.DOMELEMENT;
      V_TYPE_DEFINITION     DBMS_XMLDOM.DOMELEMENT;
    begin
      V_STORAGE_MODEL := makeElement(P_COMPLEX_TYPE_NAME);
      V_DOCUMENT  := DBMS_XMLDOM.NEWDOMDOCUMENT(V_STORAGE_MODEL);
      V_ROOT      := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_DOCUMENT);
      V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLType');
                     DBMS_XMLDOM.SETVALUE(V_ATTR,P_TYPE_NAME);
      V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
      V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLTypeOwner');
                     DBMS_XMLDOM.SETVALUE(V_ATTR,P_TYPE_OWNER);
      V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
      V_TYPE_DEFINITION   := DBMS_XMLDOM.GETDOCUMENTELEMENT(DBMS_XMLDOM.NEWDOMDOCUMENT(findStorageModel(P_TYPE_NAME, P_TYPE_OWNER, 'YES')));
      V_TYPE_DEFINITION   := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION),TRUE));
      V_TYPE_DEFINITION   := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION)));
      V_ATTR      := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'columns');
                     DBMS_XMLDOM.SETVALUE(V_ATTR,DBMS_XMLDOM.GETATTRIBUTE(V_TYPE_DEFINITION,'columns'));
      V_ATTR      := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
      return  V_STORAGE_MODEL;
    end;
    function analyzeStorageModel(P_COMPLEX_TYPE_NAME VARCHAR2)
    return XMLTYPE
    -- Generate a map showing the number of columns required to persist an instance of the complex type.
    as
      pragma autonomous_transaction;
      V_SQLTYPE           VARCHAR2(128);
      V_SQLSCHEMA         VARCHAR2(32);
      V_RESULT            XMLType;
    begin
    G_DEPTH_COUNT := 0;
    select ct.XMLDATA.SQLTYPE, ct.XMLDATA.SQLSCHEMA
        into V_SQLTYPE, V_SQLSCHEMA
        from XDB.XDB$COMPLEX_TYPE ct, XDB.XDB$SCHEMA s
       where ct.XMLDATA.NAME = P_COMPLEX_TYPE_NAME
         and ref(s) = ct.XMLDATA.PARENT_SCHEMA
         and s.XMLDATA.SCHEMA_OWNER = USER;
      delete from XDBPM.XDBPM_STORAGE_MODEL_CACHE;
      -- delete from XDBPM.XDBPM_STORAGE_MODEL;
      V_RESULT := analyzeStorageModel(P_COMPLEX_TYPE_NAME,V_SQLTYPE,V_SQLSCHEMA);
      COMMIT;
      return V_RESULT;
    exception
      when no_data_found then
        -- dbms_output.put_line('Unable to find SQLType mapping for complexType : "' || USER || '"."' || P_COMPLEX_TYPE_NAME || '".' );
        return null;
      when others then
        raise;
    end;
    function analyzeSQLType(ATTR_NAME VARCHAR2, TARGET_TYPE_NAME VARCHAR2, TARGET_TYPE_OWNER VARCHAR2)
    return XMLType
    as
       ROOT_NODE_NAME   VARCHAR2(128);
       ATTR_DETAIL      XMLTYPE;
       XPATH_EXPRESSION VARCHAR2(129);
       CURSOR FIND_CHILD_ATTRS is
         select ATTR_NAME, ATTR_TYPE_OWNER, ATTR_TYPE_NAME, INHERITED
           from ALL_TYPE_ATTRS
          where OWNER = TARGET_TYPE_OWNER
            and TYPE_NAME = TARGET_TYPE_NAME
          order by ATTR_NO;       
       CHILD_ATTR  XMLTYPE;
       ATTR_COUNT NUMBER := 0;
       TEMP number;
       COLLECTION_TYPE_NAME  varchar2(256);
       COLLECTION_TYPE_OWNER varchar2(256);
    begin
      -- -- dbms_output.put_line('Processing Attribute ' || ATTR_NAME || ' of ' || TARGET_TYPE_OWNER || '.' || TARGET_TYPE_NAME );
      ATTR_DETAIL := makeElement(ATTR_NAME);
      XPATH_EXPRESSION := '/' || ATTR_DETAIL.GETROOTELEMENT();
      for ATTR in FIND_CHILD_ATTRS loop
        begin
          select ELEM_TYPE_NAME, ELEM_TYPE_OWNER
            into COLLECTION_TYPE_NAME, COLLECTION_TYPE_OWNER
            from ALL_COLL_TYPES
           where TYPE_NAME = ATTR.ATTR_TYPE_NAME
             and OWNER = ATTR.ATTR_TYPE_OWNER;
          CHILD_ATTR := analyzeSQLType(ATTR.ATTR_NAME, COLLECTION_TYPE_NAME, COLLECTION_TYPE_OWNER );
          ATTR_COUNT := ATTR_COUNT + CHILD_ATTR.extract('/' || CHILD_ATTR.GETROOTELEMENT()  || '/@sqlAttrs').getNumberVal();
          select appendChildXML(ATTR_DETAIL,XPATH_EXPRESSION,CHILD_ATTR)
            into ATTR_DETAIL
            from DUAL;
        exception
          when no_data_found then
            begin
              select 1
                into TEMP
                from ALL_TYPES
               where TYPE_NAME = ATTR.ATTR_TYPE_NAME
                and OWNER = ATTR.ATTR_TYPE_OWNER;
              CHILD_ATTR := analyzeSQLType(ATTR.ATTR_NAME, ATTR.ATTR_TYPE_NAME, ATTR.ATTR_TYPE_OWNER );
              ATTR_COUNT := ATTR_COUNT + CHILD_ATTR.extract('/' || CHILD_ATTR.GETROOTELEMENT() || '/@sqlAttrs').getNumberVal();
              select appendChildXML(ATTR_DETAIL,XPATH_EXPRESSION,CHILD_ATTR)
                into ATTR_DETAIL
                from DUAL;
            exception
             when no_data_found then
               ATTR_COUNT := ATTR_COUNT + 1;
            end;
        end;
      end loop;
      select insertChildXML(ATTR_DETAIL,XPATH_EXPRESSION,'@sqlAttrs',ATTR_COUNT)
        into ATTR_DETAIL
        from dual;
      return ATTR_DETAIL;
    end;
    function analyzeComplexType(COMPLEX_TYPE VARCHAR2)
    return XMLType
    as
      RESULT           xmltype;
      SQLTYPE          varchar2(128);
      SQLTYPE_OWNER    varchar2(32);
    begin
      select SQLTYPE, SQLTYPE_OWNER
        into SQLTYPE, SQLTYPE_OWNER
        from USER_XML_SCHEMAS,
             xmlTable
                xmlnamespaces
                  'http://www.w3.org/2001/XMLSchema' as "xsd",
                  'http://xmlns.oracle.com/xdb' as "xdb"
                '/xsd:schema/xsd:complexType'
                passing Schema
                columns
                COMPLEX_TYPE_NAME varchar2(4000) path '@name',
                SQLTYPE           varchar2(128)  path '@xdb:SQLType',
                SQLTYPE_OWNER     varchar2(32)   path '@xdb:SQLSchema'
       where COMPLEX_TYPE_NAME = COMPLEX_TYPE;
      result := analyzeSQLType(COMPLEX_TYPE,SQLTYPE,SQLTYPE_OWNER);
      select insertChildXML(RESULT,'/' || COMPLEX_TYPE,'@SQLType',SQLTYPE)
        into result
        from dual;
      return result;
    end;
    function showSQLTypes(schemaFolder varchar2) return XMLType
    is
      xmlSchema XMLTYPE;
    begin
      select xmlElement                                 
               "TypeList",                              
               xmlAgg                                   
                  xmlElement                             
                    "Schema",                            
                    xmlElement
                      "ResourceName",
                      extractValue(res,'/Resource/DisplayName')
                    xmlElement                         
                      "complexTypes",                  
                        select xmlAgg                               
                                 xmlElement              
                                   "complexType",        
                                   xmlElement           
                                     "name",             
                                     extractValue(value(XML),'/xsd:complexType/@name',XDB_NAMESPACES.XDBSCHEMA_PREFIXES)                          
                                   xmlElement            
                                     "SQLType",          
                                     extractValue(value(XML),'/xsd:complexType/@xdb:SQLType',XDB_NAMESPACES.XDBSCHEMA_PREFIXES)                            
                          from table                   
                                 xmlsequence           
                                   extract             
                                     xdburitype(p.path).getXML(),
                                     '/xsd:schema/xsd:complexType',
                                     XDB_NAMESPACES.XDBSCHEMA_PREFIXES
                               ) xml
                          -- order by extractValue(value(XML),'/xsd:complexType/@name',XDB_NAMESPACES.XDBSCHEMA_PREFIXES)
              ).extract('/*')                            
         into xmlSchema
         from path_view p                                
        where under_path(res,schemaFolder) = 1      
        order by extractValue(res,'/Resource/DisplayName');
      return xmlSchema;
    end;
    procedure renameCollectionTable (XMLTABLE varchar2, XPATH varchar2, COLLECTION_TABLE_PREFIX varchar2)
    as
       SYSTEM_GENERATED_NAME varchar2(256);
       COLLECTION_TABLE_NAME varchar2(256);
       CLUSTERED_INDEX_NAME  varchar2(256);
       PARENT_INDEX_NAME     varchar2(256);
       RENAME_STATEMENT varchar2(4000);
    begin
       COLLECTION_TABLE_NAME := COLLECTION_TABLE_PREFIX || '_TABLE';
       CLUSTERED_INDEX_NAME := COLLECTION_TABLE_PREFIX || '_DATA';
       PARENT_INDEX_NAME := COLLECTION_TABLE_PREFIX || '_LIST';
       select TABLE_NAME
         into SYSTEM_GENERATED_NAME
         from ALL_NESTED_TABLES
        where PARENT_TABLE_NAME = XMLTABLE
          and PARENT_TABLE_COLUMN = XPATH
          and OWNER = USER;
       RENAME_STATEMENT := 'alter table ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' ||COLLECTION_TABLE_NAME || '"';
       -- -- dbms_output.put_line(RENAME_STATEMENT);
       execute immediate RENAME_STATEMENT;
       begin
         select INDEX_NAME
           into SYSTEM_GENERATED_NAME
           from ALL_INDEXES
          where TABLE_NAME = COLLECTION_TABLE_NAME
            and INDEX_TYPE = 'IOT - TOP'
            and OWNER = USER;
         RENAME_STATEMENT := 'alter index ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' || CLUSTERED_INDEX_NAME || '"';
         -- -- dbms_output.put_line(RENAME_STATEMENT);
         execute immediate RENAME_STATEMENT;
       exception
         when NO_DATA_FOUND then
           null;
       end;
       begin
         select INDEX_NAME
           into SYSTEM_GENERATED_NAME
           from ALL_IND_columns
          where COLUMN_NAME = XPATH
            and TABLE_NAME =  XMLTABLE
            and TABLE_OWNER = USER;
         RENAME_STATEMENT := 'alter index ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' || PARENT_INDEX_NAME || '"';
         -- -- dbms_output.put_line(RENAME_STATEMENT);
         execute immediate RENAME_STATEMENT;
       exception
         when NO_DATA_FOUND then
           null;
       end;
    end;
    function processNestedTable(currentLevel in out number, currentNode in out XMLType, query SYS_REFCURSOR)
    return XMLType
    is
      thisLevel  number;
      thisNode   xmlType;
      result xmlType;
    begin
      thisLevel := currentLevel;
      thisNode := currentNode;
      fetch query into currentLevel, currentNode;
      if (query%NOTFOUND) then
        currentLevel := -1;
      end if;
      while (currentLevel >= thisLevel) loop
        -- Next Node is a decendant of sibling of this Node.
        if (currentLevel > thisLevel) then
          -- Next Node is a decendant of this Node.
          result := processNestedTable(currentLevel, currentNode, query);
          select xmlElement
                    "Collection",
                    extract(thisNode,'/Collection/*'),
                    xmlElement
                      "NestedCollections",
                      result
             into thisNode
             from dual;
        else
          -- Next node is a sibling of this Node.
          result := processNestedTable(currentLevel, currentNode, query);
          select xmlconcat(thisNode,result) into thisNode from dual;
        end if;
      end loop;
      -- Next Node is a sibling of some ancestor of this node.
      return thisNode;
    end;
    function printNestedTables(XML_TABLE varchar2)
    return XMLType
    is
       query SYS_REFCURSOR;
       result XMLType;
       rootLevel number := 0;
       rootNode xmlType;
    begin
       open query for
            select level, xmlElement
                            "Collection",
                            xmlElement
                              "CollectionId",
                              PARENT_TABLE_COLUMN
                          ) as XML
              from USER_NESTED_TABLES
           connect by PRIOR TABLE_NAME = PARENT_TABLE_NAME
                   start with PARENT_TABLE_NAME = XML_TABLE;
        fetch query into rootLevel, rootNode;
        result := processNestedTable(rootLevel, rootNode, query);
        select xmlElement
                  "NestedTableStructure",
                  result
          into result
          from dual;
        return result;
    end;
    function generateSchemaFromTable(P_TABLE_NAME varchar2, P_OWNER varchar2 default USER)
    return XMLTYPE
    as
      xmlSchema XMLTYPE;
    begin
      select xmlElement
               "xsd:schema",
               xmlAttributes
                 'http://www.w3.org/2001/XMLSchema' as "xmlns:xsd",
                 'http://xmlns.oracle.com/xdb' as "xmlns:xdb"
               xmlElement
                 "xsd:element",
                 xmlAttributes
                   'ROWSET' as "name",
                   'rowset' as "type"
               xmlElement
                 "xsd:complexType",
                 xmlAttributes
                   'rowset' as "name"
                 xmlElement
                   "xsd:sequence",
                   xmlElement
                      "xsd:element",
                      xmlAttributes
                        'ROW' as "name",
                        table_name || '_T' as "type",
                        'unbounded' as "maxOccurs"
               xmlElement
                 "xsd:complexType",
                 xmlAttributes
                   table_name || '_T' as "name"
                 xmlElement
                   "xsd:sequence",
                     xmlAgg(ELEMENT order by INTERNAL_COLUMN_ID)
        into xmlSchema
        from (select TABLE_NAME, INTERNAL_COLUMN_ID,
                     case
                       when DATA_TYPE in ('VARCHAR2','CHAR') then
                         xmlElement
                           "xsd:element",
                           xmlattributes
                             column_name as "name",
                             decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
                             column_name as "xdb:SQLName",
                             DATA_TYPE as "xdb:SQLType"
                           xmlElement
                             "xsd:simpleType",
                             xmlElement
                               "xsd:restriction",
                               xmlAttributes
                                 'xsd:string' as "base"
                               xmlElement
                                 "xsd:maxLength",
                                 xmlAttributes
                                   DATA_LENGTH  as "value"
                       when DATA_TYPE = 'NUMBER' then
                         xmlElement
                           "xsd:element",
                           xmlattributes
                             column_name as "name",
                             decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
                             column_name as "xdb:SQLName",
                             DATA_TYPE as "xdb:SQLType"
                           xmlElement
                             "xsd:simpleType",
                             xmlElement
                               "xsd:restriction",
                               xmlAttributes
                                  decode(DATA_SCALE, 0, 'xsd:integer', 'xsd:double') as "base"
                               xmlElement
                                 "xsd:totalDigits",
                                 xmlAttributes
                                   DATA_PRECISION  as "value"
                       when DATA_TYPE = 'DATE' then
                         xmlElement
                           "xsd:element",
                           xmlattributes
                             column_name as "name",
                             decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
                             'xsd:date' as "type",
                             column_name as "xdb:SQLName",
                             DATA_TYPE as "xdb:SQLType"
                       when DATA_TYPE like 'TIMESTAMP%WITH TIME ZONE' then
                         xmlElement
                           "xsd:element",
                           xmlattributes
                             column_name as "name",
                             decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
                             'xsd:dateTime' as "type",
                             column_name as "xdb:SQLName",
                             DATA_TYPE as "xdb:SQLType"
                       else
                         xmlElement
                           "xsd:element",
                           xmlattributes
                             column_name as "name",
                             decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
                             'xsd:anySimpleType' as "type",
                             column_name as "xdb:SQLName",
                             DATA_TYPE as "xdb:SQLType"
                     end ELEMENT
                from all_tab_cols c
               where c.TABLE_NAME = P_TABLE_NAME
                 and c.OWNER = P_OWNER
        group by TABLE_NAME;
      return xmlSchema;
    end;
    function appendElementList(V_ELEMENT_LIST IN OUT XDB.XDB$XMLTYPE_REF_LIST_T, V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
    function expandModel(P_MODEL XDB.XDB$MODEL_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
    function expandChoiceList(P_CHOICE_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
    function expandSequenceList(P_SEQUENCE_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
    function expandGroupList(P_GROUP_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
    function appendElementList(V_ELEMENT_LIST IN OUT XDB.XDB$XMLTYPE_REF_LIST_T, V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
    return XDB.XDB$XMLTYPE_REF_LIST_T
    as
    begin
      SELECT CAST
               SET
                 CAST(V_ELEMENT_LIST as XDBPM.XMLTYPE_REF_TABLE_T)
                 MULTISET UNION
                 CAST(V_CHILD_ELEMENT_LIST as XDBPM.XMLTYPE_REF_TABLE_T)
               as XDB.XDB$XMLTYPE_REF_LIST_T
        into V_ELEMENT_LIST
        from DUAL;
        return V_ELEMENT_LIST;     
    end;
    function expandModel(P_MODEL XDB.XDB$MODEL_T)
    return XDB.XDB$XMLTYPE_REF_LIST_T
    as
      V_ELEMENT_LIST       XDB.XDB$XMLTYPE_REF_LIST_T;
      V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
    begin
      V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
      if P_MODEL.ELEMENTS is not null then
        V_ELEMENT_LIST := P_MODEL.ELEMENTS;
      end if;
      if (P_MODEL.CHOICE_KIDS is not NULL) then
        V_CHILD_ELEMENT_LIST := expandChoiceList(P_MODEL.CHOICE_KIDS);
        V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
      end if;
      if (P_MODEL.SEQUENCE_KIDS is not NULL) then
        V_CHILD_ELEMENT_LIST := expandSequenceList(P_MODEL.SEQUENCE_KIDS);
        V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
      end if;
      -- Process ANYS
      if (P_MODEL.GROUPS is not NULL) then
        V_CHILD_ELEMENT_LIST := expandGroupList(P_MODEL.GROUPS);
        V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
      end if;
      return V_ELEMENT_LIST;
    end;
    function expandChoiceList(P_CHOICE_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
    return XDB.XDB$XMLTYPE_REF_LIST_T
    as
      V_ELEMENT_LIST       XDB.XDB$XMLTYPE_REF_LIST_T;
      V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
      cursor getChoices is
      select c.XMLDATA MODEL
        from XDB.XDB$CHOICE_MODEL c, TABLE(P_CHOICE_LIST) cl
       where ref(c) = value(cl);
    begin
      V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
      for c in getChoices loop
        V_CHILD_ELEMENT_LIST := expandModel(c.MODEL);
        V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
      end loop;
      return V_ELEMENT_LIST;
    end;
    function expandSequenceList(P_SEQUENCE_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
    return XDB.XDB$XMLTYPE_REF_LIST_T
    as
      V_ELEMENT_LIST       XDB.XDB$XMLTYPE_REF_LIST_T;
      V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
      cursor getSequences is
      select s.XMLDATA MODEL
        from XDB.XDB$SEQUENCE_MODEL s, TABLE(P_SEQUENCE_LIST) sl
       where ref(s) = value(sl);
    begin
      V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
      for s in getSequences loop
        V_CHILD_ELEMENT_LIST := expandModel(s.MODEL);
        V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
      end loop;
      return V_ELEMENT_LIST;
    end;
    function expandGroupList(P_GROUP_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
    return XDB.XDB$XMLTYPE_REF_LIST_T
    as
      V_ELEMENT_LIST       XDB.XDB$XMLTYPE_REF_LIST_T;
      V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;  V_MODEL  XDB.XDB$MODEL_T;
      cursor getGroups is
      SELECT CASE
               -- Return The MODEL Definition for the CHOICE, ALL or SEQUENCE
               WHEN gd.XMLDATA.ALL_KID is not NULL
                 THEN ( SELECT a.XMLDATA  from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
               WHEN gd.XMLDATA.SEQUENCE_KID is not NULL
                 THEN ( SELECT s.XMLDATA  from XDB.XDB$SEQUENCE_MODEL s where ref(s) = gd.XMLDATA.SEQUENCE_KID)
               WHEN gd.XMLDATA.CHOICE_KID is not NULL
                 THEN ( SELECT c.XMLDATA  from XDB.XDB$CHOICE_MODEL c where ref(c) = gd.XMLDATA.CHOICE_KID)
              END MODEL
         FROM XDB.XDB$GROUP_DEF gd, XDB.XDB$GROUP_REF gr, TABLE(P_GROUP_LIST) gl
        WHERE ref(gd) = gr.XMLDATA.GROUPREF_REF
          and ref(gr) = value(gl);
    begin
      V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
      for g in getGroups loop
        V_CHILD_ELEMENT_LIST := expandModel(g.MODEL);
        V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
      end loop;
      return V_ELEMENT_LIST;
    end;
    function getComplexTypeElementList(P_COMPLEX_TYPE_REF REF XMLTYPE)
    return XDB.XDB$XMLTYPE_REF_LIST_T
    as
      V_MODEL        XDB.XDB$MODEL_T;
      V_BASE_TYPE    REF XMLTYPE;
      V_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T := XDB.XDB$XMLTYPE_REF_LIST_T();
    begin
      SELECT ct.XMLDATA.BASE_TYPE,
             CASE
               -- Return The MODEL Definition for the CHOICE, ALL or SEQUENCE
               WHEN ct.XMLDATA.ALL_KID is not NULL
                 THEN ( SELECT a.XMLDATA  from XDB.XDB$ALL_MODEL a where ref(a) = ct.XMLDATA.ALL_KID)
               WHEN ct.XMLDATA.SEQUENCE_KID is not NULL
                 THEN ( SELECT s.XMLDATA  from XDB.XDB$SEQUENCE_MODEL s where ref(s) = ct.XMLDATA.SEQUENCE_KID)
               WHEN ct.XMLDATA.CHOICE_KID is not NULL
                 THEN ( SELECT c.XMLDATA  from XDB.XDB$CHOICE_MODEL c where ref(c) = ct.XMLDATA.CHOICE_KID)
               WHEN ct.XMLDATA.GROUP_KID is not NULL
                 -- COMPLEXTYPE is based on a GROUP.
                 THEN (
                         -- RETURN The CHOICE, ALL or SEQUENCE for GROUP
                         SELECT CASE
                                  WHEN gd.XMLDATA.ALL_KID is not NULL
                                    THEN ( SELECT a.XMLDATA  from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
                                  WHEN gd.XMLDATA.SEQUENCE_KID is not NULL
                                    THEN ( SELECT s.XMLDATA  from XDB.XDB$SEQUENCE_MODEL s where ref(s) = gd.XMLDATA.SEQUENCE_KID)
                                  WHEN gd.XMLDATA.CHOICE_KID is not NULL
                                    THEN ( SELECT c.XMLDATA  from XDB.XDB$CHOICE_MODEL c where ref(c) = gd.XMLDATA.CHOICE_KID)
                                  END
                             FROM XDB.XDB$GROUP_DEF gd, xdb.xdb$GROUP_REF gr
                            WHERE ref(gd) = gr.XMLDATA.GROUPREF_REF
                              and ref(gr) = ct.XMLDATA.GROUP_KID
    --           WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.ALL_KID is not NULL
    --             THEN ( SELECT a.XMLDATA  from XDB.XDB$ALL_MODEL a where ref(a) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.ALL_KID)
    --           WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.SEQUENCE_KID is not NULL
    --            THEN ( SELECT s.XMLDATA  from XDB.XDB$SEQUENCE_MODEL s where ref(s) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.SEQUENCE_KID)
    --           WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.CHOICE_KID is not NULL
    --             THEN ( SELECT c.XMLDATA  from XDB.XDB$CHOICE_MODEL c where ref(c) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.CHOICE_KID)
    --           WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.GROUP_KID is not NULL
    --             -- COMPLEXTYPE is based on a GROUP.
    --             THEN (
    --                     -- RETURN The CHOICE, ALL or SEQUENCE for GROUP
    --                     SELECT CASE
    --                              WHEN gd.XMLDATA.ALL_KID is not NULL
    --                                THEN ( SELECT a.XMLDATA  from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
    --                              WHEN gd.XMLDATA.SEQUENCE_KID is not NULL
    --                                THEN ( SELECT s.XMLDATA  from XDB.XDB$SEQUENCE_MODEL s where ref(s) = gd.XMLDATA.SEQUENCE_KID)
    --                              WHEN gd.XMLDATA.CHOICE_KID is not NULL
    --                                THEN ( SELECT c.XMLDATA  from XDB.XDB$CHOICE_MODEL c where ref(c) = gd.XMLDATA.CHOICE_KID)
    --                              END
    --                         FROM XDB.XDB$GROUP_DEF gd, xdb.xdb$GROUP_REF gr
    --                       WHERE ref(gd) = gr.XMLDATA.GROUPREF_REF
    --                          and ref(gr) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.GROUP_KID
               WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.ALL_KID is not NULL
                 THEN ( SELECT a.XMLDATA  from XDB.XDB$ALL_MODEL a where ref(a) = ct.XMLDATA.COMPLEXCONTENT.EXTENSION.ALL_KID)
               WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.SEQUENCE_KID is not NULL
                 THEN ( SELECT s.XMLDATA  from XDB.XDB$SEQUENCE_MODEL s where ref(s) = ct.XMLDATA.COMPLEXCONTENT.EXTENSION.SEQUENCE_KID)
               WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.CHOICE_KID is not NULL
                 THEN ( SELECT c.XMLDATA  from XDB.XDB$CHOICE_MODEL c where ref(c) = ct.XMLDATA.COMPLEXCONTENT.EXTENSION.CHOICE_KID)
               WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.GROUP_KID is not NULL
                 -- COMPLEXTYPE is based on a GROUP.
                 THEN (
                         -- RETURN The CHOICE, ALL or SEQUENCE for GROUP
                         SELECT CASE
                                  WHEN gd.XMLDATA.ALL_KID is not NULL
                                    THEN ( SELECT a.XMLDATA  from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
                    

  • What is the simplest  way to get a xml-file from 10g R2 -database ?

    Hi,
    I'm new in xml, there are so many tools to work with xml:
    what is the simplest way to get a xml-file from 10g R2 -database ?
    I have : 10g R2 and a xsd.file to describe the xml-structure
    thank you
    Norbert

    There is no automatic way to generate XML documents from an arbitary set of relational tables using the information contained in an XML Schema. Typically the easiest way to generate XML from relational data is to use the SQL/XML operators (XMLElement, XMLAGG, XMLAttribtues, XMLForest). There are many examples of using these operators in the forums You can validate the generated XML against the XML Schema by registering the XML Schema with XML DB and then using the XMLType.SchemaValidate() method

Maybe you are looking for

  • Error invoking web service

    I have a batch job consisting of POJOs. This job consumes a Web Service, the client for which has been generated using Axis 1.3. The web service call is made for each record in the batch. I am getting the below error after the job has run for a while

  • Has anyone figured this out yet?.

    have searched the forums and still cannot find the answer... i have imported so far about 12 of my old 8mil to IM08. am running out of space on my external firewire hd, so want to get rid of some rejected clips in my events. so...i mark the rejects..

  • Adding an entity with a COA that is not compatible with the existing one

    Hi guys, I'm facing quite a challenge right now. I'm working in a client who sells car, so they have several stores that consolidate in one parent. The current application has more than 5000 accounts (BS and P&L). They also have a bank who was left o

  • Cannot upgrade ACS 5.1.0.44 to 5.1.0.44.X

    I have a licensed ACS version 5.1.0.44 (VM image) installed and working. I am trying to upgrade to the latest version but I keep getting the following error: ciscoacs/admin# patch install 5-1-0-44-6.tar.gpg upgrade Do you want to save the current con

  • Communications Express

    I've installed the entire Sun Java enterprise suite on a single win 2003 server. Everything seems to work except Communications Express. When I attempt to log in at servername/uwc I get redirected to System Messenger express. When I attempt to log in